# Kapitel 3_g:
# Massenträgheitsmomente eines aus Tetraedern zusammengesetzten Polyeders
# © 2015  Friedrich U. Mathiak, 
# mathiak@mechanik-info.de
# 
> interface(displayprecision = 4): restart: with(LinearAlgebra): with(plottools):
# Wir stellen zunächst die Maple-Prozedur zur Berechnung der Massenträgheitsmomente eines aus Tetraedern zusammengesetzten Polyeders  zur Verfügung. Als Eingabe werden die Knotendatei, die Elementdatei und die Dichte des Materials erwartet. 
> Proc_Calc_19:=proc(KOOR::Matrix,ELEM::Matrix,rho)
> #-----------------------------------------------------------------------------
# # Eingabe:
# #    KOOR: Knotendatei
# #    ELEM: Elementdatei
# #     rho: Dichte des Materials
> 
> # Ausgabe:
> #       V: Volumeninhalt des Polyeders
> #      RS: Koordinaten des Volumenmittelpunktes
> #   Theta: Matrix des Trägheitsmomententensors im Zentralachsensystem (ZA)
> #      EW: Eigenwerte (Hauptträgheitsmomente) von Theta
> #      EV: Richtungen (Eigenvektoren) der Hauptzentralachsen (HZA)
> #------------------------------------------------------------------------------
> local N,M,R1,R2,R3,V,i,j,s,d,RSi,DJ,Vi,STM,ID,sq,dq,R3q,sR3,sd,sds,ddd,R3dR3,sdR3,Tq;
> global VOL,MA,RS,Theta,Thetaq,EW,EV;
> description "Berechnung massengeometrischer Größen eines aus Tetraedern zusammengesetzten Polyeders";
> N := LinearAlgebra[RowDimension](KOOR); #Anzahl der   Knoten
> M := LinearAlgebra[RowDimension](ELEM); #Anzahl der Elemente
> R1:= Vector(3); R2:= Vector(3); R3:= Vector(3); RSi:= Vector(3); STM:=Vector([0,0,0]);
> ID:=LinearAlgebra[IdentityMatrix](3): Tq:=Matrix(3):
> V :=0;
> for i to M do       #Schleife über alle Elemente
>   #Aufbau der Vektoren R1,R2,R3 aus der Element- und Knotendatei
>   R1 :=LinearAlgebra[Transpose](LinearAlgebra[Row](KOOR,ELEM[i,1])):
>   R2 :=LinearAlgebra[Transpose](LinearAlgebra[Row](KOOR,ELEM[i,2])):
>   R3 :=LinearAlgebra[Transpose](LinearAlgebra[Row](KOOR,ELEM[i,3])):
>   s  :=R1 + R2; d:=R2 - R1;
>   RSi:=R1 + R2 + R3;
>   Vi :=LinearAlgebra[DotProduct](LinearAlgebra[CrossProduct](R1,R2),R3,conjugate=false);
>   V  :=V + Vi;
>   STM:=STM + Vi*RSi;
>   sq   :=LinearAlgebra[Transpose](s).s;    dq  :=LinearAlgebra[Transpose](d).d;
>   R3q  :=LinearAlgebra[Transpose](R3).R3;  sR3 :=LinearAlgebra[Transpose](s).R3;
>   sds  :=s.LinearAlgebra[Transpose](s);    ddd :=d.LinearAlgebra[Transpose](d);
>   R3dR3:=R3.LinearAlgebra[Transpose](R3);  sdR3:=s.Transpose(R3);
>   Tq   :=Tq+Vi*((3*sq+dq+4*(R3q+sR3))*ID-(3*sds+ddd+4*R3dR3+2*(sdR3+LinearAlgebra[Transpose](sdR3)))); 
> end do;
> VOL    :=V/6;
> MA     :=rho*VOL;
> RS     :=STM/(24*VOL);
> Thetaq :=rho*Tq/240;
> Theta  :=rho*(Tq/240-VOL*(DotProduct(RS,RS,conjugate=false)*ID-RS.Transpose(RS)));
> (EW,EV):=LinearAlgebra[Eigenvectors](Matrix(Theta,shape=symmetric));
> #Ausgabe der Ergebnisse
> print(`Volumeninhalt (VOL) =`,VOL);
> print(`Masse (MA) =`,MA);
> print(`Ortsvektor des Volumenmittelpunktes (RS) =`,RS);
> print(`Trägheitsmomente im Ausgangssystem (Thetaq) =`,simplify(Thetaq));
> print(`Trägheitsmomente im Zentralachsensystem (Theta) =`,simplify(Theta));
> print(`Trägheitsmomente im Hauptzentralachsensystem (EW) =`,simplify(EW));
> print(`Richtungen der Hauptzentralachsen (EV)  =`,simplify(EV));
> end proc:
# Um die Prozedur für nachfolgende Arbeitsblätter anwendbar zu machen, speichern wir diese ab. Das geht wie folgt:
> save Proc_Calc_19, "Proc_Calc_19.m":
# Beispiel 3-15:
# Wir benötigen die Knoten- und Elementdatei sowie die Dichte Á für das einzelne Tetraeder. 
> COORD:=Matrix([[a,0,0],[0,b,0],[0,0,c]]); #Knotendatei
;
> IZES:=Matrix([1,2,3]);                    #Elementdatei
;
# Für die nummerische Berechnung der massengeometrischen Größen wählen wir die Werte des Beispiels:
> a:=1.: b:=2: c:=3: rho:=1.:
# und rufen die Prozedur auf:
> Proc_Calc_19(COORD,IZES,rho);
# Mit dem Befehl polygon  gestattet uns Maple die 3D-Darstellung eines Polygons.  
> KL:=convert(COORD,listlist): l0:=[0,0,0]:
> p1:=plottools[polygon]([[KL[1],KL[3],l0],[KL[2],KL[1],l0],[KL[3],KL[2],l0],[KL[1],KL[2],KL[3]]],transparency=0.2):
# Weiterhin sollen zusätzlich zum Tetraeder die Richtungen der Hauptzentralachsen ausgegeben werden.
> lambda:=1:li:=NULL:
> for i to 3 do
> evi:=Column(EV,i):
> rai:=convert(RS-lambda*evi,list):
> rbi:=convert(RS+lambda*evi,list):
> li:=li,plottools[line](rai,rbi,color=ColorTools[Desaturate]("Coral",i),linestyle = dash):
> end do:
> TS:=plots[textplot3d]([RS[1],RS[2],RS[3],"S",'font'=["times","roman",16]],'align'={'above','right'},color=blue):
> plots[display](p1,li,TS,axes=boxed,scaling=constrained,orientation =[-40,70,0],labels=["x1","x2","x3"]);
# Beispiel 3-16:
# Zum Einlesen der Knoten- und Elementdatei sowie zur grafischen Darstellung der Geometrie werden die aus TM 1 bekannten Prozeduren   PROC_READ_01.m  und  PROC_GRAF_01.m  eingelesen. 
> read "PROC_READ_01.m"; 
> read "PROC_GRAF_01.m";
# Wir lesen die Daten ein. Nach dem Einlesen wird die Datei geschlossen.
> Daten:="Daten_01.txt": PROC_READ_01(Daten): close(Daten):
# Wir geben zur Kontrolle die eingelesene Geometrie auf dem Bildschirm aus.
> PROC_GRAF_01(COORD,IZES);
# Im nächsten Schritt werden die massengeometrischen Größen berechnet (Á = 1)
> Proc_Calc_19(COORD,IZES,1):
# Zusatzbeispiel:  (reguläre Pyramide mit quadratischer Grundfläche)
# Wir benötigen die Knoten- und Elementdatei sowie die Dichte für das einzelne Tetraeder. 
> a:='a':rho:='rho':
> COORD:=Matrix([[a/2,-a/2,0],[a/2,a/2,0],[-a/2,a/2,0],[-a/2,-a/2,0],[0,0,h]]):  #Knotendatei
;
> IZES :=Matrix([[1,4,3],[1,3,2],[5,1,2],[5,2,3],[5,3,4],[5,4,1]]):              #Elementdatei
;
# Wir berechnen die massengeometrischen Größen
> Proc_Calc_19(COORD,IZES,rho);
# Wir konkretisieren das obige Beispiel und wählen dazu den Datensatz  Daten_02.txt  mit a = 4, h = 12.
> Daten:="Daten_02.txt": PROC_READ_01(Daten): close(Daten):
# Wir geben zur Kontrolle die eingelesene Geometrie auf dem Bildschirm aus.
> PROC_GRAF_01(COORD,IZES);
# Im nächsten Schritt werden die massengeometrischen Größen berechnet (Á = 0.67)
> Proc_Calc_19(COORD,IZES,0.67):
> 
;
