SIMULASI PERGERAKAN SOLUT MELALUI PENDEKATAN LANGKAH ACAK (RANDOM WALK)
Oleh: Firman Mulya Nugraha A24103022
PROGRAM STUDI ILMU TANAH FAKULTAS PERTANIAN INSTITUT PERTANIAN BOGOR 2010
SIMULASI PERGERAKAN SOLUT MELALUI PENDEKATAN LANGKAH ACAK (RANDOM WALK)
Oleh: Firman Mulya Nugraha A24103022
Skripsi sebagai salah satu syarat untuk memperoleh gelar Sarjana Pertanian pada Departemen Ilmu Tanah dan Sumberdaya Lahan
PROGRAM STUDI ILMU TANAH FAKULTAS PERTANIAN INSTITUT PERTANIAN BOGOR 2010
RINGKASAN Firman Mulya Nugraha. Simulasi Pergerakan Solut dengan Pendekatan Langkah Acak (dibimbing oleh Wahyu Purwakusuma dan Kukuh Murtilaksono). Pemahaman tentang pergerakan solut di dalam tanah sangat penting dalam mengelola berbagai masalah di bidang pertanian. Salah satu tantangan yang paling penting di dalam ilmu tanah dan hidrologi adalah bagaimana membuat suatu model dan simulasi yang akurat dari pergerakan solut di media berpori seperti tanah. Simulasi dan model ini dapat dibuat dengan model pergerakan solut melalui pendekatan langkah acak (random walk) yang diturunkan dari formula CDE (convection-dispersion equation). Tujuan dari penelitian adalah untuk memodelkan dan mensimulasikan pergerakan solut yang diharapkan akan memberikan manfaat dan akan mempermudah dalam mempelajari dampak dan pengaruh dari pergerakan solut di dalam tanah. Pada penelitian ini, pergerakan solut diasumsikan dalam keadaan miscible displacement. Media yang digunakan dalam keadaan jenuh yang dialiri larutan air yang stabil dengan aliran kecepatan dan kandungan air konstan. Pengaruhpengaruh lainnya seperti jerapan dan serapan dianggap tidak ada. Data percobaan yang digunakan diturunkan dari data disertasi Wang (2002) untuk bahan perbandingan. Hasil yang didapatkan dari perbandingan nilai konsentrasi relatif model dengan nilai konsentrasi relatif data yang diuji menggunakan koefisien deterministik mendapatkan nilai 0.84. Nilai koefisien deterministik 0.84 menunjukan konsentrasi model dapat menggambarkan konsentrasi relatif data, serta terdapat hubungan yang erat antara konsentrasi data dan konsentrasi relatif model. Dengan demikian model langkah acak yang diturunkan dari formula CDE cukup baik untuk menduga hasil dari konsentrasi relatif data.
Kata kunci : solut, langkah acak, simulasi, miscible displacement.
SUMMARY Firman Mulya Nugraha. Solut Movement Simulation with Random Step Approach (supervised by Wahyu Purwakusuma dan Kukuh Murtilaksono). Understanding of solut movement in the soil is very important in managing various problems in agriculture. One of the most important challenges in soil science and hydrology is to make an accurate model and simulation of solut movement in porous media such as soil. The simulation and model can be made through solut movement model with random walk approach which is derived from the CDE (Convection-dispersion equation). The purpose of this study is to make model and simulate the movement of solut, which is expected to provide benefits and facilitate the study of the impact and influence of the solute movement in the soil. In this study, solut movement is assumed to be in the miscible displacement condition. Media in used is in saturated state condition carrying a stable water solution, a constant flow rate and water content. Other influences such as sorption and absorption is considered to have no any effect. The experimental data was derived from the dissertation of Wang (2002) for comparative material. The comparison of the relative concentration value of the model againts the relative concentration value of data has a deterministic coefficient of 0.84. Coefficient value of 0.84 shows that the concentration of the models can describe the relative concentration of data, and there is a close relationship between the concentration of data and the relative concentration of the model. Hence the random step model derived from the formula CDE is good enough to predict the result of the relative concentration data. Keywords : solut, random walk, simulation, miscible displacement.
Judul : Simulasi Pergerakan Solut Melalui Pendekatan Langkah Acak (Random Walk) Nama : Firman Mulya Nugraha NRP
: A24103022
Disetujui,
Pembimbing I
Pembimbing II
Ir. Wahyu Purwakusuma, MSc. NIP: 19610122 198703 1 002
Dr. Ir. Kukuh Murtilaksono, MS. NIP: 19600808 198903 1 003
Mengetahui, Dekan Fakultas Pertanian IPB
Prof. Dr. Ir. Didy Sopandie, M. Agr NIP: 19571222 198203 1 002
Tanggal Lulus:
RIWAYAT HIDUP Penulis dilahirkan di Bogor, Jawa Barat pada tanggal 04 Juni 1985, yang merupakan anak ke 1 dari 3 bersaudara pasangan Ir. Jajang Suryana, M.Sc dan Enung Kusnaeni. Penulis memulai pendidikan di SDN 1 Gunung Batu pada tahun 1991 dan pada tahun 1997 melanjutkan ke SLTPN 4 Bogor. Tahun 2000 penulis melanjutkan pendidikan di SMUN 5 Bogor dan lulus pada tahun 2003. Pada tahun 2003 penulis menjadi mahasiswa Institut Pertanian Bogor melalui jalur Undangan Seleksi Masuk IPB (USMI) ke Departemen Ilmu Tanah, Fakultas Pertanian, IPB. Sebagai salah satu syarat untuk memperoleh gelar sarjana pertanian penulis melakukan penelitian dengan judul “Simulasi Pergerakan Solut melalui Pendekatan Langkah Acak” di bawah bimbingan Ir. Wahyu Purwakusuma, M.Sc dan Dr. Ir. Kukuh Murtilaksono, MS. Selama mengikuti pendidikan di Institut Pertanian Bogor penulis pernah menjadi asisten praktikum mata kuliah Hidrologi Tanah pada tahun 2007, 2008, dan 2009.
KATA PENGANTAR Puji dan syukur kehadirat Allah SWT berkat rahmat dan hidayah-Nya penulis dapat menyelesaikan penelitian dan penulisan skripsi ini dengan baik. Penulis menyampaikan rasa hormat dan terima kasih yang sebesarbesarnya kepada Ir. Wahyu Purwakusuma, MSc. selaku pembimbing I dan Dr. Ir. Kukuh Murtilaksono, MS selaku pembimbing II atas bantuan, bimbingan, nasehat dan masukan-masukan yang menambah pengetahuan penulis serta Dr. Ir. Eni Dwi Wahjuni, MS selaku dosen penguji. Pada kesempatan ini juga penulis ingin menyampaikan terima kasih kepada: Bapak, ibu dan adik-adik saya beserta seluruh keluarga dimanapun berada, terima kasih yang tak terhingga atas kesabaran, kasih sayang dan dukungannya. Seluruh dosen yang telah memberikan ilmunya selama penulis menempuh pendidikan S1 dan staf Departemen Ilmu Tanah dan Sumberdaya Lahan, Fakultas pertanian, IPB. Seluruh teman –teman soil IPB khususnya angkatan 40. Semua pihak yang tidak dapat disebutkan satu-persatu, yang telah ikut serta membantu demi kelancaran penelitian dan penulisan skripsi ini. Dengan keterbatasan yang ada semoga skripsi ini dapat bermanfaat bagi semua pihak.
Bogor, Januari 2010
Penulis
DAFTAR ISI Halaman DAFTAR TABEL .................................................................................................. ix DAFTAR GAMBAR ...............................................................................................x I. PENDAHULUAN ...............................................................................................1 1.1. Latar Belakang ......................................................................................... 1 1.2. Tujuan ....................................................................................................... 2 1.3. Hipotesis ................................................................................................... 2 II. TINJAUAN PUSTAKA ......................................................................................3 2.1. Random Walk (Langkah/Pergerakan Acak) ............................................... 3 2.2. Pergerakan Solut ........................................................................................ 4 2.3. Miscible Displacement ............................................................................... 6 2.4. Kurva Breakthrough................................................................................... 7 2.5. Simulasi ...................................................................................................... 8 2.6. Bahasa Pemograman C++ .......................................................................... 9 2.6.1. Perkenalan dan Gambaran Bahasa C++ .......................................... 9 2.6.2. Rancangan dan Evolusi dari C++.................................................... 9 2.6.3. Tujuan Dari Perancangan C++ ...................................................... 10 III. BAHAN DAN METODE ................................................................................11 3.1. Waktu dan Tempat Penelitian ................................................................. 11 3.2. Bahan dan Alat ........................................................................................ 11 3.3. Metode Penelitian.................................................................................... 11 3.3.1. Metode Penelitian dari Data Skunder .......................................... 11 3.3.2. Metode Penentuan Konsentrasi Solut Model ............................... 13 3.3.3. Metode Pengujian Model dengan Data ........................................ 15 IV. HASIL DAN PEMBAHASAN .......................................................................16 4.1. Langkah Acak Dalam Solut ................................................................... 16 4.2. Algoritma Formula CDE dan Turunannya dalam simulasi ................... 17 4.3. Algoritma Langkah Acak dalam Simulasi Pergerakan Solut ................. 18 4.4. Algoritma Pergerakan Partikel ............................................................... 19 4.5. Perbandingan dari Model dengan Data .................................................. 22 4.6. Hasil dari Pergerakan Simulasi .............................................................. 24 4.7. Hasil dari Pergerakan Solut di Kolom Pasir .......................................... 24
V. KESIMPULAN DAN SARAN ........................................................................25 5.1. Kesimpulan ............................................................................................. 25 5.2. Saran ........................................................................................................ 25 DAFTAR PUSTAKA ............................................................................................26 LAMPIRAN ...........................................................................................................28
viii
DAFTAR TABEL No.
Halaman Teks
1. Nilai kosentrasi solut data dan model ...............................................................23
Lampiran 1. Source Code Penghitungan Nilai Konsentrasi Model.......................................29 2. Source Code Simulasi Pergerakan Solut dalam C++ ........................................32 3. Hasil nilai konsentrasi model terhadap waktu ..................................................41 4. Hasil nilai konsentrasi data terhadap waktu ......................................................42
ix
DAFTAR GAMBAR No.
Halaman Teks
1. Grafik hasil dari injeksi yang dilakukan secara terus-menerus...........................6 2. Grafik hasil dari injeksi yang dilakukan sekali antara ........................................6 3. Skema dari sistem laboratorium kolom yang dikembangkan untuk melaksanakan eksperiment miscible displacement (Wang, 2004). ...................11 4. Algoritma pergerakan partikel pada simulasi ...................................................19 5. Konsep skematik yang berkontribusi terhadap dispersi mekanik (Leij & Martinus, 2002). ....................................................................21 6. Perbandingan konsentrasi relatif data dengan konsentrasi model ....................22
x
I. PENDAHULUAN 1.1. Latar Belakang
Kejadian-kejadian di alam semesta ini banyak memperlihatkan fenomena yang terjadi secara acak. Dalam berbagai bidang ilmu fenomena ini dikenal sebagai random walk. Model random walk atau langkah acak sangat bermanfaat di berbagai bidang mulai dari ilmu fisika hingga sosial. Beberapa aplikasi dimana model langkah acak dimanfaatkan diantaranya adalah : Ekonomi: pemodelan harga saham. Populasi genetika: analisis pergeseran genetik. Ekologi matematika: pemodelan posisi makan hewan. Perang Dunia II: pembuatan model pergerakan tahanan yang kabur. Penelitian otak: pembuatan model penembakan neuron di dalam otak manusia dan membantu dalam memahami epilepsi. Mesin Pencari di Internet: Google menggunakan model langkah acak dalam mesin pencariannya untuk menyediakan hasil pencarian yang paling relevan. Model langkah acak juga digunakan untuk menunjukan bagaimana rangkaian acak bisa memperlihatkan hubungan ketika pada kenyataanya mereka benar-benar acak. Kejadian langkah acak juga terjadi di dalam tanah, salah satu contohnya adalah pergerakan solut (pupuk dan pestisida) di tanah. Pergerakan solut di tanah tidak bergerak secara linear tetapi memperlihatkan suatu pergerakan yang acak, baik itu dari segi kecepatan, arah, konsentrasi, dan lain sebagainya. Hal tersebut dapat terjadi karena berbagai hal seperti pengaruh jenis tanah, konsentrasi solut, dispersivitas, porositas, waktu, jarak dan faktor-faktor yang lainnya. Aplikasi langkah acak dapat digunakan untuk memodelkan pergerakan solut sehingga akan mempermudah dalam mempelajari dampak dan pengaruh pergerakan solut di dalam tanah. Salah satu tantangan yang paling penting dalam ilmu tanah dan hidrologi adalah membuat suatu model dan simulasi yang akurat dari pergerakan solut di media berpori seperti tanah. Untuk itu dibuat simulasi dan model pergerakan solut melalui pendekatan langkah acak yang diturunkan dari formula CDE (convection-dispersion equation).
2 1.2. Tujuan Penelitian ini bertujuan mensimulasikan pergerakan solut yang terjadi di dalam tanah melalui pendekatan langkah acak yang diturunkan dari formula CDE (convection-dispersion equation) sehingga diharapkan bisa menggambarkan dan bahkan memprediksi kejadian-kejadian yang diakibatkan oleh pergerakan solut dalam keadaan miscible displacement.
1.3. Hipotesis Data yang didapatkan dari formula CDE dengan penambahan model langkah acak akan menghasilkan kurva breakthrough. Hasil dari model yang dibuat akan mendekati data pengamatan.
II. TINJAUAN PUSTAKA 2.1. Random Walk (Langkah/Pergerakan Acak) Menurut Hughes (1995) dalam bidang Fisika, pengertian dari proses acak tumbuh dari percobaan untuk menjelaskan suatu proses komplek dalam skala mikroskopik dengan menggunakan persamaan statistik dari evolusi. Contoh yang nyata adalah gerak Brownian yang tidak menentu dari partikel debu atau serbuk biji-bijian di dalam larutan yang disebabkan tabrakan dengan molekul-molekul yang terlarut. Walaupun prosesnya deterministik (bersifat dapat ditentukan), tetapi pergerakan dari setiap partikel cukup tidak beraturan sehingga dianggap sebagai acak. Definisi dari langkah acak dapat dijelaskan secara sederhana sebagai suatu teori matematika dimana seorang pemabuk yang berjalan tanpa tujuan akan berakhir ditempat yang tidak tentu. Menurut Cortis dan Berkowitz (2004) dalam kerangka langkah acak, perpindahan kontaminan pada daerah
yang kecepatannya berubah-ubah
diperlihatkan sebagai partikel yang melakukan rangkaian langkah-langkah atau transisi melewati suatu formasi melalui jalan yang berbeda-beda dengan kecepatan yang berubah-ubah. Dalam pendekatan langkah acak, kepadatan dari larutan tracer didapatkan dengan mengikuti evolusi rangkaian random walk yang melakukan lompatan (tidak berkorelasi) pada jarak yang konstan pada arah acak dari suatu unit waktu (Cortis, 2008). Pergerakan solut dengan atau tanpa pengurangan/penambahan bisa juga dipecahkan secara langsung dengan cara memeriksa (tracking) partikel dalam jumlah besar yang bergerak melalui media berpori. Hal ini disebut metode particle tracking atau metode langkah acak. Dalam pendekatan ini, proses konveksi disimulasikan sebagai pergerakan dari partikel tersebut. Proses dispersi disimulasikan dengan memberikan langkah acak (random walk) terhadap partikel dalam setiap langkah waktu. Konversi awan partikel ke distribusi konsentrasi didapatkan dengan cara spatial discretization (pemisahan ruang) dan menghitung partikel dalam setiap sel (Wang, 2002). Langkah acak dapat di hasilkan dari distribusi normal dengan nilai tengah 0 dan standar deviasi 1 dimana D adalah koefesien dispersi dan ∆t adalah langkah waktu tersendiri (Kinzelbach, 1988 dalam Wang, 2002). Konsentrasi yang dihitung dengan distribusi yang
4 menggunakan metode langkah acak cenderung berfluktuasi terhadap waktu. Menambahkan jumlah dari partikel yang ditracking bisa mengurangi fluktuasi (Wang, 2002). Metode sederhana untuk menganalisis gabungan dari konveksi dan dispersi adalah dengan menggunakan model langkah acak untuk mensimulasikan pergerakan dispersi. Sebenarnya fungsi dari elemen acak dalam deskripsi pergerakan dispersi bisa dipertimbangkan
sebagai representatif dasar fisik
dispersi yang terjadi karena perbedaan karakter struktur media berpori (Bear, 1987). 2.2. Pergerakan Solut Menurut Lal dan Shukla (2004) dalam ekosistem pertanian, solut bisa dikategorikan sebagai dasar fungsi ekosistem tersebut (contoh: air, hara, pestisida, senyawa sampah, garam, kimia organik, besi, virus dan bacteria). Pengetahuan tentang pergerakan solut di tanah penting untuk manajemen berbagai masalah di bidang pertanian. Hal ini bisa menolong, ketika akan mengembangkan prosedur untuk memaksimalkan efektifitas penggunaan pestisida atau pupuk dan bahan kimia lain di zona akar serta meminimalkan pergerakannya ke air bawah tanah. Pengetahuan tentang proses ini sangat penting untuk mengerti tentang pergerakan kontaminan dari air hujan melalui leaching, ketersediaan dari solut untuk pengambilan oleh tanaman, aliran permukaan, intrusi garam, dan sisa bahan kimia. Pergerakan solut melalui matrik tanah terdiri dari tiga komponen utama yaitu : 1. Konveksi atau pergerakan massa, merupakan pergerakan pasif yang terbawa langsung oleh aliran air (Lal dan Shukla, 2004). 2. Difusi, adalah proses spontan dari pegerakan atau langkah acak ion dan molekul dalam larutan solut. Secara umum difusi adalah proses yang aktif (Lal dan Shukla, 2004). Difusi molekul atau ionik adalah mekanisme penting pergerakan solut di dalam tanah dimana terjadi dengan sedikit atau tanpa aliran air (Leij dan Martinus, 2002). Difusi disebabkan oleh energi mekanik molekul dan gerakan vibrasi, rotasi dan tranlasi. Difusi merupakan fenomena yang terjadi dengan sangat lambat (Boving, 2008).
5 3. Dispersi, merupakan proses yang pasif. Matrik tanah berisi pori dengan bentuk, ukuran dan orientasi yang berbeda. Heterogenitas dari struktur pori ini menyebabkan deviasi yang besar terhadap kecepatan air di dalam pori-pori (Lal dan Manoy, 2004). Variasi lokal dalam aliran air di media berpori akan menyebabkan dispersi mekanik (Leij dan Van Genuchten, 2002). Menurut Leij dan Van Genuchten (2002) beberapa mekanisme yang biasanya berkontribusi terhadap dispersi mekanik adalah (a) perkembangan kecepatan profil di dalam setiap pori yang sedemikian rupa yang menyebabkan kecepatan tertinggi terjadi di tengah pori dan kemungkinan kecil atau tidak ada aliran di dinding pori; (b) perbedaan kecepatan aliran rata-rata di pori yang berbeda ukuran. Partikel bergerak lebih cepat pada pori yang lebih besar dibanding yang kecil; (c) arah aliran air rata-rata tiap partikel di media berpori berbeda-beda dan (d) partikel solut ada yang berkumpul ke dan menyebar dari pori yang sama. Semua proses ini berkontribusi terhadap peningkatan penyebaran, yang pada mulanya konsentrasi awalnya tinggi menjadi lebih halus atau rendah selama pergerakan bersama dengan arah aliran utama. Menurut Boving (2008) cara untuk mengukur dipersivitas di laboratorium yaitu dengan menggunakan tes tracer di pipa atau kolom. Percobaan kolom dipilih dengan jumlah sample yang relatif kecil (contoh: material yang didapatkan dari daerah terkontaminasi atau contoh ketika pengeboroan sumur). Biasanya ukuran kolom adalah 5 sampai 50 cm panjang dengan diameter 2 sampai 10 cm. Total volume kolom dengan kisaran dari beberapa cm3 sampai beberapa liter. Material di dalam kolom secara umum homogen dan diupayakan sedemikian rupa untuk menghindari heterogenitas, seperti pemisahan ukuran butir pasir. Test untuk tracer dapat dilakukan dalam berbagai cara, tetapi yang paling banyak digunakan adalah 2 tipe, yaitu: 1. Injeksi secara terus-menerus dari cairan tracer ke kolom yang sudah terjenuhi dari awal. Grafik yang dihasilkan umumnya berbentuk seperti pada Gambar 1.
6
Gambar 1. Grafik hasil dari injeksi yang dilakukan secara terus-menerus antara konsentrasi vs jarak. 2. Injeksi dilakukan sekali dari cairan tracer ke kolom yang sudah terjenuhi dari awal. Grafik yang dihasilkan biasanya berbentuk seperti Gambar 2.
Gambar 2. Grafik hasil dari injeksi yang dilakukan sekali antara konsentrasi vs jarak. 2.3. Miscible Displacement Menurut Bhavarayana et al. (1982) miscible displacement memberikan penjelasan secara fisika tentang fenomena yang terjadi dalam proses leaching di tanah, pergerakan dari pupuk dan pestisida dan proses lain yang sama. Waktu dan
7 dalamnya pergerakan spesies tertentu pupuk dan pestisida bisa lebih baik di prediksi dengan menggunakan koefisien dispersi (D) yang ditentukan dari percobaan miscible displacement. Ketika suatu larutan (solut) melewati matrik tanah yang mengandung cairan lain di dalam ruang porinya, cairan yang dimasukan, disebut displacing liquid secara bertahap menggantikan cairan yang telah ada sebelumnya (displaced liquid). Analisis dari effluent yang dikumpulkan dari matrik tanah pada kedalaman yang ditentukan (atau dari kolom tanah) menunjukan perubahan komposisi cairan yang dikumpulkan terhadap waktu. Jika cairan yang menggantikan dan yang digantikan satu sama lain tidak dapat dilarutkan, prosesnya disebut “immiscible” displacement (contoh: minyak dengan air). Sebaliknya, jika kedua cairan dapat dilarutkan, prosesnya disebut “miscible” displacement (contoh: air dan gula). Menurut Bresler (1981) kebanyakan fenomena miscible displacement di tanah terbatas pada aliran air yang stabil dengan kecepatan aliran dan kandungan air konstan. Hal ini merupakan suatu cara untuk menentukan hydrodynamic dispersion
coefisien,
mengevaluasi
aliran
kecepatan
makroskopik
dan
memberikan penjelasan secara fisik tentang berbagai fenomena yang terjadi ketika garam mengalir melalui tanah. Selanjutnya menurut Alvarez-Benedi (2005) eksperimen miscible displacement terdiri dari campuran dan pergerakan bersama dua cairan yang dapat larut satu sama lain. Fenomena miscible displacement dan kurva breakthrough tidak hanya berhubungan dengan kepentingan teoritis saja tetapi relevan untuk menyelesaikan berbagai macam masalah di dunia nyata, seperti leaching dari kelebihan garam pada tanah salin, distribusi campuran zat hara, dan polusi air bawah tanah oleh pergerakan berbagai macan tipe solut, termasuk sampah radioaktif, racun kimia dan sisa agrochemical (pestisida dan pupuk) (Hillel, 2004). 2.4. Kurva Breakthrough Representasi grafik konsentrasi solut dalam proses miscible displacement terhadap waktu atau volume kumulatif effluent atau volume pori disebut “breakthrough curve” (BTC). Volume pori adalah perbandingan kumulatif volume effluent (cm3) pada waktu tertentu dengan total volumetric moisture dari tanah (cm3) (Lal dan Shukla, 2004). Menurut Hillel (2004) plot kurva
8 breakthrough adalah plot aliran komposisi cairan tercampur terhadap waktu atau terhadap jumlah volume effluent. Bentuk yang diadopsi oleh kurva breakthrough memperlihatkan informasi yang bermanfaat tentang apakah suatu solut itu diadsorpsi atau didegradasi, atau tentang bagaimana solut tersebut secara khusus bergerak. Dengan demikian, kurva breakthrough dapat menyediakan pengertian fundamental proses transport untuk tujuan karakterisasi (Alvarez-Benedi, 2005). Idealnya, kurva breakthrough seharusnya mempunyai bentuk sigmoidal (bentuk seperti huruf S atau C) dan simetris dengan pembengkokan yang menggambarkan 50 % perpindahan jumlah aliran dari suatu “volume pori” jika tanah sudah jenuh (Lal dan Shukla, 2004). 2.5. Simulasi Menurut Ross (2006) simulasi adalah memformulasikan suatu model statistik untuk menjelaskan fenomena yang terjadi di dunia nyata. Hal ini biasanya dilakukan dengan menyepakati antara memilih model yang merupakan tiruan situasi yang sebenarnya dan memilih salah satu model tersebut yang analisis matematikanya mudah dan bisa dikerjakan. Dengan demikian tidak akan didapatkan suatu model yang sesuai dengan fenomena yang terjadi di dunia nyata dalam suatu penelitian yang tidak mungkin untuk menganalisis modelnya secara matematik. Menurut Banks (1998) simulasi adalah imitasi dari cara kerja suatu proses atau sistem dunia nyata terhadap waktu. Simulasi meliputi generasi dari sejarah sistem buatan dan observasi dari sejarah tersebut untuk menggambarkan kesimpulan tentang karakteristik kerja sistem yang nyata yang direpresentasikan. Simulasi
adalah
metodologi
pemecah-masalah
yang
harus
ada
untuk
menyelesaikan berbagai masalah dunia nyata. Simulasi biasanya digunakan untuk menggambarkan dan untuk menganalisis prilaku sistem, menanyakan pertanyaan apa-jika tentang sistem nyata dan membantu dalam merancang sistem yang nyata. Baik sistem nyata dan konseptual bisa di buat modelnya dengan menggunakan simulasi.
9 2.6. Bahasa Pemograman C++ 2.6.1. Perkenalan dan Gambaran Bahasa C++ Bahasa Pemograman C++ dilengkapi model dari memori dan komputasi yang bisa digunakan di hampir kebanyakan komputer. Sebagai tambahan, C++ juga menyediakan mekanisme yang kuat dan fleksibel untuk abstraksi, yaitu susunan bahasa yang memperbolehkan programer untuk memperkenalkan dan menggunakan tipe yang baru dari objek yang cocok dengan konsep dari sebuah aplikasi (Stroustrup, 1999). Bahasa C++ mendukung gaya pemograman yang bertumpu dalam memanipulasi secara langsung dari hardware untuk mendapatkan tingkat efesiensi yang tinggi ditambah level yang lebih tinggi dari jenis pemograman yang bertumpu pada tipe user-define untuk menyediakan model dari data dan komputasi yang mendekati sudut pandang manusia dari tugas-tugas yang dilaksanakan oleh komputer. Jenis Pemograman higher-level ini sering disebut dengan nama data abstraction, object-oriented programming, and generic programming. 2.6.2. Rancangan dan Evolusi dari C++ Menurut Stroustrup (1999) C++ dirancang dan diimplementasikan oleh Bjarne Stroustrup di AT&T Bell Laboratories untuk mengkombinasikan pengorganisasian dan kekuatan rancang dari Simula dengan fasilitas dari bahasa C untuk sistem pemograman. Versi pertama dari C++, disebut “C dengan Kelas” yang pertama digunakan pada tahun 1980; yang mendukung teknik sistem pemograman tradisional dan abstraksi data. Fasilitas dasar untuk pemograman berorientasi objek ditambahkan di tahun 1983 dan design berorientasi objek dan teknik pemograman diperkenalkan secara bertahap ke komunitas C++. Bahasa C++ pertama kali dikomersialkan pada tahun 1985. Sebagai hasil dari penggunaan secara luas dan adanya implementasi dari penggunaan bahasa C++, standarisasi formal dari C++ dimulai di tahun 1990 di bawah perlindungan dari American National Standards Institute (ANSI) dan selanjutnya International Standards Organization (ISO) menstandarisasi secara internasional pada tahun 1998.
10 2.6.3. Tujuan dari Perancangan C++ Menurut Stroustrup (1999) Bahasa C++ dirancang untuk memberikan fleksibilitas dan efisiensi dari bahasa C untuk systems programming bersama dengan fasilitas Simula untuk program organization (biasanya dihubungkan dengan pemograman berorientasi objek). Perhatian yang lebih diambil sehingga pemograman tingkat tinggi dari Simula bisa di terapkan ke systems programming. Mekanisme abstraksi disediakan oleh C++ dirancang secara khusus agar dapat digunakan untuk tugas-tugas pemograman yang membutuhkan tingkat efesiensi dan fleksibilitas yang sangat tinggi. Tujuan-tujuan dari perancangan C++ bisa diringkas sebagai berikut: C ++ membuat pemograman lebih menyenangkan untuk programer yang serius. C ++ adalah bahasa pemograman yang mempunyai kegunaan umum yang lebih baik dari bahasa C. mendukung data abstraksi. mendukung pemograman berorientasikan objek. mendukung pemograman generic (umum).
III. BAHAN DAN METODE 3.1. Waktu dan Tempat Penelitian Penelitian dilakukan di Bagian Konservasi Tanah dan Air, Departemen Ilmu Tanah dan Sumberdaya Lahan, Fakultas Pertanian, Institut Pertanian Bogor, dari bulan Maret sampai Agustus 2009. 3.2. Bahan dan Alat Bahan dan alat yang digunakan adalah seperangkat komputer, Software compiler program berupa Microsoft Visual C++ 6.00 atau versi yang terbaru untuk membuat program simulasi atau bisa menggunakan compiler yang lain, Microsoft Excell, Microsoft Word. Data yang digunakan dalam penelitian ini adalah data konsentrasi relatif solut terhadap waktu tak berdimensi yang diperoleh dari disertasi Wang (2002) “Describing and Predicting Breakthrough Curves for non-Reactive Solute Transport in Statistically Homogeneous Porous Media”. dan (ParticleSimulation.exe) source code dari Haenselmann (2009). 3.3. Metode Penelitian 3.3.1. Metode Penelitian dari Data Skunder, Wang (2002)
Gambar 3. Skema dari sistem kolom laboratorium yang dikembangkan untuk melaksanakan eksperiment miscible displacement (Wang, 2002).
12 Gambar 3 adalah skema dari sistem kolom yang dikembangkan untuk eksperimen miscible displacement. Skema tersebut terdiri kolom plexiglas berdiameter 5,1 cm yang diisi dengan media berpori. Kolom tersebut dijenuhi dan diberi perlakuan kecepatan aliran yang konstan menggunakan pompa peristaltik. Panjang dari tabung (menunjuk kepada tabung penyeimbang) terkoneksi ke inlet di ujung kolom. Penjepit digunakan pada tabung penyeimbang. Tujuan dari tabung penyeimbang adalah untuk memastikan laurutan tracer bisa didistribusikan secara simetris di kedua belah sisi yang bersilangan yang mengandung jarum dari pemasangan untuk injeksi solut. Pemasangan injeksi didesain untuk menginjeksi tracer secara langsung pada lokasi yang berbeda sepanjang kolom. Pemasangan injeksi terdiri dari empat unit injeksi. Tiap unit injeksi terdiri dari dua semprotan dan satu jarum. Jarum terkoneksi ke dalam semprotan melalui tabung. Untuk menginjeksi solut pada berbagai titik di kolom, dua baris pembukaan kecil dibuat pada sisi berlawanan sepanjang jarum. Setiap baris mempunyai tiga atau empat pembukaan, diameter setiap lubangnya adalah 0.5 mm. Total terdapat 28 lubang pembuka untuk injeksi tracer. Jarum-jarum di arahkan di kolom sedemikian rupa sehingga jarum tersebut terbentuk paralel bersilangan. Tujuan dari desain pemasangan seperti ini adalah untuk mencoba mendistribusikan solut injeksi secara seragam melalui berbagai tempat bersilangan di kolom. Satu semprotan dari tiap unit injeksi telah diisi oleh larutan tracer dan yang lainnya diisi dengan larutan dasar yang bebas tracer. Sebelum tracer diinjeksikan, larutan dasar dipompa melalui kolom sampai benar-benar terjenuhi dan kebutuhan kecepatan aliran yang stabil didapatkan. Pada saat seperti itu larutan dasar diperbolehkan untuk mengisi tabung penyeimbang, yang terus ditutup dengan penjepit. Pada saat injeksi, pompa diberhentikan, dan penjepit di tabung penyeimbang di lepaskan. Lalu penjepit di tabung C dilepaskan, dan larutan tracer diinjeksikan ke dalam kolom melalui tabung A dan C. Beberapa dari larutan dasar di penyemprot B lalu diinjeksikan ke dalam kolom melalui tabung B dan C untuk menyiram sisa larutan tracer di tabung C dan di jarum ke dalam kolom. Tabung C lalu ditutup dengan penjepit. Prosedur ini lalu diulang terus-menerus untuk semua tiga unit injeksi yang tersedia. Setelah injeksi, tabung
13 penyeimbang ditutup kembali, dan pompa dinyalakan kembali. Waktu ketika pompa dinyalakan diambil sebagai waktu awal untuk analisis dari problem nilai awal pergerakan solut. Sisa larutan tracer di tabung A lalu disiram kembali ke semprotan A menggunakan larutan dasar yang tersisa di semprotan B. Semprotan A lalu di lepaskan dan isinya dipindahkan ke dalam labu volumetrik untuk menghitung kuantitas massa dari tracer sisa di semprotan A. Setelah tracer diinjeksi ke dalam kolom, diasumsikan untuk bercampur secara keseluruhan dan secara spontan di berbagai tempat di kolom dengan larutan dasar dan menghasilkan kira-kira 1-D konsentrasi solut terdistribusi melalui panjang kolom. Untuk menguji efek dari distribusi solut setelah injeksi di BTC, distribusi setelah injeksi diasumsikan mempunyai distribusi normal dengan standar deviasi σ. Distribusi normal mendekati fungsi dirac delta σ → 0. 3.3.2. Metode Penentuan Konsentrasi Solut Model CDE (Convection-Dispersion Equation) untuk satu dimensi pergerakan solut konservatif dalam kondisi aliran yang jenuh dan tetap adalah:
C t
2
D
C
x2
v
c x
(1)
dimana C adalah konsentrasi awal, v adalah kecepatan rata-rata air-pori, x adalah jarak, t adalah waktu dan D adalah koefisien dispersi. Dalam formula (1) C merepresentasikan konsentrasi residen. Akan tetapi, konsentrasi larutan effluent merepresentasikan konsentrasi flux dari pada konsentrasi residen di outlet boundary. Perbedaan antara konsentrasi flux dan konsentrasi residen dianggap penting ketika gradien konsentrasi relatif besar pada outlet atau dimensionless time rendah. Akan tetapi ini bukan masalah dari kebanyakan eksperimen kolom. Oleh karena itu, konsentrasi larutan effluent diasumsikan sama dengan konsentrasi residen pada outlet boundary
ketika
menggunakan formula (1). Jika kondisi outlet boundary untuk formula (1) diasumsikan untuk kondisi tak terbatas, miscible displacement di dalam eksperimen sistem kolom bisa secara matematika dijelaskan sebagai nilai awal dari masalah pergerakan solut dalam
14 wilayah 1 dimensi tak terbatas. Karena formula (1) linear, konsentrasi solut ketika dalam outlet boundary dapat ditunjukan oleh prinsip superposition menjadi:
C ( L, t )
C0 (l ) f ( L l , t )dl
(2)
dimana L adalah jarak dari lokasi injeksi ke outlet, C0(l) adalah konsentrasi awal pada lokasi l, dan f(L-l,t) adalah fungsi Green yang merepresentasikan solusi untuk masalah pergerakan solut dengan distribusi konsentrasi awal solut direpresentasikan sebagai fungsi Dirac delta δ(x) di l atau:
(l )
C 0 (l )
(3)
dimana θ adalah porositas dari media. Ketika solusi analitik dari CDE diturunkan untuk sumber Dirac delta dari kondisi awal di dalam wilayah 1-D pergerakan solut infinite, f(L-l,t) adalah: m
f (L l, t )
4 Dt
exp
( L l vt ) 2 4 Dt
(4)
dimana m adalah masa solut. Jika distribusi solut setelah injeksi diasumsikan menjadi fungsi Dirac delta di lokasi injeksi, dimana didefinisikan sebagai asal dari sistem koordinasi (l=0 dalam formula (4)), lalu formula (4) dikurangi menjadi:
C ( x, t )
m0 4 Dt
exp
( L vt ) 2 4 Dt
(5)
dimana m0 adalah masa solut yang diinjeksikan. Setelah itu formula (5) tersebut, ditambahkan faktor random walk ke dalamnya sehingga formula (5) tersebut berubah menjadi:
15 m0 exp 4 Dt
C ( x, t )
( L (v t ) R ) 2 4 Dt
(6)
Keterangan formula (6): C
= konsentrasi,
θ
= porositas,
D
= dispersi hidrodinamik,
m0
= massa solut,
t
= waktu,
L
= panjang kolom,
V
= kecepatan rata-rata pori,
R
= faktor random walk,
3.3.3. Metode Pengujian Model dengan Data Pengujian model dilakukan untuk membandingkan antara hasil prediksi model dengan data yang tersedia. Parameter yang dibandingkan adalah konsentrasi solut. Pengujian model dilakukan dengan penentuan koefisien determenistik (korelasi). Koefesien determenistik dilakukan untuk mengetahui pola hubungan antara parameter hasil pengukuran prediksi model dengan hasil pengukuran. Besarnya indeks koefesien deterministik dihitung dengan:
R2
(K D
K avg ) 2 ( K D (K D
K M )2
K avg ) 2
(7)
dimana: R2
= koefesien deterministik
KD
= besarnya konsentrasi data.
Kavg
= besarnya konsentrasi data rata-rata.
KM
= besarnya konsentrasi model.
Model dievaluasi kelayakannya apabila R2 mendekati 1 maka terdapat hubungan yang erat antara hasil prediksi model dengan data pengamatan lapangan.
IV. HASIL DAN PEMBAHASAN 4.1. Langkah Acak Dalam Solut Pergerakan solut melalui matrik tanah mengandung tiga komponen, yaitu: konveksi atau pergerakan massa, difusi, dan dispersi. Meskipun demikian hanya ada dua proses utama yang berpengaruh dalam pergerakan solut pada keadaan miscible displacement yaitu difusi molekular dan dispersi mekanik. Difusi molekular adalah proses spontan yang terjadi ketika gradien kimia potensial ada di daerah transisi antara cairan tracer dan cairan resident yang berpindah atau sebaliknya. Dispersi mekanik di kolom laboratorium hanya disebabkan oleh variasi lokal aliran air dalam tingkatan skala mikroskopik. Pada tingkat ini variasi tersebut termasuk perbedaan dalam kecepatan aliran air dalam setiap individu pori dan antara pori-pori atau juga variasi dari arah kecepatan aliran rata-rata dalam pori yang berbeda. Dalam individu pori, maksimum kecepatan aliran terjadi di tengah pori dan berkurang ke nol pada permukaan solid. Antara pori-pori, ratarata kecepatan aliran lebih tinggi di pori dengan diameter yang lebih besar. Pergerakan partikel-partikel yang terjadi dalam mekanisme dispersi terjadi secara
acak pada setiap langkah-langkah yang dilakukan partikel tersebut,
sehingga dengan ukuran pori-pori yang berbeda pada suatu bidang berpori maka partikel-partikel tersebut akan mempunyai jarak yang berbeda-beda diantara satu dengan yang lainnya jika dibandingkan dengan keadaan partikel-partikel tersebut saat pertama kali diinjeksikan ke kolom tanah atau pasir. Langkah acak dari tiap-tiap partikel tersebut menyebabkan perbedaan posisi dari partikel-partikel satu sama lain ketika kumpulan partikel tersebut pertama kali dimasukan ke kolom tanah sehingga tiap-tiap partikel akan sampai dari suatu wilayah ke wilayah yang lain secara tidak bersamaan. Dengan demikian teori langkah acak mempunyai peranan penting dalam pergerakan solut pada khususnya dan ilmu tanah pada umumnya. Pada penelitian ini diasumsikan media yang digunakan dalam keadaan jenuh dengan pemberian aliran larutan dasar berkecepatan stabil dan tidak ada pengaruh lainnya baik itu dari jerapan maupun serapan, sehingga keadaan miscible displacement yang diasumsikan terjadi dan pengaruh dispersi mekanik merupakan hal utama yang mempengaruhi terjadinya langkah acak dalam
17 pergerakan solut. Oleh karena itu, faktor yang berpengaruh pada pergerakan solut pada kolom ini adalah dispersi dan juga unsur-unsur pada formula (6). 4.2. Algoritma Formula CDE dan Turunannya dalam simulasi Algoritma yang digunakan untuk menggambarkan pergerakan solut menggunakan penurunan formula CDE (1) menjadi formula (6). Formula ke (6) tersebut lalu dikonversi ke dalam c++ supaya memudahkan penghitungan hasil konsentrasi per waktu menjadi: 1. 2. 3 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
int main () { ofstream outFile("nil_kon.txt"); srand(time(0)); double massa = 30; double porositas = 0.33; const double pi = 3.14159265; double koef_dispersi= 0.13; double waktu ; double panjang = 10;//dalam cm double kec = 0.5;//dalam cm/s double konsentrasi; double a; double b; for(waktu = 1;waktu <500;waktu +=1) { a = (massa/(porositas* sqrt(4*pi*koef_dispersi*waktu))); b = -1*(((panjang - (kec * waktu) + nor_with_std_and_mean()) * (panjang - (kec * waktu) + nor_with_std_and_mean())) / (4 * koef_dispersi * waktu)); konsentrasi = pow(a,b); cout<< waktu<< ","<
Kode pada baris 17 sampai 22 adalah algoritma utama dalam penghitungan konsentrasi solut terhadap waktu. Dalam algoritma tersebut dilakukan pengulangan terhadap waktu sebanyak 500 kali dan diulang tiap 1 kali satuan waktu. Di dalam pengulangan itu dimasukkan formula (2) ke dalam dua bagian yaitu bagian (a)
bagian (b)
m0 dan 4 Dt
( L (v t ) R ) 2 , lalu konsentrasi solut didapatkan dengan fungsi 4 Dt
18 b
pow yaitu fungsi exponensial a exp . Sehingga didapatkan hasil konsentrasi solut terhadap waktu. 4.3. Algoritma Langkah Acak dalam Simulasi Pergerakan Solut Pendekatan langkah acak dimasukkan ke dalam formula di atas sebagai (R). Nilai R dicari dengan menggunakan pendekatan transformasi Box Muller untuk mendapatkan nilai acak dengan distribusi normal. Transformasi ini memberikan cara untuk mentransformasi nilai acak yang terdistribusi seragam menjadi kumpulan baru berupa nilai acak dengan distribusi normal (gauss). Bentuk standar transformasi Box Muller yaitu: y1 = sqrt( - 2 ln(x1) ) cos( 2 pi x2 ) y2 = sqrt( - 2 ln(x1) ) sin( 2 pi x2 ) Akan tetapi bentuk ini mempunyai masalah yaitu hasil programnya lambat sehingga akan terjadi masalah yang serius jika kita ingin menghasilkan jutaan nilai acak. Bentuk polar dari tranformasi Box-Muller hasilnya lebih cepat dan lebih kuat dari pada bentuk transformasi di atas. Deskripsi algoritmanya dalam bahasa c++ adalah sebagai berikut: 1. 2. 3. 4. 5. 6. 7. 8. 9.
float x1, x2, w, R1, R2; do { x1 = 2.0 * ranf() - 1.0; x2 = 2.0 * ranf() - 1.0; w = x1 * x1 + x2 * x2; } while ( w >= 1.0 ); w = sqrt( (-2.0 * ln( w ) ) / w ); R1 = x1 * w; R2 = x2 * w;
dimana ranf() adalah fungsi nilai acak yang dihasilkan secara seragam terdistribusi antara 0 – 1. Nilai R1 atau R2 inilah yang digunakan untuk formula (2) kedua nilai tersebut bisa digunakan salah satunya dan juga sebaliknya tapi yang digunakan hanya salah satunya saja. Dalam kerangka langkah acak (random walk) pada simulasi, perpindahan solut diperlihatkan sebagai partikel-partikel yang melakukan langkah bertahap atau transisi melalui suatu formasi melalui jalur-jalur yang berbeda dengan kecepatan yang terus berubah. Kecepatan yang berubah ini dalam simulasi terjadi ketika partikel-partikel memasuki wilayah yang baru yang mempunyai faktor
19 langkah acak yang berbeda pula. Langkah acak pada pergerakan solut terjadi disebabkan perbedaan karakter struktur dari media berpori. 4.4. Algoritma Pergerakan Partikel Hal yang perlu dilakukan pertama kali dalam simulasi adalah menentukan batasan-batasan wilayah yang akan dilalui. Setelah itu membuat wilayah dimana kumpulan partikel (solut) akan di injeksikan dan bergerak melaluinya. Pada tiaptiap wilayah setiap partikel diberikan perlakuan
kecepatan dan arah yang
berbeda-beda. Akan tetapi kecepatan dan arah dari kumpulan partikel akan tetap di suatu wilayah sebelum masuk ke wilayah berikutnya. Sebagai contoh ditunjukkan pada Gambar 4. Pada wilayah 1 diberikan perlakuan sebagai berikut :
Gambar 4. Algoritma pergerakan partikel pada simulasi.
1 if((_p_particle[i].pos_y <= _b_ground) && (_p_particle[i].pos_y >= (float)0xFFFF)){ 2 3
bool inside = false; if((_p_particle[i].pos_x <= _2_wall) && (_p_particle[i].pos_x >= (float)0xFFFF) ){
4 5 6
bool inside = true; _p_particle[i].direction_x = (0); _p_particle[i].direction_y = rand() % 13107+ ((rand() % 100)* 0.3)*(float)0xFFFF;
7 } // if 8 } // if
Pada baris pertama menjelaskan tentang bagaimana batasan dari koordinat y-axis dari wilayah 1 sedangkan pada baris kedua menjelaskan tentang batasan
20 dari koordinat x-axis. Kedua batasan tersebut akan membentuk batasan suatu wilayah yaitu wilayah 1 seperti yang terlihat di Gambar 4. Pada baris 5 dan 6 merupakan algoritma untuk pemberian kecepatan dan arah pada tiap-tiap partikel sehingga tiap partikel dalam wilayah 1 akan diberikan kecepatan dan arah yang berbeda tetapi konstan. Setelah partikel diberi perlakuan di wilayah 1 maka kumpulan partikel tersebut akan bergerak ke wilayah dua. Sesaat setelah partikel tersebut masuk ke wilayah kedua maka partikel-partikel tersebut akan berubah arah dan kecepatannya sesuai dengan algoritma yang diberikan kepada wilayah 2 seperti berikut : 1 if((_p_particle[i].pos_y <= _d_ground) && (_p_particle[i].pos_y >= _b_ground)){ 2 3
bool inside = false; if((_p_particle[i].pos_x <= _2_wall) && (_p_particle[i].pos_x >= (float)0xFFFF) )
4 5 6
bool inside = true; _p_particle[i].direction_x = rand() % 13107 + (0.2)*(float)0xFFFF); _p_particle[i].direction_y = rand() % 13107+ ((rand() % 100)* 0.3)*(float)0xFFFF;
7 } // if 8 } // if
Pada baris 5 dan 6 diperlihatkan algoritma untuk memberikan kecepatan dan arah yang acak pada tiap-tiap partikel yang masuk ke dalam wilayah 2. Partikel-partikel yang melewati wilayah-wilayah yang lain juga akan diberikan perlakuan yang berbeda tergantung dari wilayah yang dilewatinya dengan algoritma yang hampir sama dengan yang diatas akan tetapi diberikan perlakuan yang berbeda saja dalam pengacakan kecepatan dan arahnya saja. Jika dianalogikan dalam pergerakan solut titik-titik tersebut adalah sebagai konsentrasi konsentrasi dari partikel solut yang ketika dilepaskan di wilayah satu maka partikel-partikel solut tersebut akan bergerak ke arah dan dengan kecepatan yang acak. Namun acak disini bukan berarti solut itu akan bergerak ke arah yang berlawanan dengan arah dari aliran larutan dasar dan solut tetapi hampir searah dengan aliran dasar dan solut. Dispersi mekanik yang menyebabkan langkah acak tersebut terjadi dikarenakan oleh mekanisme (a) perkembangan kecepatan profil di dalam setiap pori yang sedemikian rupa yang menyebabkan kecepatan tertinggi terjadi di tengah pori sedangkan di dinding pori sangat kecil atau bahkan tidak ada;
21 (b) perbedaan kecepatan aliran rata-rata di pori yang berbeda ukuran, partikel bergerak lebih cepat pada pori yang lebih besar dibandingkan yang kecil; (c) arah aliran air rata-rata dari tiap partikel di media berpori berbeda-beda dan (d) partikel solut ada yang berkumpul ke dan meyebar dari pori yang sama. Keempat mekanisme tersebut yang membuat terjadinya pengacakan pada partikel-pertikel solut.
Gambar 5. Konsep skematik yang berkontribusi terhadap dispersi mekanik (Leij dan Martinus, 2002). Saat kumpulan partikel tersebut melewati wilayah ke dua, maka kumpulan partikel tersebut akan mendapat perlakuan pengacakan lagi terhadap arah dan kecepatannya karena pada wilayah ke dua terdapat perlakuan atau mempunyai keadaan yang berbeda dengan wilayah pertama. Begitu pula selanjutnya jika kumpulan partikel tersebut masuk ke wilayah selanjutnya.
22 4.5. Perbandingan dari Model dengan Data Berdasarkan perhitungan pada Tabel 1 diperoleh besar koefesien deterministik sebagai berikut : R
2
R2
(K D
K avg ) 2 ( K D (K D
K M )2
K avg ) 2
= (2.8067-0.4274)/ 2.8067 = 0.8477 Besar koefisien deterministik mendekati satu (R2 > 0.7) sehingga terdapat
hubungan yang cukup erat antara nilai konsentrasi relatif data dengan nilai konsentrasi relatif model. Nilai koefisien deterministik 0.84 menunjukan konsentrasi model dapat menggambarkan konsentrasi relatif data, serta terdapat hubungan yang erat antara konsentrasi data dan konsentrasi relatif model. Maka model cukup baik untuk menduga konsentrasi data.
Gambar 6. Perbandingan konsentrasi relatif data dengan konsentrasi model.
23 Tabel 1. Nilai kosentrasi solut data dan model No. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
Waktu 0.00 0.06 0.12 0.18 0.24 0.30 0.36 0.42 0.48 0.54 0.60 0.66 0.72 0.78 0.84 0.90 0.96 1.02 1.08 1.14 1.20 1.26 1.32 1.38 1.44 1.50 1.56 1.62
KD 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0190 0.0400 0.1360 0.3530 0.6670 0.9150 1.0000 0.8980 0.6780 0.4520 0.2760 0.1450 0.0830 0.0490 0.0330 0.0280 0.0240
jumlah 5.7960 ratarata 0.2070
(KD - KM)2 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0028 0.0831 0.0605 0.1109 0.0046 0.0134 0.0334 0.0498 0.0411 0.0192 0.0057 0.0012 0.0010 0.0001 0.0001 0.0004
(KD - KDavg)2 0.0428 0.0428 0.0428 0.0428 0.0428 0.0428 0.0428 0.0428 0.0428 0.0428 0.0428 0.0353 0.0279 0.0050 0.0213 0.2116 0.5013 0.6288 0.4775 0.2218 0.0600 0.0048 0.0038 0.0154 0.0250 0.0303 0.0320 0.0335
5.7318 0.0642
0.4274
2.8067
0.2047 0.0023
0.0153
KM 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0004 0.0140 0.0928 0.4243 0.5989 1.0000 0.9830 0.8845 0.7152 0.4548 0.2493 0.1373 0.0696 0.0478 0.0171 0.0209 0.0185 0.0033
KD - KM 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 -0.0004 0.0050 -0.0528 -0.2883 -0.2459 -0.3330 -0.0680 0.1155 0.1828 0.2232 0.2027 0.1387 0.0754 0.0352 0.0319 0.0121 0.0095 0.0207
Ket: KD = Konsentrasi Data, KM = Konsentrasi Model, KDavg = Konsentrasi Data Rata-Rata
24 4.6. Hasil dari Pergerakan Simulasi Hasil yang didapatkan dari simulasi memperlihatkan hasil yang baik dimana kumpulan partikel-partikel bergerak dengan mulus dari suatu wilayah yang satu dengan wilayah yang lainnya. Jumlah partikel di dalam simulasi yang optimum adalah sampai 6000 partikel. Jika partikel yang digunakan lebih dari jumlah tersebut maka program simulasinya akan berjalan dengan lambat dan tersendat-sendat. Hal ini kemungkinan disebabkan oleh penggunaan CPU yang hampir 50 persen padahal memori yang digunakan tidak lebih dari 6 megabite. 4.7. Hasil dari Pergerakan Solut di Kolom Pasir Pada penelitian ini yang diasumsikan kolom pasir dalam keadaan miscible displacement dan dianggap tidak ada pengaruh dari faktor-faktor lain yang berpengaruh terhadap pergerakan solut dalam tanah. Faktor-faktor tersebut yaitu (1) volatilisasi, (2) jerapan oleh mineral liat, (3) serapan oleh tanaman, dan (4) degradasi oleh mikroba. Dengan demikian penelitian belum bisa menggambarkan pergerakan solut di dalam tanah pada skala lapangan. Oleh karena itu, diperlukan penelitian lebih lanjut yang memperhitungkan faktor-faktor diatas.
V. KESIMPULAN DAN SARAN 5.1. Kesimpulan Simulasi dan model yang dibuat sudah dapat menggambarkan secara sederhana pergerakan solut dalam skala mikroskopik (laboratorium) pada suatu media berpori. Terdapat hubungan yang cukup erat antara nilai konsentrasi relatif data dengan nilai konsentrasi relatif model. Uji perbandingan antara model dengan data menunjukkan nilai koefisien deterministik 0.84. 5.2. Saran 1. Perlu diadakan penelitian yang lebih lanjut untuk mendapatkan permodelan yang dapat menggambarkan keragaman data yang lebih baik dengan menambahkan variabel indicator lainnya yang diduga berpengaruh terhadap pergerakan solut di media berpori yang dalam keadaan miscible displacement seperti solut yang terjerap oleh mineral liat, tervolatilisasi ke udara, terdegradasi oleh mikroba dan terserap oleh tanaman. 2. Memperbaiki program simulasinya dalam hal performanya dengan cara perbaikan algoritma pemogrammannya dan juga perbaikan dari segi tampilannya.
DAFTAR PUSTAKA Alvarez-Benedi J., C. M. Regalado, A. Ritter, and S. Bolado. 2005. Characterization of Solute Transport Through Miscible Displacement Experiment. CRC PRESS, 11, 392-428. Banks, J. 1998. Handbook of Simulation: Principles, Methodology, Advances, Applications, and Practice. Wiley-IEEE. Batu, V. 2006. Applied flow and solute transport modeling in aquifers : fundamental principles and analytical and numerical methods. CRC Press, Taylor & Francis Group. Bear, J. and A. Verruijt. 1987. Theory and Applications of Transport in Porous Media. D. Reidel Publishing Company Dordrecht, Holland. Bhavaranayana, M, B. C. Panda, and C. Dakshinamurti. 1982. Miscible Displacement Studies in Capillary Tubes, Sand and Soil Columns. Verlag Chemie GmbH, D-6940 Weinheim. Boving, T. B. 2008. Environmental Geology, Lecture 3. www.uri.edu/cels/geo/docs/GEO_584_Notes/Lec%203.pdf. (26/04/2009). _________________. 2008. Environmental Geology, Lecture 4. www.uri.edu/cels/geo/docs/GEO_584_Notes/Lec%204.pdf. (26/04/2009). _________________. 2008. Environmental Geology, Lecture 5. www.uri.edu/cels/geo/docs/GEO_584_Notes/Lec%205.pdf. (26/04/2009). Bresler, E. 1981. Transport of Salt in Soil and Subsoils. Agricultural Water Management, 4:35-62 (1981). Cortis, A. 2008. Continous time random walk analysis of solute transport in fractured porous media. Escholarship Repository, University of California. ________ and B. Berkowitz. 2004. Anomalous Transport in “Classical” Soil and Sand Coloums. Soil Sci. Soc. Am. J. 68:1539-1548 (2004). Haenselmann, T. 2009. ParticleSimulation.exe source http://www.haenselmann.de/indexhb_en.html [26/10/2009].
code.
Hillel, D. 2004. Introduction to Environmental Soil Physics. American Elsevier, New York Huges, B. D. 1995. Random Walk and Random Environments. Clarendon Press – Oxford, New York.
27 Isliker, H. 2006. The Combined Continuous Time Random Walk in Position and Momentum Space as Model for Anomalous Transport. http://www-fusionmagnetique.cea.fr/ttf2006/prog/drafts/087.pdf (28/04/2009). Jiménez-Hornero, F.J., J. V. Giráldez, and A. Laguna. 2005. Simulation of Tracer Dispersion in Porous Media Using Lattice Boltzmann and Random Walk Models. Soil Science Society of America. Lal, R. and M. K. Shukla. 2004. Principles of Soil Physics. Marcel Dekker, New York. Leij, F. J. and M. Th. Van Genuchten. 2002. Soil Companion: Solute Transport. CRC Press, New York. Chapter 6: 189-244. Ross, S. M. 2006.Simulation. Elsevier Academic Press. Stroustrup. B. 1999. An Overview of the C ++ Programming Language.AT&T Laboratories,Florham Park, NJ07932-0971, USA. Wang, H. 2002. Describing and Predicting Breakthrough Curves for non-Reactive Solute Transport in Statistically Homogeneous Porous Media. Ph.D. Dissertation, Virginia Polytechnic Institute and State University. http://scholar.lib.vt.edu/theses/available/etd-11292002-234939/ unrestricted/Dissertation.pdf (28/04/2009). ________ and N. Persaud. 2004. Miscible Displacement of Initial Solute Distributions in Laboratory Coloums. Soil Sci. Soc. Amer. J, 68: 14711478. Xiong, Y., G. Huang, Q. Huang, and K. Wang. 2006. Continous Time Random Walk for Analyzing Solute Transport in One-Dimensional Heterogeneous Soil Coloum. http://old.cgs.gov.cn/zt_more/34/zhaiyao/html/02/207.htm (28 April 2009).
LAMPIRAN
29 Tabel Lampiran 1. Source Code Penghitungan Nilai Acak dengan Nilai Konsentrasi Model (randomnormal.h) 1
#ifndef normalrandom_h
2
#define normalrandom_h
3
#include <string>
4
#include
5
#include
6
#include
7 8 9
float unif() {
10 11
return rand()/float (RAND_MAX);//mencari nilai random antara 0-1 }
12 13 void seed() 14
{
15 16
srand(time(0));//buat merandom kembali }
17 18 float randomwalk(){ 19
float x, y, w;
20 21
do {
22
x = 2 * unif() - 1;
23
y = 2 * unif()- 1;
24
w = x * x + y * y;
25
} while ( w >=1.);
26 27
float nor_rand = sqrt(-2 * log(w)/w) * y;//random number without stdev and mean return nor_rand;
28
30 29 double nor_with_std_and_mean(){ 30
double stdev = sqrt(1);//standar deviasi
31
double mean = 0.0;//mean (nilai tengah)
32
double normal_random = stdev * randomwalk() + 1 *mean;
33 34
return normal_random;
35 }
(konsentrasi.cpp) 1
#endif#include <stdio.h>
2
#include <math.h>
3
#include
4
#include "randomnumber.h"
5
#include
6 7
using namespace std;
8
int main ()
9
{
10
ofstream outFile("Nilai_Konsentrasi3.txt");
11
srand(time(0));
12
double massa = 10;
13
double porositas = 0.33;
14
const double pi = 3.14159265;
15
double koef_dispersi = 0.13;
16
double waktu ;
17
double panjang = 37.5;//dalam cm
18
double kec = 0.4;//dalam cm/s
19
double konsentrasi;
20
double a;
21
double b;
31 22
for(waktu = 0;waktu <170;waktu +=6)
23
{
24
a = (massa/(porositas* sqrt(4*pi*koef_dispersi*waktu)));
25
b = -1*(((panjang - (kec*waktu)+nor_with_std_and_mean())*(panjang - (kec*waktu)+nor_with_std_and_mean()))/(4*koef_dispersi*waktu));
26 27
konsentrasi = pow(a,b);
28
out<< waktu<< ","<
29
outFile<<waktu << ","<
30
}
31
return 0;
32
}
32 Tabel Lampiran 2. Source Code Simulasi Pergerakan Solut dalam C++ 1 // SimulationView.cpp : implementation of the CSimulationView class 2 #include "stdafx.h" 3 #include "math.h" 4 #include "fstream.h" 5 #include "Simulation.h" 6 #include "ParameterSetup.h" 7 8 #include "SimulationDoc.h" 9 #include "SimulationView.h" 10 #ifdef _DEBUG 11 #define new DEBUG_NEW 12 #undef THIS_FILE 13 static char THIS_FILE[] = __FILE__; 14 #endif 15 16 ///////////////////////////////////////////////////////////////////////////// 17 // CSimulationView 18 19 IMPLEMENT_DYNCREATE(CSimulationView, CView) 20 21 BEGIN_MESSAGE_MAP(CSimulationView, CView) 22 //{{AFX_MSG_MAP(CSimulationView) 23 ON_WM_LBUTTONDOWN() 24 ON_WM_TIMER() 25 ON_WM_RBUTTONDOWN() 26 ON_WM_RBUTTONUP() 27 ON_WM_MOUSEMOVE() 28 ON_WM_LBUTTONDBLCLK() 29 ON_WM_LBUTTONUP() 30 ON_COMMAND(IDM_SETUP, OnSetup) 31 ON_WM_SIZE() 32 ON_COMMAND(IDC_AUTO_MOVE, OnAutoMove) 33 //}}AFX_MSG_MAP 34 END_MESSAGE_MAP() 35 36 ///////////////////////////////////////////////////////////////////////////// 37 // CSimulationView construction/destruction 38 39 CSimulationView::CSimulationView() 40 { 41 // TODO: add construction code here 42 const long TEXT_LENGTH = 300; 43 char text[TEXT_LENGTH]; 44 _no_particles = 6000; 45 _gravity_constant = 0; 46 _p_particle = NULL; 47 _do_initialize = true; 48 _auto_move = false; 49 _no_glow_particles = 22; 50 _none_moving_count = 0; 51 _no_explosions = 0; 52 _emission_speed = 900; 53 _emission_size = 21; 53 _speed_auto_move = 40; 55 _no_explosions = 0; 56 _gravity = 0; 57 } 58 59 CSimulationView::~CSimulationView() 60 { 61 if(_p_particle) delete[] _p_particle; _p_particle = NULL; 62 } 63 64 BOOL CSimulationView::PreCreateWindow(CREATESTRUCT& cs) 65 { 66 // TODO: Modify the Window class or styles here by modifying 67 // the CREATESTRUCT cs
33 68 return CView::PreCreateWindow(cs); 69 } 70 71 ///////////////////////////////////////////////////////////////////////////// 72// CSimulationView drawing 73 74 void CSimulationView::OnDraw(CDC* pDC) 75 { 76 CSimulationDoc* pDoc = GetDocument(); 77 ASSERT_VALID(pDoc); 78 // TODO: add draw code for native data here 79 80 if(_do_initialize) { 81 _do_initialize = false; 82 83 if(_p_particle) delete[] _p_particle; 84 _p_particle = new Particle[_no_particles]; 85 86 Particle::ResetNoParticles(); 87 88 for(i = 0; i < _no_particles; i++) { 89 _p_particle[i].Init(_no_glow_particles); 90 } // for 91 92 i = 0; 92 index_particle = 0; 94 simul_time = 0; 95 _last_index = _no_particles; 96 _left_button_pressed = _right_button_pressed = false; 97 SetTimer(1, 5, NULL); 98 } // if 99 100 CPen white_pen(PS_SOLID, 1, RGB(255, 255, 255)); 101 CPen* p_old_pen; 102 pDC->PatBlt(0, 0, 1280, 1024, BLACKNESS); 103 104 p_old_pen = pDC->SelectObject(&white_pen); 105 106 ///////////////////////////////////////////////////////////////////////////////////////////// 107 108 109 110 pDC->MoveTo((long)(_2_wall) >> 16, (_x_ground >> 16) + 2);// garis vertikal 1 111 pDC->LineTo((long)(_2_wall) >> 16, (_ground >> 16) + 2);// 112 113 pDC->MoveTo((long)(_4_wall) >> 16, (_x_ground >> 16) + 2);// garis vertikal 2 114 pDC->LineTo((long)(_4_wall) >> 16, (_ground >> 16) + 2);// 115 116 pDC->MoveTo((long)(_6_wall) >> 16, (_x_ground >> 16) + 2);// garis vertikal 3 117 pDC->LineTo((long)(_6_wall) >> 16, (_ground >> 16) + 2);// 118 119 ///////////////////////////////////////////////////////////////////////////////////////////// 120 121 pDC->MoveTo((long)(_mid_point-_mid_point) >> 16, (_b_ground >> 16) + 2);// garis horizontal ke 1 122 pDC->LineTo((long)(_mid_point+_mid_point) >> 16, (_b_ground >> 16) + 2);// 123 124 pDC->MoveTo((long)(_mid_point-_mid_point) >> 16, (_d_ground >> 16) + 2);// garis horizontal ke 2 125 pDC->LineTo((long)(_mid_point+_mid_point) >> 16, (_d_ground >> 16) + 2);// 126 127 pDC->MoveTo((long)(_mid_point-_mid_point) >> 16, (_ground >> 16) + 2);// garis horizontal ke 3 128 pDC->LineTo((long)(_mid_point+_mid_point) >> 16, (_ground >> 16) + 2);// 129 130 ////////////////////////////////////////////////////////////////////////////////////////////// 131 132 pDC->SelectObject(p_old_pen); 133 134 pDC->SetTextColor(RGB(255, 255, 0)); 135 pDC->SetBkColor(RGB(0, 0, 0)); 136 137 char text[300]; 138 139 sprintf(text, "Klik Kiri Pada Tombol Mouse Untuk Memunculkan dan Menggerakan Kumpulan Partikel "); 140 pDC->TextOut(16, 16, text);
34 141 } 142 ///////////////////////////////////////////////////////////////////////////// 143 // CSimulationView diagnostics 144 #ifdef _DEBUG 145 void CSimulationView::AssertValid() const 146 { 147 CView::AssertValid(); 148 } 149 150 void CSimulationView::Dump(CDumpContext& dc) const 151 { 152 CView::Dump(dc); 153 } 154 155 CSimulationDoc* CSimulationView::GetDocument() // non-debug version is inline 156 { 157 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSimulationDoc))); 158 return (CSimulationDoc*)m_pDocument; 159 } 160 #endif //_DEBUG 161 162 ///////////////////////////////////////////////////////////////////////////// 163 // CSimulationView message handlers 164 165 void CSimulationView::OnLButtonDown(UINT nFlags, CPoint point) 166 { 167 // TODO: Add your message handler code here and/or call default 168 169 CView::OnLButtonDown(nFlags, point); 170 171 _current_point = point; 172 _left_button_pressed = true; 173 } 174 175 long CSimulationView::EmmitNewParticle(int x, int y) 176 { 177 long current_particle_index; 178 179 if(!_p_particle[index_particle].IsActive()) { 180 181 _p_particle[index_particle].Init(_no_glow_particles); 182 183 double angle = rand()%360; 184 double radius = rand()%_emission_size ; 185 double x11 = radius * cos(angle); 186 double y22 = radius * sin(angle); 187 188 _p_particle[index_particle].pos_y = (long)((long)y + (x11) )<< 16; 189 _p_particle[index_particle].pos_x = (long)((long)x + (y22) )<< 16; 190 191 192 static float drive; 193 194 float drive1 = (float)(rand() % 10); 195 float drive2 = (float)(rand() % 11); 196 197 // _p_particle[index_particle].direction_x = ((0.2)*(float)0xFFFF); 198 // _p_particle[index_particle].direction_y = ((0.2)*(float)0xFFFF); 199 200 _p_particle[index_particle].gravity_x = 0; 201 _p_particle[index_particle].gravity_y = 0; 202 203 _p_particle[index_particle].SetActive(true); 204 205 current_particle_index = index_particle; 206 207 index_particle++; 208 209 if(index_particle >= _no_particles) { 210 index_particle = 0; 211 } // if
35 212 213 if(index_particle > _last_index) _last_index = index_particle; 214 215 return current_particle_index; 216 } // if 217 218 return -1; 219 } // CSimulationView::EmmitNewParticle 220 221 void CSimulationView::OnTimer(UINT nIDEvent) 222 { 223 // TODO: Add your message handler code here and/or call default 224 225 CView::OnTimer(nIDEvent); 226 227 CClientDC dc(this); 228 short old_pos_x, old_pos_y; 229 short second_oldest_pos_x, second_oldest_pos_y; 230 long pos_x, pos_y; 231 long lifetime; 232 bool particle_valid; 233 234 long start_time = simul_time; 235 236 // make sure to stay for a while 237 238 while((simul_time - start_time) < 5000) { 239 240 for(i = 0; i < _last_index; i++) { 241 242 index_particle++; 243 244 if(index_particle > _last_index) _last_index = index_particle; 245 246 if(index_particle >= _no_particles) { 247 index_particle = 0; 248 } // if 249 250 simul_time++; 251 252 if((simul_time % 15000) == 0) { 253 char text[80]; 254 255 dc.SetTextColor(RGB(255, 255, 0)); 256 dc.SetBkColor(RGB(0, 0, 0)); 257 258 sprintf(text, "%d Partikel ", Particle::GetNoParticles()); 259 dc.TextOut(16, 32, text); 260 } // if 261 262 if(_left_button_pressed || _auto_move) { 263 264 if((rand() % (1010 - _emission_speed)) == 0) { 265 266 EmmitNewParticle(_current_point.x, _current_point.y); 267 } // if 268 } // if 269 270 if(_right_button_pressed) { 271 // menghilangkan partikel 272 273 _p_particle[i].SetVanished(); 274 } // if 275 276 if(_auto_move) { 277 278 long local_width, local_height; 279 long delta_width, delta_height; 280 281 local_width = (long)(0.9*(float)_client_width); 282 local_height = (long)(0.9*(float)_client_height); 283 284 delta_width = (long)(0.05*(float)_client_width);
36 285 286 287
delta_height = (long)(0.05*(float)_client_height); _current_point.x = sin((double)simul_time / ((double)(104 sqrt(_speed_auto_move)*10) * 10000.0*1.1))*local_width/2 + local_width/2 + delta_width; _current_point.y = cos((double)simul_time / ((double)(104 – sqrt(_speed_auto_move)*10) * 10000.0))*local_height*2/5 + local_height*2/5 + delta_height;;
288
289 290 291 292 293 294 295
296 297 298 299 300
} // if if(_p_particle[i].IsActive()) { // update by chance particle_valid = 296_p_particle[i].GetSecondYoungestPosition(second_oldest_pos_x, second_oldest_pos_y, lifetime); pos_x = _p_particle[i].pos_x; pos_y = _p_particle[i].pos_y; if(!((abs(((long)second_oldest_pos_x << 16) - pos_x) < (1 << 16)) && (abs(((long)second_oldest_pos_y << 16) - pos_y) < (1 << 16)))) { if(!_p_particle[i].Vanished()) {
301 302
if((lifetime > 50) && (_p_particle[i]._generation < (_no_explosions-1))) {
303 304 305 306
long new_particle_index; for(int repeat = 0; repeat < 5; repeat++) { new_particle_index = EmmitNewParticle(pos_x >> 16, pos_y >> 16);
307 308 309 310
if(new_particle_index >= 0) { _p_particle[new_particle_index]._generation = _p_particle[i]._generation+1; } // if } // for
311 312 313 314 315 316 317
_p_particle[i].SetVanished(); } // if } // if if(!_p_particle[i].Vanished()) { dc.SetPixelV(pos_x >> 16, pos_y >> 16, RGB(255, 255, 255));
318 319 320 321 322 323 324 325 326 327 328 329 340 341 342 343 344 345 346 347 348 349 350
if(particle_valid) { short color_1, color_2; color_1 = 210/(lifetime/92+1) + 45; color_2 = 255/(lifetime/40+1) + 0; dc.SetPixelV(second_oldest_pos_x, second_oldest_pos_y, RGB(0, 0, 0)); } // if _p_particle[i].PushPosition(); } // if if(_p_particle[i].GetOldestPosition(old_pos_x, old_pos_y)) { dc.SetPixelV(old_pos_x, old_pos_y, RGB(0, 0, 0)); } // if } // if _p_particle[i].pos_x += _p_particle[i].direction_x; _p_particle[i].pos_y += _p_particle[i].direction_y;
37 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
//atas hapus/////////////////////////////////////////////////////////////////////////// if((_p_particle[i].pos_y <= (float)0xFFFF) ){ bool inside = false; if((_p_particle[i].pos_x <= _8_wall) && (_p_particle[i].pos_x >= (float)0xFFFF) ){ bool inside = true; _p_particle[i].SetVanished(); } // if if(((_p_particle[i].direction_y > (long)(-0.6*(float)0xFFFF)) && (inside == true)) || (_p_particle[i].pos_y > 1024*0xFFFF)) { _p_particle[i].SetVanished(); } // if } // if
////kotak ke 5///////////////////////////////////////////////////////////////////////////// if((_p_particle[i].pos_y <= _d_ground)&& (_p_particle[i].pos_y >= _b_ground)){
375 376 377 378
bool inside = false; if((_p_particle[i].pos_x <= _2_wall) && (_p_particle[i].pos_x >= (float)0xFFFF)) {
379 380 381 382
inside = true; _p_particle[i].direction_x = rand() % 13107+(0.2)*(float)0xFFFF; _p_particle[i].direction_y = rand() % 13107+(0.2)*(float)0xFFFF;
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397
} // if //if(((_p_particle[i].direction_y > (long)(-0.6*(float)0xFFFF)) && (inside == true)) || (_p_particle[i].pos_y > 1024*0xFFFF)) { // _p_particle[i].SetVanished(); //} // if } // if
/////kotak ke 6//////////////////////////////////////////////////////////////////////////// if((_p_particle[i].pos_y <= _d_ground)&& (_p_particle[i].pos_y >= _b_ground)){ bool inside = false; if((_p_particle[i].pos_x <= _4_wall) && (_p_particle[i].pos_x >= _2_wall)) {
398 399 400 401
inside = true; _p_particle[i].direction_x = (rand() % 13107)+(0.3)*(float)0xFFFF; _p_particle[i].direction_y = (0);
402 403 404 405 406 407 408 409 410
} // if //if(((_p_particle[i].direction_y > (long)(-0.6*(float)0xFFFF)) && (inside == true)) || (_p_particle[i].pos_y > 1024*0xFFFF)) { // _p_particle[i].SetVanished(); //} // if } // if
38 411 412 413
////kotak ke 7///////////////////////////////////////////////////////////////////////////// if((_p_particle[i].pos_y <= _d_ground)&& (_p_particle[i].pos_y >= _b_ground)){
414 415 416 417
bool inside = false; if((_p_particle[i].pos_x <= _6_wall) && (_p_particle[i].pos_x >= \ _4_wall)) {
418 419 420 421
inside = true; _p_particle[i].direction_x = (rand() % 13107)+(0.1)*(float)0xFFFF; _p_particle[i].direction_y = (rand() % 13107)+(0.3)*(float)0xFFFF;
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
} // if //if(((_p_particle[i].direction_y > (long)(-0.6*(float)0xFFFF)) && (inside == true)) || (_p_particle[i].pos_y > 1024*0xFFFF)) { // _p_particle[i].SetVanished(); //} // if } // if
////kotak ke 8///////////////////////////////////////////////////////////////////////////// ////partikel hilang /////////////////////////////////////////////////////////////////////// if((_p_particle[i].pos_y <= _d_ground)&& (_p_particle[i].pos_y >= _b_ground)){
437 438 439 440
bool inside = false; if((_p_particle[i].pos_x <= _8_wall) && (_p_particle[i].pos_x >=_6_wall)) {
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
463 464 465 466 467 468 469 470 471 472
inside = true; // //
_p_particle[i].direction_x = (rand() % 1966); _p_particle[i].direction_y = ((0.1)*(float)0xFFFF);
} // if if(((_p_particle[i].direction_y > (long)(-0.6*(float)0xFFFF)) && (inside == true)) || (_p_particle[i].pos_y > 1024*0xFFFF)) { _p_particle[i].SetVanished(); } // if } // if
/////ground//////////////////////////////////////////////////////////////////////////// /////ground/////////////////////////////////////////////////////////////////////////// if(_p_particle[i].pos_y >= _ground) { bool inside = false; if((_p_particle[i].pos_x <= _mid_point+_mid_point) && (_p_particle[i].pos_x >= _mid_point-_mid_point)) { inside = true; _p_particle[i].pos_y = _ground + 2*( _ground – _p_particle[i].pos_y); //_p_particle[i].SetVanished(); } // if
39 473 474
//if(((_p_particle[i].direction_y > (long)(-0.6*(float)0xFFFF)) && (inside == true)) || (_p_particle[i].pos_y > 1024*0xFFFF)) { // _p_particle[i].SetVanished(); // } // if }///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
475 476 477 478 479 } // if 480 } // for 481 } // while 482 483 } 484 485 void CSimulationView::OnRButtonDown(UINT nFlags, CPoint point) 486 { 487 // TODO: Add your message handler code here and/or call default 488 489 CView::OnRButtonDown(nFlags, point); 490 491 _right_button_pressed = true; 492} 493 494 495 void CSimulationView::OnRButtonUp(UINT nFlags, CPoint point) 496 { 497 // TODO: Add your message handler code here and/or call default 498 499 CView::OnRButtonUp(nFlags, point); 500 501 _right_button_pressed = false; 502 } 503 503 void CSimulationView::OnMouseMove(UINT nFlags, CPoint point) 504 { 505 // TODO: Add your message handler code here and/or call default 506 507 CView::OnMouseMove(nFlags, point); 508 _current_point = point; 509 } 510 511 void CSimulationView::OnLButtonDblClk(UINT nFlags, CPoint point) 512 { 513 // TODO: Add your message handler code here and/or call default 514 515 CView::OnLButtonDblClk(nFlags, point); 516 517 _left_button_pressed = true; 518 } 519 520 void CSimulationView::OnLButtonUp(UINT nFlags, CPoint point) 521 { 522 // TODO: Add your message handler code here and/or call default 523 524 CView::OnLButtonUp(nFlags, point); 525 526 _left_button_pressed = false; 527 } 528 529 void CSimulationView::OnSetup() 530 { 531 // TODO: Add your command handler code here 532 534 long no_particles, no_glow_particles; 535 536 no_particles = _no_particles; 537 no_glow_particles = _no_glow_particles; 538 539 _auto_move = false; 540 541 ParameterSetup para_setup(this, no_particles, _emission_speed, _emission_size, _no_explosions, no_glow_particles, _gravity, _speed_auto_move); 542 para_setup.DoModal(); 543
40 544 if((no_particles != _no_particles) || (no_glow_particles != _no_glow_particles)) { 545 546 _last_index = _no_particles = no_particles; 547 index_particle = 0; 548 549 _no_glow_particles = no_glow_particles; 550 551 _do_initialize = true; 552 Invalidate(); 553 } // if 554 555 _auto_move = false; 556 } 557 558 void CSimulationView::OnSize(UINT nType, int cx, int cy) 559 { 560 CView::OnSize(nType, cx, cy); 561 562 // TODO: Add your message handler code here 563 564 RECT rect; 565 566 GetClientRect(&rect); 567 568 _client_width = (rect.right - rect.left); 569 _client_height = (rect.bottom - rect.top); 570 571 572 _x_ground = (long)(0.1 * (float)_client_height) * 0xFFFF; 573 _y_ground = (long)(0.97 * (float)_client_height) * 0xFFFF; 574 _a_ground = (long)(0.15 * (float)_client_height) * 0xFFFF; 575 _b_ground = (long)(0.3 * (float)_client_height) * 0xFFFF; 576 _c_ground = (long)(0.45 * (float)_client_height) * 0xFFFF; 577 _d_ground = (long)(0.6 * (float)_client_height) * 0xFFFF; 578 _e_ground = (long)(0.75 * (float)_client_height) * 0xFFFF; 579 _ground = (long)(0.9 * (float)_client_height) * 0xFFFF; 580 581 ////////////////////////////////////////////////////// 582 _mid_point = _client_width*0xFFFF / 2; 583 _delta_x = _client_width*0xFFFF / 4; 584 585 _1_wall= _mid_point - (1.5 *_delta_x); 586 _2_wall= _mid_point - _delta_x; 587 _3_wall= _mid_point - (0.5 *_delta_x); 588 _4_wall= _mid_point; 589 _5_wall= _mid_point + (0.5 *_delta_x); 590 _6_wall= _mid_point + _delta_x; 591 _7_wall= _mid_point + (1.5 *_delta_x); 592 _8_wall= _mid_point + _mid_point; 593 } 594 595 void CSimulationView::OnAutoMove() 596 { 597 // TODO: Add your command handler code here 598 599 _auto_move = !_auto_move; 600 601 CMenu* p_menu = GetParent()->GetMenu(); 602 603 if(_auto_move) 604 p_menu->CheckMenuItem(IDC_AUTO_MOVE, MF_CHECKED); 605 else 606 p_menu->CheckMenuItem(IDC_AUTO_MOVE, MF_UNCHECKED); 607 }
41 Tabel Lampiran 3. Hasil nilai konsentrasi model terhadap waktu
Waktu tak Nilai Waktu tak Nilai Waktu tak berdimensi Konsentrasi berdimensi Konsentrasi berdimensi 0 0.0000 0 0.00000 0.00 6 0.0000 0.06 0.00000 0.06 12 0.0000 0.12 0.00000 0.12 18 0.0000 0.18 0.00000 0.18 24 0.0000 0.24 0.00000 0.24 30 0.0000 0.3 0.00000 0.30 36 0.0000 0.36 0.00000 0.36 42 0.0000 0.42 0.00000 0.42 48 0.0000 0.48 0.00000 0.48 54 0.0000 0.54 0.00000 0.54 60 0.0004 0.6 0.00000 0.60 66 0.0136 0.66 0.00014 0.66 72 0.0903 0.72 0.00090 0.72 78 0.4127 0.78 0.00413 0.78 84 0.5826 0.84 0.00583 0.84 90 0.9727 0.9 0.00973 0.90 96 0.9562 0.96 0.00956 0.96 102 0.8603 1.02 0.00860 1.02 108 0.6957 1.08 0.00696 1.08 114 0.4424 1.14 0.00442 1.14 120 0.2425 1.2 0.00243 1.20 126 0.1335 1.26 0.00134 1.26 132 0.0677 1.32 0.00068 1.32 138 0.0465 1.38 0.00046 1.38 144 0.0166 1.44 0.00017 1.44 150 0.0204 1.5 0.00020 1.50 156 0.0180 1.56 0.00018 1.56 162 0.0032 1.62 0.00003 1.62 168 0.0022 1.68 0.00002 1.68
Nilai Konsentrasi relatif 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0004 0.0140 0.0928 0.4243 0.5989 1.0000 0.9830 0.8845 0.7152 0.4548 0.2493 0.1373 0.0696 0.0478 0.0171 0.0209 0.0185 0.0033 0.0023
42 Tabel Lampiran 4. Hasil nilai konsentrasi data terhadap waktu No. Waktu tak berdimensi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Konsentrasi relatif 0.42 0.48 0.54 0.6 0.66 0.72 0.78 0.84 0.9 0.96 1.02 1.08 1.14 1.2 1.26 1.32 1.38 1.44 1.5 1.56 1.62
0.0000 0.0000 0.0000 0.0000 0.0190 0.0400 0.1360 0.3530 0.6670 0.9150 1.0000 0.8980 0.6780 0.4520 0.2760 0.1450 0.0830 0.0490 0.0330 0.0280 0.0240