• Tidak ada hasil yang ditemukan

IMPLEMENTASI MODEL UD DALAM PROGRAM PERHITUNGAN IMPLEMENTASI MODEL UD DALAM PROGRAM PERHITUNGAN

Dalam dokumen Plaxis82_Indonesian_3-ModelMaterial.pdf (Halaman 117-126)

9 MODEL TANAH DARI PENGGUNA MODEL TANAH DARI PENGGUNA

9.2 IMPLEMENTASI MODEL UD DALAM PROGRAM PERHITUNGAN IMPLEMENTASI MODEL UD DALAM PROGRAM PERHITUNGAN

9 MODEL TANAH DARI PENGGUNAMODEL TANAH DARI PENGGUNA

9.1

9.1 PENGANTARPENGANTAR

PLAXIS Versi 8 mempunyai sebuah fasilitas berupa model yang dimasukkan oleh

pengguna yang disebut sebagai model UD (user-defined ) atau model dari pengguna. Fasilitas ini memungkinkan pengguna untuk menggunakan model konstitutif tanah (hubungan antara tegangan-regangan-waktu) yang sangat beragam dalam PLAXIS. Model seperti ini harus diprogram dalam FORTRAN (atau bahasa pemrograman yang lain), dan kemudian disusun (di-compile) sebagai suatu Dynamic Link Library (DLL) dan kemudian ditambahkan ke dalam direktori program PLAXIS.

Pada prinsipnya, pengguna perlu menyediakan informasi mengenai kondisi tegangan serta state variable saat ini dan PLAXIS menyediakan informasi mengenai hal-hal tersebut pada waktu sebelumnya, dan juga informasi mengenai peningkatan regangan dan waktu. Dalam basis data material dari program Masukan PLAXIS, parameter model yang diperlukan dapat dimasukkan dalam kumpulan data material.

t t ij Δ

σ +t + Δt tegangan dan state variable saat ini

t ij

σ ,κ t tegangan dan state variable sebelumnya

Δ

ε ij,

Δ

t peningkatan regangan dan waktu

Sebagai contoh, subrutin model UD berdasarkan model material Drucker-Prager disediakan dalam direktori model tanah dari pengguna, yang disertakan dalam CD program. Dalam bab ini, diberikan penjelasan langkah-demi-langkah mengenai bagaimana model tanah dari pengguna dibentuk dan digunakan dalam PLAXIS.

Petunjuk :

Petunjuk : Perhatikan bahwa organisasi PLAXIS tidak dapat dimintai jawaban atas tidak berfungsinya atau kesalahan hasil akibat

implementasi dan/atau penggunaan model UD (model dari pengguna).

9.2

9.2 IMPLEMENTASI MODEL UD DALAM PROGRAM PERHITUNGANIMPLEMENTASI MODEL UD DALAM PROGRAM PERHITUNGAN

Program perhitungan PLAXIS telah didesain untuk dapat menggunakan model tanah yang dimasukkan oleh pengguna. Terdapat empat buah tugas (fungsionalitas) utama yang dilakukan dalam program perhitungan :

Inisialisasi state variables

Perhitungan dari tegangan konstitutif (tegangan yang dihitung dari model material pada langkah tertentu)

Pembentukan matriks kekakuan efektif dari material

Pembentukan matriks kekakuan elastis dari material

MANUAL MODEL MATERIAL

Keempat tugas utama ini (dan tugas lainnya) harus didefinisikan oleh pengguna dalam sebuah subrutin yang disebut sebagai "User_Mod". Dalam subrutin ini lebih dari satu model UD dapat didefinisikan. Jika sebuah model UD digunakan dalam suatu aplikasi, program perhitungan akan memanggil tugas yang berkaitan dari subrutin User_Mod. Untuk membuat sebuah model UD, subrutin User_Mod harus mempunyai struktur sebagai berikut :

SubRoutine User_Mod (IDTask, iMod, IsUndr, iStep, iter, Iel, Int, X, Y, Z, Time0, dTime, Props, Sig0, Swp0, StVar0, dEps, D, Bulk_W, Sig, Swp, StVar, ipl, nStat, NonSym, iStrsDep,

iTimeDep, iTang, iPrjDir, iPrjLen,

iAbort)

dimana :

IDTask = Identifikasi dari tugas (1 = Inisialisasi state variables; 2 = Hitung tegangan konstitutif; 3 = Bentuk matriks kekakuan efektif dari material; 4 = Tentukan jumlah state variables; 5 = Tentukan atribut matriks (NonSym,iStrsDep,iTimeDep); 6 = Bentuk matriks kekakuan elastis dari material)

iMod = Jumlah model UD atau model dari pengguna (Pilihan ini mengijinkan penggunaan lebih dari satu model UD.)

IsUndr = Kondisi teralir (IsUndr = 0) atau kondisi tak terdrainase (IsUndr = 1)

iStep = Nomor langkah perhitungan saat ini

iter = Nomor iterasi saat ini

Iel = Nomor elemen saat ini

Int = Nomor titik tegangan lokal saat ini (1..3 untuk elemen dengan 6 titik nodal, atau 1..12 untuk elemen dengan 15 titik nodal)

X,Y,Z = Koordinat global dari titik tegangan saat ini

Time0 = Waktu dimulainya langkah saat ini

dTime = Peningkatan waktu dari langkah saat ini

Props = Matriks(1..50) berisi parameter model UD untuk titik tegangan saat ini

Sig0 = Matriks(1..6) berisi komponen tegangan efektif sebelumnya (= pada saat dimulainya langkah saat ini) dari titik tegangan saat ini (σ

xx0, σ

yy0, σ

zz 0, σ

xy0, σ

yz 0, σ

zx0).

Dalam perhitungan 2D σ yz dan σ zx harus bernilai nol.

Swp0 = Tekanan air pori berletih pada titik tegangan saat ini

StVar0 = Matriks (1..nStat) berisi nilai state variables sebelumnya dari titik tegangan saat ini

MODEL TANAH DARI PENGGUNA

dEps = Matriks(1..6) berisi peningkatan regangan dari titik tegangan saat ini dalam langkah saat ini (

Δ

ε xx,

Δ

ε yy,

Δ

ε zz ,

Δ

γ xy,

Δ

γ yz ,

Δ

γ zx,)

D = Matriks kekakuan efektif material dari titik tegangan saat ini (1..6, 1..6)

Bulk_W = Modulus bulk dari air untuk titik tegangan saat ini (untuk perhitungan tak terdrainase dan konsolidasi)

Sig = Matriks(1..6) berisi hasil tegangan konstitutif dari titik tegangan saat ini (σ

xx, σ

yy, σ

zz , σ

xy, σ

yz , σ

zx)

Swp = Hasil tekanan air pori berlebih dari titik tegangan saat ini

StVar = Matriks(1..nStat) berisi hasil dari nilai dari state variables untuk titik tegangan saat ini

ipl = Indikator plastisitas:

0 = tanpa plastisitas,

1 = Titik (keruntuhan) Mohr-Coulomb, 2 = Titik pembatas tegangan tarik, 3 = Titik pembatas hardening , 4 = Titik pembatas friksi,

5 = Titik pembatashardening friksi.

nStat = Jumlah state variables (tidak terbatas)

NonSym = Parameter yang menunjukkan apakah matriks kekakuan material adalah non-simetris (NonSym = 1) atau tidak (NonSym = 0) (diperlukan untuk penyimpanan matriks dan solusinya).

iStrsDep = Parameter yang menunjukkan apakah matriks kekakuan material bergantung pada tegangan (iStrsDep = 1) atau tidak (iStrsDep = 0).

iTimeDep = Parameter yang menunjukkan apakah matriks kekakuan material bergantung pada waktu (iTimeDep = 1) atau tidak (iTimeDep = 0).

iTang = Parameter yang menunjukkan apakah matriks kekakuan material berupa matriks kekakuan tangensial, yang akan digunakan dalam proses iterasi Newton-Raphson secara penuh (iTang =1) atau tidak

(iTang = 0).

iPrjDir = Direktori proyek (untuk tujuan memperbaiki program ataudebugging )

iPrjLen = Panjang dari nama direktori proyek (untuk keperluan debugging )

iAbort = Parameter untuk menghentikan proyek secara paksa (iAbort = 1). Diatas, "peningkatan" mempunyai arti "kontribusi total dalam langkah saat ini" dan bukan untuk tiap iterasi. "Sebelumnya" mempunyai arti "pada saat dimulainya langkah

MANUAL MODEL MATERIAL

Dalam terminologi dari parameter-parameter di atas, diasumsikan bahwa digunakan jenis parameter standar, yaitu parameter yang dimulai dengan karakter A-H dan O-Z adalah jenis double floating point (8-byte) dan parameter lainnya adalah jenis integer sebesar 4-byte.

Parameter IDTask hingga dEps dan iPrjDir dan iPrjLen adalah parameter masukan; nilai dari parameter-parameter ini disediakan oleh PLAXIS dan dapat digunakan dalam subrutin. Parameter masukan ini tidak boleh diubah (kecuali untuk

StVar0 dalam kasus IDTask = 1). Parameter D hingga iTang dan iAbort adalah parameter keluaran. Nilai dari parameter-parameter ini harus ditentukan oleh pengguna.Dalam kasus

IDTask = 1,StVar0 menjadi parameter keluaran.

Subrutin dari pengguna harus memuat kode program untuk daftar tugas dan parameter keluaran (IDTask = 1 hingga 6). Setelah mendeklarasikan variabel, subrutin User_Mod harus mengikuti struktur berikut (ditentukan disini dalam kode pseudo):

Case IDTask of 1 Begin

{ Inisialisasi states variables StVar0 } End

2 Begin

{ Menghitung tegangan konstitutif Sid (dan Swp) } End

3 Begin

{ Membentuk matriks kekakuan efektif dari material D } End

4 Begin

{ Menghasilkan jumlah state variables nStat } End

5 Begin

{ Menghasilkan atribut matriks NonSym, iStrsDep, iTimeDep }

End 6 Begin

{ Membentuk matriks kekakuan elastis dari material De } End

End Case

Jika lebih dari satu model UD yang ditinjau, pembedaan harus dilakukan antara mdel yang berbeda, yang ditunjukkan dengan jumlah model UDiMod.

Inisialisasi "state variables" (

Inisialisasi "state variables" ( IDTask = 1IDTask = 1 ) )

Variabel " state" atau " state variables" (juga disebut sebagai parameter hardening ), sebagai contoh, digunakan dalam modelhardening untuk menunjukkan posisi titik leleh setiap saat. Pembaharuan dari state variables dilakukan dalam perhitungan tegangan konstitutif berdasarkan nilai sebelumnya dari state variables dan kondisi tegangan yang

MODEL TANAH DARI PENGGUNA baru. Karena itu perlu untuk mengetahui tentang nilai awal dari state variables, yaitu nilai pada saat langkah perhitungan dimulai. Dalam tahap perhitungan yang berkesinambungan, state variables secara otomatis dipindahkan dari satu langkah perhitungan ke langkah yang lain. Hasil berupa nilai state variables dalam langkah sebelumnya,StVar, disimpan dalam berkas keluaran dan secara otomatis digunakan sebagai nilai awal dalam langkah saat ini, StVar0. Saat memulai tahap perhitungan baru, nilai awal dari state variables dibaca dari berkas keluaran dari langkah perhitungan sebelumnya dan digunakan dalam matriks StVar0. Dalam kasus ini tidak perlu untuk memodifikasi matriksStVar0.

Namun demikian, jika langkah perhitungan sebelumnya tidak memuat informasi mengenai state variables (misalnya dalam langkah perhitungan yang pertama kali), matriks StVar0 akan berupa matriks nol. Untuk kasus ini maka nilai awal harus dihitung berdasarkan kondisi aktual (kondisi tegangan aktual) pada saat dimulainya langkah perhitungan. Sebagai contoh, tinjau suatu situasi dimana state variables pertama adalam tegangan efektif rata-rata minimum, p

(dengan kompresi adalah negatif). Jika tegangan awal telah dibentuk dengan menggunakan Prosedur-K 0, maka tegangan efektif awal tidak bernilai nol, tetapi nilai awal dari state variable adalah nol, karena inisialisasi variabel dari pengguna ini tidak termasuk dalam Prosedur-K 0. Dalam hal ini, bagian ke-1 subrutin dari pengguna akan berbentuk :

1 Begin

{ Inisialisasi states variables StVar0 } p = (Sig0[1] + Sig0[2] + Sig0[3]) / 3.0 StVar0[1] = Min(StVar0[1],p)

End

Menghitung tegangan konstitutif (

Menghitung tegangan konstitutif ( IDTask = 2 IDTask = 2 ) )

Tugas ini meliputi bagian utama subrutin dari pengguna dimana integrasi tegangan dan koreksinya dilakukan sesuai dengan formulasi model tanah dari pengguna.Tinjau sebuah contoh sederhana yang menggunakan matriks linier elastis D seperti yang dibentuk dalamIDTask = 3.

Dalam kasus ini komponen tegangan,Sig, dapat secara langsung dihitung dari tegangan awal, Sig0, matriks kekakuan material, D, dan peningkatan regangan, dEps, yaitu

Sig[i] = Sig0[i] +

Σ

(D[i, j] * dEps[ j]). Dalam kasus ini, bagian ke-2 subrutin dari pengguna akan berbentuk sebagai berikut :

2 Begin

{ Menghitung tegangan konstitutif Sig (dan Swp) } For i=1 to 6 do

Sig[i] = Sig0[i] For j=1 to 6 do

Sig[i] = Sig[i] + D[i,j]*dEps[j] End for {j}

End for {i}

MANUAL MODEL MATERIAL

Membentuk matriks kekakuan efektif dari material

Membentuk matriks kekakuan efektif dari material ( ( IDTask = 3 IDTask = 3 ) )

Matriks kekakuan material, D, dapat berupa sebuah matriks yang hanya memuat komponen elastis dari hubungan tegangan-regangan (seperti pada kasus untuk model tanah yang berada dalam PLAXIS), atau dari matriks kekakuan material yang sepenuhnya bersifat elastoplastis (matriks kekakuan tangensial). Tinjau contoh yang sangat sederhana dari hukum elastisitas linier isotropis dari Hooke. Hanya ada dua buah parameter saja yang digunakan : modulus Young, E , dan angka Poisson, ν . parameter ini masing-masing disimpan dalam posisi 1 dan 2 dari matriks parameter model, Props(1..50). Pada kasus ini, bagian ke-3 subrutin dari pengguna akan berbentuk sebagai berikut :

3 Begin

{ Membentuk matriks kekakuan efektif dari material D }

E = Props[1]

v = Props[2]

G = 0.5*E/(1.0+v)

Fac = 2*G/(1.0-2*v) {pastikan bahwa v < 0.5 !!) Term1 = Fac*(1-v) Term2 = Fac*v D[1,1] = Term1 D[1,2] = Term2 D[1,3] = Term2 D[2,1] = Term2 D[2,2] = Term1 D[2,3] = Term2 D[3,1] = Term2 D[3,2] = Term2 D[3,3] = Term1 D[4,4] = G D[5,5] = G D[6,6] = G End

(Secara pra-pilih,D akan diinisialisasi menjadi nol, sehingga komponen matriks lainnya tetap bernilai nol; namun demikian, menyatakan nol secara eksplisit merupakan suatu kebiasaan yang baik.)

Jika meninjau perilaku tak terdrainase (IsUndr = 1), maka sebuah kekakuan bulk untuk air (Bulk_W) harus ditentukan pada akhir dari bagian ke-3. Setelah memanggil subrutin pengguna dengan IDTask = 3 dan IsUndr = 1, PLAXIS secara otomatis akan menambahkan kekakuan dari air ke matriks kekakuan material, D, sedemikian rupa

MODEL TANAH DARI PENGGUNA sehinggaD[i=1..3, j=1..3] =D[i, j] +Bulk_W. Jika Bulk_W tidak didefinisikan, maka PLAXIS akan menggunakan nilai pra-pilih sebesar 100

×

rata-rata dariD[i=1..3, j=1..3].

Mengembalikan jumlah state variables (

Mengembalikan jumlah state variables ( IDTask = 4IDTask = 4 ) )

Bagian subrutin dari pengguna ini mengembalikan parameternStat, yaitu jumlah dari state variable. Pada kasus dari state variable tunggal, subrutin dari pengguna akan berbentuk sebagai berikut :

4 Begin{ Menghasilkan jumlah state variables nStat } nStat = 1

End

Mengembalikan atribut matriks (

Mengembalikan atribut matriks ( IDTask = 5 IDTask = 5 ) )

Matriks kekakuan material dapat bergantung terhadap tegangan (seperti misalnya dalam model Hardening Soil) atau bergantung terhadap waktu (seperti misalnya dalam model Soft Soil Creep). Saat menggunakan matriks kekakuan tangensial, matriks tersebut bahkan dapat menjadi non-simetris, misalnya dalam kasus plastisitas yang tidak terasosiasi. Bagian terakhir subrutin dari pengguna digunakan untuk melakukan inisialisasi atribut matriks untuk memperbaharui dan menyimpan matriks kekakuan global secara benar selama proses perhitungan. Untuk contoh sederhana dari hukum Hooke seperti telah dibahas sebelumnya, matriks akan berbentuk simetris dan tidak bergantung terhadap tegangan ataupun terhadap waktu. Pada kasus ini subrutin dari pengguna akan berbentuk sebagai berikut :

5 Begin

{ Menghasilkan atribut matriks NonSym, iStrsDep, }

{ iTimeDep, iTang } NonSym = 0 iStrsDep = 0 iTimeDep = 0 iTang = 0 End

UntukNonSym = 0 hanya setengah dari matriks kekakuan global yang disimpan dengan menggunakan profil struktur, dan untuk NonSym = 1 seluruh profil matriks akan disimpan.

Untuk iStrsDep = 1 maka matriks kekakuan global dibentuk dan mengalami dekomposisi pada awal dari tiap langkah perhitungan berdasarkan kondisi tegangan aktual (prosedur Newton-Raphson termodifikasi).

Untuk iTimeDep = 1 maka matriks kekakuan global dibentuk dan mengalami dekomposisi saat langkah waktu berubah.

UntukiTang = 1 maka matriks kekakuan global dibentuk dan mengalami dekomposisi pada awal dari setiap iterasi berdasarkan kondisi tegangan aktual (prosedur

MANUAL MODEL MATERIAL

Menghasilkan matriks kekakuan elastis dari material (

Menghasilkan matriks kekakuan elastis dari material ( IDTask = 6 IDTask = 6 ) )

Matriks kekakuan elastis dari material, De, merupakan bagian elastis dari matriks kekakuan efektif dari material seperti telah dijelaskan sebelumnya.

Pada kasus dimana matriks kekakuan efektif dari material diambil sebagai matriks kekakuan elastis, matriks ini dapat diadopsi langsung disini. Namun demikian, pada kasus dimana matriks elastoplastis atau tangensial digunakan untuk matriks kekakuan efektif, maka matriks yang akan dibentuk disini harus hanya memuat komponen-konponen elastis saja.

Alasan bahwa diperlukan matriks kekakuan elastis dari material adalah karena PLAXIS

menghitung kekakuan global relatif saat ini dari model elemen hingga sebagai suatu kesatuan (CSP = Current Stiffness Parameter atau parameter kekakuan saat ini). Parameter CSP didefinisikan sebagai :

CSP = Kerja elastis total / Kerja total

Matriks kekakuan elastis dari material diperlukan untuk menghitung kerja elastis total dalam definisi dariCSP . CSP akan bernilai satu jika seluruh material adalah elastis dan secara bertahap akan semakin kecil hingga bernilai nol saat keruntuhan tercapai. Parameter CSP digunakan dalam perhitungan kesalahan global. Kesalahan global didefinisikan sebagai : Kesalahan global = sebelumnya aktif beban ini saat aktif beban seimbang tak gaya

+

CSP

Gaya tak seimbang merupakan perbedaan antara gaya eksternal dan reaksi internal. Beban aktif saat ini adalah beban yang sedang diaktifkan dalam tahap perhitungan saat ini, dimana beban aktif sebelumnya adalah beban yang telah diaktifkan dalam tahap perhitungan sebelumnya dan masih aktif dalam tahap perhitungan saat ini.

Dengan menggunakan definisi di atas untuk kesalahan global yang dikombinasikan dengan kesalahan yang ditoleransi secara tetap akan menghasilkan kondisi keseimbangan yang lebih baik saat plastisitas mengalami peningkatan atau keruntuhan tercapai. Ide yang digunakan adalah bahwa ketidakseimbangan yang kecil bukan merupakan suatu masalah jika kondisi yang berlangsung hampir seluruhnya bersifat elastis, tetapi untuk secara akurat menghitung kondisi keruntuhan, faktor keamanan atau daya dukung, harus digunakan kondisi keseimbangan yang lebih teliti.

Bagian ke-6 subrutin dari pengguna terlihat serupa dengan bagian ke-3, kecuali bahwa di sini hanya digunakan komponen-komponen elastis saja. Harus diperhatikan bahwa variabel D yang sama digunakan untuk menyimpan matriks kekakuan elastis dari material, dimana dalam bagian ke-3 variabel ini digunakan untuk menyimpan matriks kekakuan efektif dari material.

MODEL TANAH DARI PENGGUNA

6 Begin

{ Membentuk matriks kekakuan material D } D[1,1] = D[1,2] = D[1,3] = ... D[6,6] = End End Case

Menggunakan subrutin yang telah tersedia Menggunakan subrutin yang telah tersedia

Untuk menyederhanakan pembuatan subrutin dari pengguna, sejumlah subrutin FORTRAN dan fungsi-fungsi untuk vektor dan operasional matriks tersedia dalam

PLAXIS di dalam beberapa compiler libraries tertentu (LFUsrLib.lib atau DFUsrLib.lib)

dan dalam kode program (disertakan di dalam berkas dengan subrutin dari pengguna). Subrutin yang tersedia dapat digunakan oleh subrutin User_Mod untuk memperpendek kode program. Gambaran umum mengenai subrutin yang tersedia diberikan dalam Lampiran B.

Menyusun (compiling) subrutin dari pengguna Menyusun (compiling) subrutin dari pengguna

Subrutin dari pengguna, User_Mod, harus disusun (compiled ) ke dalam berkas DLL dengan menggunakan compiler yang tepat. Perhatikan bahwa compiler yang digunakan harus memiliki pilihan untuk penyusunan berkas DLL. Berikut adalah contoh dari dua buahcompiler FORTRAN yang berbeda. Hal ini bertujuan agar subrutin dari pengguna,

User_Mod, dimuat dalam berkas USRMOD.FOR.

Setelah membentuk subrutin User_Mod dari pengguna, sebuah perintah harus disertakan untuk mengekspor data ke dalam DLL.

Pernyataan berikut harus disisipkan dalam subrutin tepat setelah deklarasi dari variabel :

Dengan Lahey Fortran (LF90, LF95, …) : DLL_Export User_Mod

Dengan Digital Visual Fortran : !DEC$ ATTRIBUTES DLLExport :: User_Mod

Untuk menyusun USRMOD.FOR menjadi sebuah berkas DLL, perintah berikut harus dijalankan :

Dengan Lahey Fortran 90 : LF90 -win -dll USRMOD.FOR -lib LFUsrLib

Dengan Lahey Fortran 95 : LF95 -win -dll USRMOD.FOR -lib LFUsrLib -ml LF90

Dengan Digital Visual Fortran : DF /winapp USRMOD.FOR DFUsrLib.lib /dll Dalam semua kasus berkas USRMOD.DLL akan dibentuk. Berkas ini harus berada dalam direktori program PLAXIS, sehingga dapat digunakan secara bersamaan dengan program perhitungan PLAXIS yang telah ada (PLASW.EXE). Saat model UD digunakan,

MANUAL MODEL MATERIAL

Kemungkinan memperbaiki program Kemungkinan memperbaiki program

Saat pembuatan program komputer, umumnya sebagian waktu digunakan untuk "memperbaiki" (debug ) kode program yang ditulis sebelumnya. Untuk dapat secara efektif memperbaiki subrutin dari pengguna, harus ada kemungkinan bagi pengguna untuk menulis data ke dalam suatu berkas. "Berkas perbaikan" ("debug-file") seperti ini tidak secara otomatis tersedia dan harus dibuat dalam subrutin dari pengguna. Dalam Lampiran C diberikan sebuah saran tentang bagaimana melakukan hal ini. Setelah pembuatan berkas perbaikan (debug-file), maka data dapat dituliskan ke dalam berkas ini dari dalam subrutin dari pengguna. Hal ini dapat dilakukan, misalnya, dengan menggunakan subrutin yang telah tersedia (lihat Lampiran B).

9.3

9.3 MASUKAN DARI PARAMETER MODEL UD MELALUI ANTARMUKA-MASUKAN DARI PARAMETER MODEL UD MELALUI

Dalam dokumen Plaxis82_Indonesian_3-ModelMaterial.pdf (Halaman 117-126)