Ich schreibe mir gerade ein bash-Skript. Nun hänge ich an einer Stelle fest, an der ich nicht weiterkomme. Zum Hintergrund: Mittels einer CFD-Software lasse ich mir Daten als csv-Datei rausschreiben. Der Datensatz enthält 4 Spalten:. Temperatur,x,y,z(-Koordinaten). Siehe Beispiel (Ausschnitt):
Code: Alles auswählen
341.874084472656,-0.000705280239069481,0.00579587658531983,-0.0460738495315031
341.679748535156,-0.000645140022304951,0.005678238487966,-0.0461317699614403
341.996032714844,-0.000699345444964885,0.00602578799982332,-0.0460740129139252
341.421691894531,0.00438122227431762,0.00344348519692563,-0.0463320988362479
341.532409667969,0.00439771370713714,0.00351409674970048,-0.0462175099587241
341.731872558594,0.00451049831295967,0.00354900037255546,-0.0461076071320178
Bei den Daten handelt es sich um einen periodischen, axialsymmetrischen Körper (Segment eines Laufrades). Die Temperatur an den periodischen Rändern sind identisch. So soll es auch sein. Jetzt kommt die Aufgabe: Die Daten eines(!) periodischen Randes sollen gelöscht werden. Also die ganze Zeile in dem oben genannten Datensatzes. Meine Idee ist folgende:
- Umwandlung der kartesichen Koordinaten in zylindrische Koordinaten.
Ein erstes Indiz für einen periodischen Rand ist, falls z-Koordinate und r mehrmals in der Tabelle vorkommt (wäre dann ein potenzielles Knotenpaar).
Ein weiteres Indiz für einen periodischen Rand ist, falls theta oder ein Vielfaches mehrmals bei einem potenziellen Knotenpaar vorkommt.
Code: Alles auswählen
-Nr.-,----Temp-------,-----x_ori-----,----y_ori-----,------z_ori---,-----T_mod------,-----x_mod----,-------y_mod--,------z_mod----,---r---,-theta1,-theta2,-theta3---
5490,340.785949707031,0.004337127055,0.009018628340,-0.046000000000,340.785949707031,0.004337127055,0.009018628340,-0.046000000000,0.01001,1.12254,2.16974,0.07534
5491,340.789520263672,0.005633509193,0.008274496822,-0.046000000000,340.789520263672,0.005633509193,0.008274496822,-0.046000000000,0.01001,0.97305,2.02025,-0.07414
5964,320.922790527344,-0.000103829607,0.001153735943,-0.066265319863,320.922790527344,-0.000103829607,0.001153735943,-0.066265319863,0.00116,-1.48104,-0.43385,-2.52824
6453,320.922790527344,0.000947249833,0.000666787049,-0.066265319863,320.922790527344,0.000947249833,0.000666787049,-0.066265319863,0.00116,0.61335,1.66055,-0.43385
5983,320.677429199219,-0.000026196403,0.000295805955,-0.066925206677,320.677429199219,-0.000026196403,0.000295805955,-0.066925206677,0.00030,-1.48247,-0.43527,-2.52966
7144,339.476226806641,0.002667510101,0.010427353983,-0.046000000000,339.476226806641,0.002667510101,0.010427353983,-0.046000000000,0.01076,1.32035,2.36755,0.27315
7145,339.494903564453,0.004072134892,0.009962116499,-0.046000000000,339.494903564453,0.004072134892,0.009962116499,-0.046000000000,0.01076,1.18276,2.22996,0.13556
5895,322.598968505859,-0.000450195097,0.004791635801,-0.064373743326,322.598968505859,-0.000450195097,0.004791635801,-0.064373743326,0.00481,-1.47712,-0.42992,-2.52431
6384,322.598968505859,0.003924580780,0.002785698291,-0.064373743326,322.598968505859,0.003924580780,0.002785698291,-0.064373743326,0.00481,0.61728,1.66447,-0.42992
6472,320.677429199219,0.000243077270,0.000170589728,-0.066925206677,320.677429199219,0.000243077270,0.000170589728,-0.066925206677,0.00030,0.61193,1.65912,-0.43527
6638,330.813873291016,0.001766323598,0.006242004735,-0.058831045099,330.813873291016,0.001766323598,0.006242004735,-0.058831045099,0.00649,1.29503,2.34223,0.24783
6639,330.813018798828,0.002061329497,0.006150889600,-0.058831045099,330.813018798828,0.002061329497,0.006150889600,-0.058831045099,0.00649,1.24743,2.29463,0.20023
Erläuterung: Die erste Spalte ist die Nummerierung der einzelnen Zeilen. Die ist identisch mit dem Originalfile aus der rausgeschriebenen Tablle (T,x,y,z). Alle Werte mit _ori sind eine Übernahme der Werte aus der Originaltabelle. Also, ohne jegliche Veränderung. Alle Werte mit _mod sind modifizierte Werte aus _ori. Zum Beispiel ein Offset bei der Temperatur (Celsius/Kelvin). Bei x_mod, y_mod, z_mod eine Translation des Koordinatensystems für die weitere Umrechnung ins zylindrische Koordinatensysten. Weiter wird zum Beispiel .8e3 in .8*10^3 umgewandelt, um mit bc arbeiten zu können. r und theta1 sind die Koordinaten nach der Transformation ins zylindrische Koordinatensystems. theta2 und theta3 sind Hilfsvariablen.
Aufgabe zur Identifizierung periodischer Punkte sind:
Knoten 5964 und 6453, weil r und z-Koordinaten identisch sind UND theta2 des Knotens #5964 identisch mit theta3 des Knotens #6453 (theta2,5964=theta3,6453).
Knoten 5895 und 6384, weil r und z-Koordinaten identisch sind UND theta2 des Knotens #5895 identisch mit theta3 des Knotens #6384 (theta2,5895=theta3,6384)
Nicht periodisch:
Knoten 6638 und 6639, weil r und z-Koordinaten zwar sind identisch , aber es keine gleichen Werte der beiden Knoten bei theta1, theta2 oder theta3 gibt!
In dem o.g. Beispiel ist es jetzt Zufall, dass bei periodischen Punkten theta2,#1=theta3,#1+1 ist. Gültig ist eine beliebige Kombination. Also, dass es mindestens einen Wert von theta1,theta2,theta3 gibt, der bei dem anderen Punkt auch vorkommt.
Nur auf die Temperaturwerte zu schauen ist nicht(!) ausreichend.
Ziel: Kann ich mittels awk diese Abfrage zum periodischen Punkt programmieren? Also, über die Zeilen 'springen' und Abfragen machen? Als Ergebnis sollte bei periodisch vorkommenden Knoten die Knotennummer eines der beiden Knotennummern ausgeben und in eine Datei geschrieben werden. Idealerweise immer die Knotennummer des Knotenpaares mit dem kleinsten/größten theta1.
Danke für die Hinweise und Lösungsvorschläge.