Difference between revisions of "Muhammad Helmy Yusuf"

From ccitonlinewiki
Jump to: navigation, search
Line 796: Line 796:
 
  end Tugas4TrussNomor8;
 
  end Tugas4TrussNomor8;
  
Sehingga dala persoalan tersebut didapatkan hasil dari displacement (U) dan Reaction force (R) sebagai berikut :
+
Sehingga dalam persoalan tersebut didapatkan hasil dari displacement (U) dan Reaction force (R) sebagai berikut :
[[File:Simulate.png|700px|center]]
 
 
 
  
 +
[[File:Simulate.png|1300px|thumb|center|Hasil ''Displacement''(U) dan ''reaction force''(R)]]
 +
[[File:Screenshot 2020-12-09 215708.png|1300px|thumb|center|Grafik ''Displacement''(U) dan ''reaction force''(R)]]
 +
berikut adalah video terkait penyelesaian 3D Truss menggunakan OpenModelica :
 
<div class="center" style="width: auto; margin-left: auto; margin-right: auto;">
 
<div class="center" style="width: auto; margin-left: auto; margin-right: auto;">
 
<youtube width="200" height="100">https://youtu.be/DwET3xY7a48</youtube>
 
<youtube width="200" height="100">https://youtu.be/DwET3xY7a48</youtube>
 
</div>
 
</div>

Revision as of 22:04, 9 December 2020

السَّلاَمُ عَلَيْكُمْ وَرَحْمَةُ اللهِ وَبَرَكَاتُهُ

Muhammad Helmy Yusuf
Center
Nama Lengkap Muhammad Helmy Yusuf
NPM 1906301236
Jurusan Teknik Mesin
Alamat Surel muhammad.helmy@ui.ac.id


Muhammad Helmy Yusuf (lahir di Kebumen, 13 Juni 2001; umur 19 tahun) adalah seorang mahasiswa Teknik Mesin Universitas Indonesia angkatan 2019. Selain menjalankan tugas utama menjadi mahasiswa, Helmy dikenal aktif dalam berorganisasi dan aktif melakukan kegiatan sosial yang dapat bermanfaat dan berdampak untuk orang lain.

Mukadimah

Helmy lahir di Kebumen, Jawa Tengah. Saat sebelum dilahirkan, orang tuanya mengubah namanya hingga 5 kali. Mereka akhirnya memberi nama Helmy, yang Yusuf diberi oleh ibunya dengan harapan menjadi pribadi penyabar dan tumbuh menjadi laki - laki pemaaf dan setampan Nabi Yusuf AS serta memiliki kepribadian luhur seperti Nabi Muhammad SAW.


Helmy menjalani proses pendidikan dasar hingga SMA di Kota Depok. Semasa pendidikannya, Helmy juga aktif dalam berbagai kegiatan ekstrakulikuler sekolah seperti mengikuti Futsal maupun rohani Islam di sekolahnya dan berhasil menjuarai berbagai macam turnamen olahraga maupun akademis. Sehabis menyelesaikan pendidikan SMA-nya di SMAN 2 Depok, pada tahun 2019 ia mengambil jurusan Teknik Mesin di Universitas Indonesia.


Selama berkuliah, Helmy juga mengikuti beberapa organisasi, kepanitiaan, bahkan kegiatan sosial pun pernah diikuti. Saat ini ia menjabat sebagai Badan Pengurus Penelitian dan Pengembangan (LITBANG) di IMM FTUI dan TIS FTUI. Tak hanya di lingkup kampus, ia juga mengikuti organisasi kepemudaan di Indonesia bernama Young On Top dan pernah menjadi Project Officer dalam acara organisasi tersebut. Di TIS FTUI, ia juga menjadi kesatria pengajar dimana mengajar anak-anak di lapak pemulung daerah karang pola, Pasar Minggu, Jakarta Selatan. Melalui hal-hal yang diikutinya membuat Helmy memiliki skill dalam mengolah data, menganalis, mengevaluasi suatu hal berdasarkan data yang diperoleh, dan skill manajemen personal yang baik. Selain itu juga tumbuh kepedulian terhadap sesama dalam dirinya.


Metode Numerik

Metode numerik merupapakan teknik dalam penyelesaian permsalahan yang diformulasikan secara matematis dengan menggunakan operasi hitungan (aritmatik) yaitu operasi tambah, kurang, kali, dan bagi. Metode ini digunakan karena banyak permasalahan matematis tidak dapat diselesaikan menggunakan metode analitik.

Pada kelas Metode Numerik-02 semester gasal 20120/2021, perkuliahan pekan pertama sampai UTS diisi oleh Bapak Dr. Ir. Engkos A. Kosasih, M.T. Dimana telah membahas materi seperti:

  • Pseudocode
  • Sistem Persamaan
  • Turunan Numerik
  • Metode Newton Rhapson, Secant, dan Bisection
  • Regresi Linear
  • Interpolasi

Barulah sehabis UTS proses pembelajaran diisi oleh Bapak Dr. Ir. Ahmad Indra Siswantara

Pertemuan Perkuliahan

Pertemuan Pertama (Rabu, 11 November 2020)

Pada pertemuan pertama setelah UTS diisi oleh Bapak Dr. Ir. Ahmad Indra Siswantara. Dimana dijelaskan terkait esensi atau tujuan pembelajaran metode numerik, yaitu:

1. Memahami konsep-konsep dan prinsip-prinsip dasar dalam metode numerik seperti:Persamaan algoritma, aljabar, pencocokan kurva, persamaan diferensial parsial, dan lainnya

2. Mengerti dan mampu menerapkan pemahaman atau aplikasi terhadap konsep metode numerik

3. Mampu menerapkan metode numerik dalam hal terkait persoalan keteknikan

4. Mendapat nilai tambah/adab sehingga kita menjadi orang yang lebih beradab

Selain empat poin tersebut, kami juga mendapat pelajaran terkait awalan memakai OpenModelica. Dimana kami diperlihatkan praktek sederhana penggunaan OpenModelica ini. Hingga kami tahu bila komputer selain dapat membantu dalam menyelesaikan permasalahan namun juga memiliki batasan atau limit tertentu seperti tidak mampu menentukan nilai 1/0 yang hanya Tuhan yang tahu nilainya. Pelajaran yang dapat dipetik dari kejadian ini ialah kita sebagai manusia haruslah beriman dan jangan pernah melupakan Tuhan yang mengetahui segalanya.

Tugas 1

Pada pertemuan pertama setelah UTS pada tanggal 11 November 2020, kami diminta untuk mempelajari dan memahami penggunaan OpenModelica. Dimana OpenModelica ini merupakan suatu software yang menggunakan bahasa program modelica untuk melakukan simulasi dan perhitungan lainnya. Untuk mempelejarinya saya belajar dari beberapa sumber di YouTube, saya menonton beberapa video dari youtube dalam proses pembelajarannya. Berikut adalah yang telah saya tonton:

Selain itu kami diminta membuat video hasil pembelajaran dan pada video kali ini, saya akan menjelaskan terkait apa yang sudah saya pelajari tentang open modelica dan juga penerapan atau simulasi sederhananya. Berikut rekaman videonya:

pengalaman perdana saya setelah mencobanya, saya merasakan disini menyediakan beberapa fitur yang ramah pengguna untuk membuat, menjelajah, mengedit, dan mensimulasikan model.



Pertemuan Kedua (Rabu, 18 November 2020)

Pada pertemuan kedua ini diawali dengan penjelasan pak Dai tentang orang yang beruntung itu adalah orang yang menjalani hari ini lebih baik dari hari kemarin, dimana memiliki gradien hidup positif. sedangkan apabila masih sama saja berarti gradiennya 0. Bila lebih buruk dari hari kemarin gradiennya negatif. Jadi usahakan untuk lebih baik dari hari sebelumnya dan terus bersikap positif. Kami juga dijelaskan bahwa setiap bahasa ada compilernya, compiler biasa digunakan untuk program komputer yang menerjemahkan program yang ditulis dalam bahasa pemograman tingkat tinggi seperti fortran, pascal, basic, c++ itu diterjemahkan kedalam bahasa mesinnya. Compiler juga berpengaruh ke kecepatan pemrosesannya karena kodingnya akan berbeda beda yang dihasilkan meskipun prinsipnya sama. Compiler biasanya untuk mahasiswa engineering diantaranya fortran dan c karena engineering sangat penting untuk kecepatan perhitungan itu.


Modelica ,singkatnya adalah sebuah bahasa, namun bukan bahasa pemograman/koding. sebenernya koding hanya saja lebih ke bahasa pemodelan. Modelica dibuat dan di desain untuk bahasa pemodelan, dan bukan semata mata untuk bahasa koding seperti python, c, c++ dsb. klo modelica itu bahasa pemodelan. Namun dalam melakukan perhitungannya, sebelom melakukan perhitungan, kode kita yg dituliskan di modelica itu diterjemahkan dulu dalam bahasa c. setelah itu baru dikompilasi ke dalam bahasa mesin baru dapat executable file nya. Kemudian ketika klik simulate lama karena butuh waktu menerjemahkan bahasa modelica ke bahasa c kemudian juga mencompile ke bahasa mesinnya/komputer. sehingga dapat file yg dapat dieksekusi. kalau mau cepat menggunakan parameter-parameter yang dirubah itu dalam bentuk syntaxnya itu parameter, sehingga kita bisa merubah nilainya kemudian tanpa mensimulate ulang.


Di dalam OpenModelica juga memiliki nilai plus. yaitu :
*(+) Bukan semata - mata bahasa koding, namun dia bahasa pemodelan. Dimana kita seorang engineering yang memang bukan khusus membuat koding, tapi kita membuat model dan cocok untuk insiyur, juga perhitungannya lumayan cepat juga banyak penggunanya. dan banyak aplikasi2 yg dikembangkan disini
*(+) Memudahkan kita untuk cross function atau mempelajari berbagai dasar ilmu dalam 1 software
*(+) Open teknologi dan free. beda dengan mathlab dan lainnya yg berbayar


Selanjutnya, Pak Dai juga memerintahkan kami untuk ikut mencoba membuat sebuah function dan class yang nantinya akan dihubungkan. Lewat Share screen yang dipandu oleh Pak Dai, saya mulai mencoba dan mendapatkan hasil yang sama. Ilustrasinya sebagai berikut:

344476.jpg

Fungsi yang dibuat yaitu "Fungsi Tambah X1" dengan X sebagai input, Y sebagai output, dan Fungsi yang dibuat adalah Y=10+X. Setelah itu membuat class "Panggil" dimana berfungsi untuk memanggil fungsi tambah X1 yang tadi dibuat. Untuk mendapatkan nilai output Y maka dimasukkanlah nilai input X1. Contohnya saat dibimbing oleh Pak Dai, kami memasukkan X1 sebesar 5. Sehingga didapatkan Hasil yang sesuai yaitu 15. serta dapat diubah-ubah X1 nya dengan re-simulate untuk mendapatkan nilai outputnya.

Tugas 2

Kami diminta untuk mengerjakan aljabar simultan dengan menggunakan variabel array di open modelica. Aljabar simultan adalah metode penyelesaian persoalan matematik yang melibatkan kekompleksan yang sangat rumit sehingga memerlukan cara penyelesaian yang membuatnya simple dengan menggunakan tools yang ada, seperti komputer dengan program visual basic, matlab atau lainnya.

beberapa metode yang terdapat pada aljabar simultan ialah :

1. metode Eliminasi Gauss

2. Metode Cramer

3. Gauss seidel

4. Gauss – jordan.


Sementara itu, variable array adalah variabel yang didalamnya memiliki beberapa data nilai. Contohnya, bila ada data X1, X2, X3 ,dan X4, makadengan menggunakan variabel array cukup dituliskan X[4] saja. Pada tugas 2 ini saya mencoba membuatnya menggunakan 3 persamaan yang sederhana dan memiliki 3 variabel yang harus dicari sebagai berikut :

Annotation 2020-11-25 141044.png

function

function Gauss_Jordan
input Real P[3,3];
input Real Q[3];
output Real X[3]; 
algorithm
X:=Modelica.Math.Matrices.solve(P,Q);
end Gauss_Jordan;

class

class SPL
parameter Real P[3,3]=[1,1,2;
                      -1,-2,3;
                      3,-7,4];
parameter Real
Q[3]={8,1,10};
Real X[3];
equation
X=Gauss_Jordan(P,Q);
end SPL;

Berikut adalah rekaman Video dari tugas 2:


Pertemuan Ketiga (Rabu, 25 November 2020)

Pada pertemuan ketiga kali ini diawali dengan menanyakan kabar dan juga kami diperintahkan untuk membagi/melakukan share screen terkait progress belajar metode numerik dan pemahaman tentang penggunaan OpenModelica. Kemudian dilakukan juga pembahasan tentang penggunaan OpenModelica pada permasalahan engineering. Pada permasalahan engineering, metode numerik dapat membantu menyelesaikan persoalan agar lebih cepat. Beberapa contoh metode numerik yang dapat membantu menyelesaikan permasalaha engineering diantaranya CFD(Computation fluid dynamics, Metode Stokastik, dan FEA ( FInite Element Analaysis). Tahapan untuk menyelesaikan masalah engineering menggunakan metode numerik:

  • 1. Melakukan analisis terhadap masalah engineering
  • 2. Melakukan pemodelan matematis dari masalah yang sudah dianalisis
  • 3. Menerjemahkan pemodelan matematis yang sudah dibuat menjadi metode numerik agar bisa dhitung oleh komputer
  • 4. Melakukan perhitungan metode numerik menggunakan software dan dihasilkanlah solusi dari masalah engineering tersebut

Ketika kelas kami juga mendapat penjabaran menarik mengenai aljabar simultan, variable array, dan metode Gauss. Kemudian ketika sedang membahas hal ini, saudara Christo yang diminta menjelaskan hasil tugasnya pun menjelaskan terkait apa yang sudah ia buat dan kami turut mendengarkan pemaparannya sembari mencatat hal-hal tersebut. Berikut adalah code modelica untuk Gauss Jordan :

function GaussJordan
input Real [:,:] A;//matriks awal
output Real [:,:] B;//matriks tereduksi
protected 
Integer h = 1;    //pivot row
Integer k = 1;    //pivot coloumn
Integer m = size(A,1); //jumlah baris
Integer n = size(A,2); //jumlah kolom
Integer c = 0;
Integer max_row; // Row index of max number in pivot column
Real [:] pivot_column;
Real [:] pivot_row;
Real [:,:] temp_array;
Real r;
Real float_error = 10e-10;
algorithm
B := A;
while h <= m and k <= n loop
 for i in 1 : m loop
   for j in 1 : n loop
    if abs(B[i,j]) <= float_error then
      B[i,j] := 0;
     end if;
   end for;
 end for;
//Finding pivot 
 pivot_column:= {B[i,h] for i in h:m};
   //Baris terbawah yang mempunyai dengan pivot tertinggi
   c:=h-1;
   for element in pivot_column loop
     c:= c+1;
     if abs(element)== max(abs(pivot_column)) then
       max_row :=c;
     end if;
   end for; 
 //Jika tidak ada pivot di kolom ini, pindah ke kolom selanjutnya
 if B[max_row,k] == 0 then
   k:=k+1;
 else 
   // tukar row h - max_row
   temp_array := B;
   temp_array[h] := B[max_row];
   temp_array[max_row] := B[h];
   B:= temp_array;
   //devide pivot row by pivot number
    B[h] := B[h]/B[h,k];
    for i in (h+1) :m loop
      r := B[i,k]/B[h,k];
     B[i,k]:=0;
     for j in (k+1) : n loop
       B[i,j] := B[i,j]-B[h,j] * r;
     end for;
   end for;
   //pindah ke pivot kolom dan row selanjutnya
   h := h+1;
   k := k+1;  
 end if;
 end while;
// proses dari kanan atas
h :=m;
k :=n;
while h >=1 and k>=1 loop
 //dealing with error
 for i in 1:m loop
   for j in 1:n loop
     if abs(B[i,j]) <=float_error then
       B[i,j]:=0;
     end if;
   end for;
 end for; 
//finding pivot 
   pivot_row := {B[h,i] for i in 1:k};
   //Get position index k of pivot 
   c := 0;
   for element in pivot_row loop
     c := c+1;
     if element <> 0 then
       break;
     end if;
   end for;
   k:= c;
 // no pivot in this row, move to next row
 if B[h,k] == 0 then 
   h:= h-1;
 else
   //perform row operatation
   for i in 1:(h-1) loop
     r := B[i,k];
     B[i] := B[i] - B[h] *r;
   end for;
   //move to next pivot row dan column
   h:=h+1;
   k:=k+1;
 end if; 
end while;    
end GaussJordan;


Tugas 3

Soal WhatssApp.jpg

Persamaan

class TrussesTugas

parameter Integer N=8; //Global matrice = 2*points connected
parameter Real A=0.001; //Area m2
parameter Real E=200e9; //Pa
Real G[N,N]; //global
Real Ginitial[N,N]; //global
Real Sol[N]; //global dispplacement
Real X[N]={0,0,-1035.2762,-3863.7033,0,0,-1035.2762,-3863.7033};
Real R[N]; //global reaction force
Real SolMat[N,1];
Real XMat[N,1];

//boundary condition
Integer b1=1;
Integer b2=3;

//truss 1
parameter Real X1=0; //degree between truss
Real k1=A*E/1;
Real K1[4,4]; //stiffness matrice
Integer p1a=1;
Integer p1b=2;
Real G1[N,N];

//truss 2
parameter Real X2=0; //degree between truss
Real k2=A*E/1;
Real K2[4,4]; //stiffness matrice
Integer p2a=2;
Integer p2b=3;
Real G2[N,N];

//truss 3
parameter Real X3=90; //degree between truss
Real k3=A*E/1.25;
Real K3[4,4]; //stiffness matrice
Integer p3a=2;
Integer p3b=4;
Real G3[N,N];

//truss 4
parameter Real X4=90+38.6598; //degree between truss
Real k4=A*E/1.6;
Real K4[4,4]; //stiffness matrice
Integer p4a=1;
Integer p4b=4;
Real G4[N,N];

//truss 5
parameter Real X5=90-38.6598; //degree between truss
Real k5=A*E/1.6;
Real K5[4,4]; //stiffness matrice
Integer p5a=3;
Integer p5b=4;
Real G5[N,N];

/*
for each truss, please ensure pXa is lower then pXb (X represents truss element number)
*/

algorithm

//creating global matrice
K1:=Stiffness_Matrices(X1);
G1:=k1*Local_Global(K1,N,p1a,p1b);

K2:=Stiffness_Matrices(X2);
G2:=k2*Local_Global(K2,N,p2a,p2b);

K3:=Stiffness_Matrices(X3);
G3:=k3*Local_Global(K3,N,p3a,p3b);

K4:=Stiffness_Matrices(X4);
G4:=k4*Local_Global(K4,N,p4a,p4b);

K5:=Stiffness_Matrices(X5);
G5:=k5*Local_Global(K5,N,p5a,p5b);

G:=G1+G2+G3+G4+G5;
Ginitial:=G;

//implementing boundary condition
for i in 1:N loop
 G[2*b1-1,i]:=0;
 G[2*b1,i]:=0;
 G[2*b2-1,i]:=0;
 G[2*b2,i]:=0;
end for;

G[2*b1-1,2*b1-1]:=1;
G[2*b1,2*b1]:=1;
G[2*b2-1,2*b2-1]:=1;
G[2*b2,2*b2]:=1;

//solving displacement
Sol:=Gauss_Jordan(N,G,X);

//solving reaction force
SolMat:=matrix(Sol);
XMat:=matrix(X);
R:=Reaction_Trusses(N,Ginitial,SolMat,XMat);

end TrussesTugas;

Transformasi Matriks

function Stiffness_Matrices
input Real A;
Real Y;
output Real X[4,4];
Real float_error = 10e-10;

final constant Real pi=2*Modelica.Math.asin(1.0);

algorithm

Y:=A/180*pi;
    
X:=[(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.cos(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y);

Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.sin(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.sin(Y))^2;

-(Modelica.Math.cos(Y))^2,-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.cos(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y);

-Modelica.Math.cos(Y)*Modelica.Math.sin(Y),-(Modelica.Math.sin(Y))^2,Modelica.Math.cos(Y)*Modelica.Math.sin(Y),(Modelica.Math.sin(Y))^2];

for i in 1:4 loop
 for j in 1:4 loop
   if abs(X[i,j]) <= float_error then
     X[i,j] := 0;
   end if;
 end for;
end for;


end Stiffness_Matrices;

Global Element Matrice

function Local_Global
input Real Y[4,4];
input Integer B;
input Integer p1;
input Integer p2;
output Real G[B,B];

algorithm

for i in 1:B loop
 for j in 1:B loop
     G[i,j]:=0;
 end for;
end for;

G[2*p1,2*p1]:=Y[2,2];
G[2*p1-1,2*p1-1]:=Y[1,1];
G[2*p1,2*p1-1]:=Y[2,1];
G[2*p1-1,2*p1]:=Y[1,2];

G[2*p2,2*p2]:=Y[4,4];
G[2*p2-1,2*p2-1]:=Y[3,3];
G[2*p2,2*p2-1]:=Y[4,3];
G[2*p2-1,2*p2]:=Y[3,4];

G[2*p2,2*p1]:=Y[4,2];
G[2*p2-1,2*p1-1]:=Y[3,1];
G[2*p2,2*p1-1]:=Y[4,1];
G[2*p2-1,2*p1]:=Y[3,2];

G[2*p1,2*p2]:=Y[2,4];
G[2*p1-1,2*p2-1]:=Y[1,3];
G[2*p1,2*p2-1]:=Y[2,3];
G[2*p1-1,2*p2]:=Y[1,4];

end Local_Global;


Reaction Matrice Equation

function Reaction_Trusses
input Integer N;
input Real A[N,N];
input Real B[N,1];
input Real C[N,1];
Real X[N,1];
output Real Sol[N];
Real float_error = 10e-10;

algorithm
X:=A*B-C;

for i in 1:N loop
 if abs(X[i,1]) <= float_error then
   X[i,1] := 0;
 end if;
end for;

for i in 1:N loop
 Sol[i]:=X[i,1];
end for;

end Reaction_Trusses;

Gauss Jordan

function Gauss_Jordan

input Integer N;
input Real A[N,N];
input Real B[N];
output Real X[N];
Real float_error = 10e-10;

algorithm
X:=Modelica.Math.Matrices.solve(A,B);

for i in 1:N loop
  if abs(X[i]) <= float_error then
    X[i] := 0;
  end if;
end for;

end Gauss_Jordan;
Grafik Displacement
Grafik Reaction Forces

Pertemuan Keempat (Rabu, 02 Desember 2020)

Pada pertemuan keempat pada tanggal 2 Desember diawali dengan mendiskusikan terkait tugas yang diberikan pada pekan sebelumnya. Disaat teman-teman memaparkan tugas yang dibuatnya ternyata terdapat perbedaan dalam penyelesaiannya, sehingga setelah itu dibahas lebih lanjut agar dapat menemukan penyelesaian yang lebih efektif

Kuis Class Diagram dan Flowchart

Pada pekan ke 4 kami juga diberikan kuis untuk membuat class diagram dan flowchart. kedua hal tersebut berasal dari coding penyelesaian trusses milik josiah enrico. Disini terdapat 5 coding seperti : class tusses, stiffness matrices, local global, gauss-jordan, dan reaction trusses berdasarkan yang josiah buat.

Terlebih dahulu kami diberi instruksi oleh pak dai untuk mendahulukan membuat class diagram dan dilanjutkan membuat flowchartnya.

ClassDiagram.helmy.png Flowcharthelmy.png Supportflowcharthelmy.png


Tugas 4

Pada PR keempat, kami diperintahkan untuk membuat class diagram, flowchart, dan coding OpenModelica

Nomer8pr4.png

Pertama, saya membuat terlebih dahulu class diagram dan Flowchartnya sebagai berikut :

T4.png

Dalam pengerjaan soal ini, saya membuat FBD terlebih dahulu untuk mencari data-data yang diperlukan, yaitu node, sudut, luas, modulus elastisitas, dan panjang dari tiap batang. Karena ini merupakan permasalahan 3D, maka sudut akan ada pada arah x, y, dan z.

Tugas4truss.png
StiffnessMatrixElement
function StiffnessMatrixElement

 input Real [:,9] inisiasi_mat;
 output Real [size(inisiasi_mat,1),6,6] Ke_mat;

 protected
   Real cos_x;
   Real cos_y;
   Real cos_z;
   Real [6] StiffTrig;
   Real [6,6] StiffTrans;
   Real [size(inisiasi_mat,1)] k_vec;

algorithm
 k_vec := {(inisiasi_mat[i,7] * inisiasi_mat[i,8] / inisiasi_mat[i,9]) for i in 1:size(inisiasi_mat,1)};

 // Finding stiffness matrix of each element member
 for i in 1:size(inisiasi_mat,1) loop

 // Clearing the matrices
 StiffTrig := zeros(6);
 StiffTrans := zeros(6,6);
  
 // Converting degrees to radians
 cos_x := inisiasi_mat[i,4];
 cos_y := inisiasi_mat[i,5];
 cos_z := inisiasi_mat[i,6];

 // {cos^2, sin^2, sincos}
 StiffTrig := {(cos_x)^2,
               (cos_y)^2,
               (cos_z)^2,
               (cos_x*cos_y),
               (cos_x*cos_z),
               (cos_y*cos_z)};
  
 // Construct stiffness transformation matrix
 StiffTrans := [  StiffTrig[1],    StiffTrig[4],    StiffTrig[5], -1*StiffTrig[1], -1*StiffTrig[4], -1*StiffTrig[5];
                  StiffTrig[4],    StiffTrig[2],    StiffTrig[6], -1*StiffTrig[4], -1*StiffTrig[2], -1*StiffTrig[6];
                  StiffTrig[5],    StiffTrig[6],    StiffTrig[3], -1*StiffTrig[5], -1*StiffTrig[6], -1*StiffTrig[3];
               -1*StiffTrig[1], -1*StiffTrig[4], -1*StiffTrig[5],    StiffTrig[1],    StiffTrig[4],    StiffTrig[5];
               -1*StiffTrig[4], -1*StiffTrig[2], -1*StiffTrig[6],    StiffTrig[4],    StiffTrig[2],    StiffTrig[6];
               -1*StiffTrig[5], -1*StiffTrig[6], -1*StiffTrig[3],    StiffTrig[5],    StiffTrig[6],    StiffTrig[3]];
                
 // Multiply in stiffness constant of element, add final stiffness matrix to Ke_mat
 for m in 1:6 loop
   for n in 1:6 loop
     Ke_mat[i,m,n] := k_vec[i] * StiffTrans[m,n];
   end for;
 end for;

end for;
end StiffnessMatrixElement;

Setelah itu dibuat matriks K global 12x12 dari masing-masing element

StiffnessMatrixGlobal
function StiffnessMatrixGlobal
 input Integer [:,2] n;
 input Integer x;
 input Integer y;
 input Real [y,6,6] Ke_mat; 
 output Real [y,x,x] Kg_mat;
  
algorithm
 for i in 1:y loop
   for a in 1:x loop
     for b in 1:x loop
       Kg_mat[i,a,b]:=0;
     end for;
   end for;
  end for;
 
 for i in 1:y loop
   Kg_mat[i,3*n[i,1],3*n[i,1]]:=Ke_mat[i,3,3];
   Kg_mat[i,3*n[i,1],3*n[i,1]-1]:=Ke_mat[i,3,2];
   Kg_mat[i,3*n[i,1],3*n[i,1]-2]:=Ke_mat[i,3,1];
   Kg_mat[i,3*n[i,1]-1,3*n[i,1]]:=Ke_mat[i,2,3];
   Kg_mat[i,3*n[i,1]-1,3*n[i,1]-1]:=Ke_mat[i,2,2];
   Kg_mat[i,3*n[i,1]-1,3*n[i,1]-2]:=Ke_mat[i,2,1];
   Kg_mat[i,3*n[i,1]-2,3*n[i,1]]:=Ke_mat[i,1,3];
   Kg_mat[i,3*n[i,1]-2,3*n[i,1]-1]:=Ke_mat[i,1,2];
   Kg_mat[i,3*n[i,1]-2,3*n[i,1]-2]:=Ke_mat[i,1,1];

   Kg_mat[i,3*n[i,2],3*n[i,2]]:=Ke_mat[i,6,6];
   Kg_mat[i,3*n[i,2],3*n[i,2]-1]:=Ke_mat[i,6,5];
   Kg_mat[i,3*n[i,2],3*n[i,2]-2]:=Ke_mat[i,6,4];
   Kg_mat[i,3*n[i,2]-1,3*n[i,2]]:=Ke_mat[i,5,6];
   Kg_mat[i,3*n[i,2]-1,3*n[i,2]-1]:=Ke_mat[i,5,5];
   Kg_mat[i,3*n[i,2]-1,3*n[i,2]-2]:=Ke_mat[i,5,4];
   Kg_mat[i,3*n[i,2]-2,3*n[i,2]]:=Ke_mat[i,4,6];
   Kg_mat[i,3*n[i,2]-2,3*n[i,2]-1]:=Ke_mat[i,4,5];
   Kg_mat[i,3*n[i,2]-2,3*n[i,2]-2]:=Ke_mat[i,4,4];

   Kg_mat[i,3*n[i,2],3*n[i,1]]:=Ke_mat[i,6,3];
   Kg_mat[i,3*n[i,2],3*n[i,1]-1]:=Ke_mat[i,6,2];
   Kg_mat[i,3*n[i,2],3*n[i,1]-2]:=Ke_mat[i,6,1];
   Kg_mat[i,3*n[i,2]-1,3*n[i,1]]:=Ke_mat[i,5,3];
   Kg_mat[i,3*n[i,2]-1,3*n[i,1]-1]:=Ke_mat[i,5,2];
   Kg_mat[i,3*n[i,2]-1,3*n[i,1]-2]:=Ke_mat[i,5,1];
   Kg_mat[i,3*n[i,2]-2,3*n[i,1]]:=Ke_mat[i,4,3];
   Kg_mat[i,3*n[i,2]-2,3*n[i,1]-1]:=Ke_mat[i,4,2];
   Kg_mat[i,3*n[i,2]-2,3*n[i,1]-2]:=Ke_mat[i,4,1];

   Kg_mat[i,3*n[i,1],3*n[i,2]]:=Ke_mat[i,3,6];
   Kg_mat[i,3*n[i,1],3*n[i,2]-1]:=Ke_mat[i,3,5];
   Kg_mat[i,3*n[i,1],3*n[i,2]-2]:=Ke_mat[i,3,4];
   Kg_mat[i,3*n[i,1]-1,3*n[i,2]]:=Ke_mat[i,2,6];
   Kg_mat[i,3*n[i,1]-1,3*n[i,2]-1]:=Ke_mat[i,2,5];
   Kg_mat[i,3*n[i,1]-1,3*n[i,2]-2]:=Ke_mat[i,2,4];
   Kg_mat[i,3*n[i,1]-2,3*n[i,2]]:=Ke_mat[i,1,6];
   Kg_mat[i,3*n[i,1]-2,3*n[i,2]-1]:=Ke_mat[i,1,5];
   Kg_mat[i,3*n[i,1]-2,3*n[i,2]-2]:=Ke_mat[i,1,4];
 end for;
end StiffnessMatrixGlobal;

Setelah itu semua matriks global dari masing-masing element akan dijumlahkan

SumStiffnessMatrixGlobal
function SumStiffnessMatrixGlobal
 input Integer x;
 input Integer y;
 input Real [y,x,x] Kg_mat;
 output Real [x,x] KgTot_mat;
  
algorithm
  for a in 1:x loop
   for b in 1:x loop
     KgTot_mat[a,b] := sum(Kg_mat [:,a,b]);
    end for;
   end for;

end SumStiffnessMatrixGlobal;

Setelah itu tentukan juga boundaries yang ada

BoundaryStiffnessMatrixGlobal
function BoundaryStiffnessMatrixGlobal
 input Integer x;
 input Integer z;
 input Real [x,x] KgTot_met;
 input Integer[z] Boundary_met;
 output Real [x,x] KgB_met;
  
algorithm
 for a in 1:x loop
   for b in 1:x loop
    KgB_met[a,b] := KgTot_met [a,b];
   end for;
  end for; 
  
 for i in 1:x loop
  for a in 1:z loop
   for b in 0:2 loop
     KgB_met[3*(Boundary_met[a])-b,i]:=0;
   end for;
  end for;
 end for;

 for a in 1:z loop
   for b in 0:2 loop
     KgB_met[3*Boundary_met[a]-b,3*Boundary_met[a]-b]:=1;
   end for;
 end for;
   
end BoundaryStiffnessMatrixGlobal;

Untuk mencari displacement-nya digunakan gauss jordan untuk menyelesaikan matriks

GaussJordan
function GaussJordan
 input Integer x;
 input Real [x,x] KgB_met;
 input Real [x] load_met;
 output Real [x] U_met;
  
 protected
 Real float_error = 10e-10;

algorithm
 U_met:=Modelica.Math.Matrices.solve(KgB_met,load_met);

 for i in 1:x loop
   if abs(U_met[i]) <= float_error then
    U_met[i] := 0;
   end if;
 end for;

end GaussJordan;

Dan untuk melihat reaction nya digunakan code sebagai berikut :

ReactionForce.mo
function ReactionForce
 input Integer x;
 input Real [x,x] KgTot_met;
 input Real [x] U_met;
 input Real [x] load_met;
 output Real [x] R_met;

algorithm
 R_met := (KgTot_met*U_met)-load_met;
end ReactionForce;

Terakhir dibuat Class untuk memproses data yang sudah dibuat dan melihat hasil U dan R

Tugas4TrussNomor8
class Tugas4TrussNomor8

parameter Real [:,9] inisiasi = [1, 1, 2, -0.8,    0, -0.6, 15e-4, 70e9, 2.5;
                                  2, 1, 3, -0.8, -0.6,    0, 15e-4, 70e9, 2.5;
                                  3, 1, 4, -0.8,    0,  0.6, 15e-4, 70e9, 2.5];
                                   
 parameter Integer [:,2] node = [1, 2;
                                 1, 3;
                                 1, 4];
                                  
 parameter Integer y = size(node,1);
  
 parameter Integer x = 3*(size(node_load,1));
  
 parameter Integer z = size(Boundary,1);
  
 parameter Integer [:] Boundary = {2,3,4};
                               
 parameter Real [:,4] node_load = [1, 0, -5000, 0;
                                   2, 0,     0, 0;
                                   3, 0,     0, 0;
                                   4, 0,     0, 0];
                                    
 parameter Real [x] load = {0,-5000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
                                   
 Real [y] k;

 Real [y,6,6] Ke;
  
 Real [y,x,x] Kg;
  
 Real [x,x] KgTot;
  
 Real [x,x] KgB;
  
 Real [x] U;
  
 Real [x] R;
  
equation
 k = {(inisiasi[i,7] * inisiasi[i,8] / inisiasi[i,9]) for i in 1:y};

 Ke = StiffnessMatrixElement(inisiasi);
 
 Kg = StiffnessMatrixGlobal(node, x, y, Ke);
 
 KgTot = SumStiffnessMatrixGlobal(x, y, Kg);
 
 KgB = BoundaryStiffnessMatrixGlobal(x, z, KgTot, Boundary);
 
 U = GaussJordan(x, KgB, load);
 
 R = ReactionForce(x, KgTot, U, load);
end Tugas4TrussNomor8;

Sehingga dalam persoalan tersebut didapatkan hasil dari displacement (U) dan Reaction force (R) sebagai berikut :

Hasil Displacement(U) dan reaction force(R)
Grafik Displacement(U) dan reaction force(R)

berikut adalah video terkait penyelesaian 3D Truss menggunakan OpenModelica :