Ich habe eine Funktion zum Lesen von OpenFOAM-Zeitreihendaten und zum Festlegen von Daten (vom Beispielbefehl ausgegebene räumliche Verteilungsdaten) in Python erstellt und das Plotten mit matplotlib vereinfacht.
Grundsätzlich werden die Zeitreihendaten von OpenFOAM bei jedem Neustart in einem neuen Verzeichnis gespeichert. Es wird jedoch davon ausgegangen, dass sie mit dem Befehl cat verbunden sind, um eine einzelne Datei zu bilden.
def readHistory(case, positions, variables):
import numpy as np
"""
case: case name (string data)
positions: position name (list data)
variables: physical quantities (list data)
"""
data ={}
for position in positions:
for variable in variables:
key = variable+"_"+position
value = np.genfromtxt(case+"/"+position+"/"+variable, unpack=True)
data[key] = value
return data
Argumentbeschreibung
def readSets(case, file, variables):
import numpy as np
import pandas as pd
import glob
import os
"""
case: case name (string data)
file: sets data file name (string data)
variables: physical quantities (list data)
"""
# list of timing
list1 = glob.glob(case + "/sets/*")
variable_names = file.split("_")
# remove ".xy"
variable_names[-1] = variable_names[-1].split(".")[0]
position, variable_names[0] = variable_names[0], "x"
#print(variable_names)
data = {}
for variable in variables:
key = variable+"_"+position
data[key] = pd.DataFrame()
for i in list1:
path = i+"/" + file
df = pd.read_table(path, header = None, names = variable_names)
data[key] = pd.concat([data[key], df[variable]], axis=1,)
list_index=[]
for i in list1:
list_index.append(str(float(os.path.basename(i))))
data[key].columns = list_index
data[key] = pd.concat([df[variable_names[0]], data[key].sort_index(axis=1)], axis=1)
# return dictionary of dataframe
return data
Zeichnen Sie die Daten mit matplotlib.
Angenommen, das Datenlayout ist wie folgt. test01 ist der Fallname.
test01/position-A/p test01/position-A/U test01/position-B/p test01/position-B/U test01/sets/0/center_p_k.xy test01/sets/10/center_p_k.xy
p und U sind Zeitreihendaten von Position A und B. center_p_k.xy sind die Verteilungsdaten zu den Zeitpunkten 0 und 10. ist.
Es gibt mehrere Fälle, und es wird davon ausgegangen, dass Sie problemlos ein Diagramm erstellen können, bei dem nur der Fallname geändert wird.
import matplotlib.pyplot as plt
%matplotlib inline
case = "test01"
history_position = ["position-A", "position-B"]
history_variables = ["p", "U"]
sets_variables = ["p", "k"]
sets_position = "center"
dataSet_test01= [readHistory(case, history_position, history_variables),
readSets(case, "center_p_k.xy", sets_variables)]
#Darstellung eines Satzes von Zeitreihendaten
for i in history_position:
for j in history_variables:
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111)
ax.plot(dataSet_test01[0][j+"_"+i][0], dataSet_test01[0][j+"_"+i][1], label=j)
ax.legend(bbox_to_anchor=(1.01, 1., 0., 0), loc='upper left', borderaxespad=0.,)
#Raumverteilungsdiagramm
for sets in sets_variables:
for column in dataSet_test01[1][sets+"_"+sets_position]:
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(111)
ax.plot(dataSet_test01[1][sets+"_"+sets_position]["x"],
dataSet_test01[1][sets+"_"+sets_position][column],
label=sets+"_"+column)
ax.legend(bbox_to_anchor=(1.01, 1., 0., 0), loc='upper left', borderaxespad=0.,)
Recommended Posts