Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 4, 2010 07:10:37

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

А можно сразу перейти к тому что в итоге нужно получить (я делал картопостроение и без Surfer8) ? Я строил карту с изолиниями и заливкой, и иногда удобнее вообще выкинуть surfer из процесса. Есть утилиты который делают крайгинг и т.п. из командной строки. Вы карту - мультипликатор параметра для гидродинамической модели строите, карту давления, невязку структуры или что?

Посмотрел файл

import numpy as np
from pylab import *
a = np.zeros((201, 201), float)
for line in open('out.dat'):
x, y, z = map(float, line.split())
a[x/0.005, y/0.005] = z
rc('font', **{'size':9})
figure(figsize=(10, 3))
subplot(121)
colorbar(imshow(a))
subplot(122)
colorbar(contourf(a, 20))
show()
Картинка результат - глядя на неё не совсем понимаю куда этот график продлять, или просто вертикальные и горизонтальные линии убрать из данных надо ??



Офлайн

#2 Июнь 4, 2010 09:05:43

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

Исходный файл out.dat это решение задачи на ячейке периодичности для композиционного материала, для построения первой поправки к температуре. Что нужно сделать с исходным файлом? Нужно создать аналогичный файл данных и по нему построить график для композита из ячеек 10 x 10, размер ячейки будет теперь не 1, а 0.2. При этом функции N (третий столбец в исходном файле) будут одинаковыми для каждой ячейке (они периодические и меняются только в пределах 1 ячейке).
В исходном файле была 40401 строка, для 1 ячейки, в нужном мне файле должно быть 4004001 строк.
Я пошел сложным путем. Сгенерировал x от 0.0 до 2.0 с шагом 0.001 и повторил такую генерацию в цикле 2001 раз - это 1 файл. y сгенерировал в диапазоне от 0.0 до 2.0 с шагом 0.001, но теперь каждый элемент повторял в цикле 2001 раз по диапазону (пример 0 0 0 0 1 1 1 1) эти данные занес в другой файл. Данные для N я взял из исходного файла и повторил их 100 раз. Получилось 3 файла со столбцами данных. За тем в цикле открыл все 3 файла и совместно проходя цикл по всем файлам создал итоговый файл, в котором 1 столбец значения x, во 2-м y, в 3-м N. Но есть одно но, почему-то в финальном файле 4003457 строк, хотя в трех файлах кол-во строк 4004001 4004001 4004000 соответственно.



Офлайн

#3 Июнь 4, 2010 09:51:17

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

AleksSR
При этом функции N (третий столбец в исходном файле) будут одинаковыми для каждой ячейке (они периодические и меняются только в пределах 1 ячейке).
Так формула, по которой считается эта N есть? Или нет?



Офлайн

#4 Июнь 4, 2010 09:54:05

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

Нет, программу для N не я писал, она очень сложная, реализует метод блоков, для ячейки с цилиндрическим включением, покрытым пленкой.



Офлайн

#5 Июнь 4, 2010 10:03:24

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

AleksSR
Нет, программу для N не я писал, она очень сложная, реализует метод блоков, для ячейки с цилиндрическим включением, покрытым пленкой.
Тогда я не понял откуда вы возьмете это значение. Или программу для N можно гонять в каких-то еще способах?
я не понял вот этого -
AleksSR
Исходный файл out.dat это решение задачи на ячейке периодичности для композиционного материала, для построения первой поправки к температуре. Что нужно сделать с исходным файлом? Нужно создать аналогичный файл данных и по нему построить график для композита из ячеек 10 x 10, размер ячейки будет теперь не 1, а 0.2. При этом функции N (третий столбец в исходном файле) будут одинаковыми для каждой ячейке (они периодические и меняются только в пределах 1 ячейке).
Я так понимаю это именно нужный способ - но не могу понять как именно он выполняется.
Я понял так, что N для дробных x и y равен N для целых x и y? Это как-то странно… Или все не так?



Офлайн

#6 Июнь 4, 2010 10:13:18

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

В программе написанной на С++ я могу менять параметры материалов, составляющих ячейку периодичности композита (радиус циллиндрическогор включения, толщину слоя, коэффициенты теплопроводности материалов) дальше программа считает и выдает файл поверхности .grd для Surfer, я в Surfer создаю файл out.dat для этой поверхности, чтобы создать поверхность для ячеек 10 на 10.

Вот как у меня создаются те 3 файла:

file = open('C:\Program Files\Golden Software\Surfer8\coord1.dat', 'a')
file2 = open('C:\Program Files\Golden Software\Surfer8\coord2.dat', 'a')
file3 = open('C:\Program Files\Golden Software\Surfer8\Nfunkts.dat', 'a')


i = 0
for x in range (0 , 200*count_l + 1):
ks = str(i) + "\n"
file.writelines(ks)
i += 0.001
file.close()

data = open('C:\Program Files\Golden Software\Surfer8\coord1.dat', 'r')
lines = data.readlines()
data.close()
filex = open('C:\Program Files\Golden Software\Surfer8\coord1f.dat', 'a')
for cx in range (0, 200*count_l + 1):
for line in lines:
coords = line.split()
xs = float(coords[0])
kp = str(xs) + "\n"
filex.writelines(kp)



data = open('C:\Program Files\Golden Software\Surfer8\out.dat', 'r')
lines = data.readlines()
data.close()

for count in range (0, count_l**2):
for line in lines:
coords = line.split()
N = float(coords[2]) + 0.5
kp = str(N) + "\n"
file3.writelines(kp)
file3.close()

k = 0
for y in range (0, 200*count_l + 1):
for cy in range (0, 200*count_l + 1):
ky = str(k) + "\n"
file2.writelines(ky)
k += 0.001
file2.close()


file1 = open('C:\Program Files\Golden Software\Surfer8\coord1f.dat', 'r')
file2 = open('C:\Program Files\Golden Software\Surfer8\coord2.dat', 'r')
file3 = open('C:\Program Files\Golden Software\Surfer8\Nfunkts.dat', 'r')

lines_x = file1.readlines()
lines_y = file2.readlines()
lines_N = file3.readlines()
file1.close()
file2.close()
file3.close()

file4 = open('C:\Program Files\Golden Software\Surfer8\grafik.dat', 'a')
for x, y, N in zip(lines_x, lines_y, lines_N):
coordsx = x.split()
coordsy = y.split()
coordsN = N.split()
fin = str(float(coordsx[0])) + " " + str(float(coordsy[0])) + " " + str(float(coordsN[0])) + "\n"
file4.writelines(fin)

file4.close()



Офлайн

#7 Июнь 4, 2010 10:32:56

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

Так.
1. Вы приводите весь код а не кусками. Например мне не ясно откуда берется count_l
2. Чем меньше вы приведете специфических терминов, тем лучше вас поймут.
3. Давайте на пальцах - у нас есть такая таблица:
x y N
0 0 3
0 1 8
1 0 4
1 1 8
Дальше нам надо получить такую таблицу:
x y N
0 0 ?
0 0.5 ?
0 1 ?
0.5 0 ?
0.5 0.5 ?
0.5 1 ?
1 0 ?
1 0.5 ?
1 1 ?
Мы возьмем для нее N из первой таблицы(вроде бы), но как? по каким правилам?



Офлайн

#8 Июнь 4, 2010 11:22:46

AleksSR
От:
Зарегистрирован: 2010-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

Прошу прощения, не заметил, что count_l определен выше, весь код как раз не приводил, чтобы не запутать народ.
Вот объяснение по простому.
Есть таблица
x y N
0 0 2
1 0 3
0 1 4
1 1 5

Нужна таблица
x y N
0 0 2
1 0 3
2 0 2
3 0 3
0 1 4
1 1 5
2 1 4
3 1 5
0 2 2
1 2 3
2 2 2
3 2 3
0 3 4
1 3 5
2 3 4
3 3 5


Похоже, что выше я допустил ошибку с функциями N, пока сам не могу понять, как грамотно их продлить на всю область 10 на 10 ячеек.

Вот весь код(там много переменных, которые будут дальше задействованы):

#!/usr/bin/env python
# -*- coding: cp1251 -*-

import math as m
from numpy import *
from scipy.special import erf

math = m
materials = 1
if materials == 1:
comb = "Ti-6Al-4V SiC Al"
k1 = 1.2095
k2 = 183.8
k3 = 235
rho1 = 4429
rho2 = 3210
rho3 = 2700
c1 = 625.30
c2 = 750
c3 = 235
elif materials == 2:
comb = "SiC Ti-6Al-4V Al"
k1 = 183.8
k2 = 1.2095
k3 = 235
rho1 = 3210
rho2 = 4429
rho3 = 2700
c1 = 750
c2 = 625.30
c3 = 235

r1 = 0.3
r2 = 0.3001
l = 1
s1 = pi*r1**2
s2 = pi*r2**2 - s1
s3 = l**2 - (s1 + s2)
rho_c = rho1*c1*s1/l**2 + rho2*c2*s2/l**2 + rho3*c3*s3/l**2
rho_c = float(rho_c)


l_razm = 0.2
G_razm = 2
count_l = int(G_razm/l_razm)



T0 = 300
T1 = 900
t = 1800


k_eff_chisl = 132.066
k_eff_teor = 132.22
chi = k_eff_chisl/rho_c

file = open('C:\Program Files\Golden Software\Surfer8\coord1.dat', 'a')
file2 = open('C:\Program Files\Golden Software\Surfer8\coord2.dat', 'a')
file3 = open('C:\Program Files\Golden Software\Surfer8\Nfunkts.dat', 'a')


i = 0
for x in range (0 , 200*count_l + 1):
ks = str(i) + "\n"
file.writelines(ks)
i += 0.001
file.close()

data = open('C:\Program Files\Golden Software\Surfer8\coord1.dat', 'r')
lines = data.readlines()
data.close()
filex = open('C:\Program Files\Golden Software\Surfer8\coord1f.dat', 'a')
for cx in range (0, 200*count_l + 1):
for line in lines:
coords = line.split()
xs = float(coords[0])
kp = str(xs) + "\n"
filex.writelines(kp)



data = open('C:\Program Files\Golden Software\Surfer8\out.dat', 'r')
lines = data.readlines()
data.close()

for count in range (0, count_l**2):
for line in lines:
coords = line.split()
N = float(coords[2]) + 0.5
kp = str(N) + "\n"
file3.writelines(kp)
file3.close()

k = 0
for y in range (0, 200*count_l + 1):
for cy in range (0, 200*count_l + 1):
ky = str(k) + "\n"
file2.writelines(ky)
k += 0.001
file2.close()


file1 = open('C:\Program Files\Golden Software\Surfer8\coord1f.dat', 'r')
file2 = open('C:\Program Files\Golden Software\Surfer8\coord2.dat', 'r')
file3 = open('C:\Program Files\Golden Software\Surfer8\Nfunkts.dat', 'r')

lines_x = file1.readlines()
lines_y = file2.readlines()
lines_N = file3.readlines()
file1.close()
file2.close()
file3.close()

file4 = open('C:\Program Files\Golden Software\Surfer8\grafik.dat', 'a')
for x, y, N in zip(lines_x, lines_y, lines_N):
coordsx = x.split()
coordsy = y.split()
coordsN = N.split()
fin = str(float(coordsx[0])) + " " + str(float(coordsy[0])) + " " + str(float(coordsN[0])) + "\n"
file4.writelines(fin)

file4.close()



Офлайн

#9 Июнь 4, 2010 11:28:16

asv13
От:
Зарегистрирован: 2007-01-22
Сообщения: 130
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

В исходном массиве 40401 строк = 201 * 201
В новом нужно 4004001 = 2001 * 2001, а 2001/201=9,955
Т.е. (как я полагаю) первое значение x,y = (0,0) мы оставляем, а на последующих линейно копируем Z десять раз но в том же порядке (это наверное озвученная периодичность), несмотря на то что X-Y у нас будут уже другими с шагом 0,001 до 2.
??



Офлайн

#10 Июнь 4, 2010 11:47:09

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Данные для 3-х мерного графика

AleksSR
Нужна таблица
x y N
0 0 2
1 0 3
2 0 2
3 0 3
0 1 4
1 1 5
2 1 4
3 1 5
0 2 2
1 2 3
2 2 2
3 2 3
0 3 4
1 3 5
2 3 4
3 3 5


Похоже, что выше я допустил ошибку с функциями N, пока сам не могу понять, как грамотно их продлить на всю область 10 на 10 ячеек.
Вот этот порядок я не понял. Так по каким правилам брать N? Они у вас точно есть? Я ведь не просто так спрашиваю. Нужно алгоритм создать, по которому будет заполнятся итоговая таблица и строится график.



Отредактировано (Июнь 4, 2010 11:48:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version