Skip to content
Snippets Groups Projects
tecplot.py 4.33 KiB
Newer Older
import os


def writeTecplot1DFile(output_path, var_string, zone_string, values, title):
    # var_string: namen der variablen als liste ['U','p']
    # zone_string: namen der zonen als liste ['saugseute','druckseite']
    # values: erster index der liste steht fuer zone, dann folgen die listen der eigentlichen variablen
    # Beispiel: [[[10,11,10],[10000,11000,12000]],[[10,11,10],[10000,11000,12000]]]
    data = open(os.path.join(output_path), 'w')
    data.write('TITLE     ="' + title + '"\n')
    var = 'VARIABLES = '
    for i in range(len(var_string)):
        if i < len(var_string) - 1:
            var = var + '"' + var_string[i] + '", '
        else:
            var = var + '"' + var_string[i] + '"\n'

    data.write(var)

    for i in range(len(values)):
        data.write('ZONE T="' + zone_string[i] + '",I=' + str(len(values[i][0])) + '\n')

        # data.write('ZONE  T= "'+zone_string[i]+'"\n')
        for j in range(len(values[i][0])):
            line_string = ''
            for k in range(len(values[i])):
                if k < len(values[i]) - 1:
                    line_string = line_string + str(values[i][k][j]) + '\t'
                else:
                    line_string = line_string + str(values[i][k][j]) + '\n'
            data.write(line_string)

    data.close()


def writeTecplot2D3DFile(filename, X, Y, Z, vars):
    def pad(s, width):
        s2 = s
        while len(s2) < width:
            s2 = ' ' + s2
        if s2[0] != ' ':
            s2 = ' ' + s2
        if len(s2) > width:
            s2 = s2[:width]
        return s2

    def varline(vars, id, fw):
        s = ""
        for v in vars:
            s = s + pad(str(v[1][id]), fw)
        s = s + '\n'
        return s

    fw = 10  # field width

    f = open(filename, "wt")

    f.write('Variables="X","Y"')
    if len(Z) > 0:
        f.write(',"Z"')
    for v in vars:
        f.write(',"%s"' % v[0])
    f.write('\n\n')

    f.write('Zone I=' + pad(str(len(X)), 6) + ',J=' + pad(str(len(Y)), 6))
    if len(Z) > 0:
        f.write(',K=' + pad(str(len(Z)), 6))
    f.write(', F=POINT\n')

    if len(Z) > 0:
        id = 0
        for k in range(len(Z)):
            for j in range(len(Y)):
                for i in range(len(X)):
                    f.write(pad(str(X[i]), fw) + pad(str(Y[j]), fw) + pad(str(Z[k]), fw))
                    f.write(varline(vars, id, fw))
                    id = id + 1
    else:
        id = 0
        for j in range(len(Y)):
            for i in range(len(X)):
                f.write(pad(str(X[i]), fw) + pad(str(Y[j]), fw))
                f.write(varline(vars, id, fw))
                id = id + 1

    f.close()


def openTecplotFile(path):
    values = []
    var = []
    zones = []

    zone_bool = -1
    with open(path, 'r') as f:
        for line in f:
            if line.startswith('VARIABLES'):
                line_string = line.replace('\n', '').split('=')[-1].split(',')
                for string in line_string:
                    var.append(string.replace('"', ''))

            if line.startswith('ZONE'):

                zone_bool = zone_bool + 1

                zones.append(line.replace('\n', '').split('=')[-1].replace('"', ''))
                list_01 = []
                for i in range(len(var)):
                    list_01.append([])

                values.append(list_01)

            if line.startswith('ZONE') or line.startswith('VARIABLES') or line.startswith('TITLE'):
                pass

            else:
                line_values = line.split()
                for i in range(len(line_values)):
                    values[zone_bool][i].append(float(line_values[i]))

    return values


def getTecplotFileVarNames(path):
    var = []

    with open(path, 'r') as f:
        for line in f:
            if line.startswith('VARIABLES'):
                line = line.replace(' ', '')
                line_string = line.replace('\n', '').split('=')[-1].split(',')

                for string in line_string:
                    var.append(string.replace('"', ''))

    return var


def getTecplotFileZoneNames(path):
    var = []

    with open(path, 'r') as f:
        for line in f:
            if line.startswith('ZONE') or line.startswith('Zone') or line.startswith('zone'):
                line = line.replace(' ', '')
                line_string = line.replace('\n', '').split('"')[1]

                var.append(line_string)

    return var