2016-04-16 3 views
0

Я делаю моделирование молекулярной динамики в Python с большим количеством частиц. Здесь я должен следить за x-позицией, y-позицией, z-позицией, x-скоростью, y-скоростью, z-скоростью, x-ускорением, y-ускорением, z-ускорением, x-силой, y-силой , z-сила, потенциал для всех 500 или 1000 частиц наряду с кинетической энергией, потенциальной энергией, полной энергией системы на каждом временном интервале. Чтобы сохранить эти данные я в настоящее время их записи в файл следующим образом:сохранить данные моделирования в python

from numpy import* 
... 
f=open('myMD.dat','w') 
while t<=tmax: 
    s='%3.3f\t\t'%(t) # writing the time to the file 
    f.write(s) 
    for i in range(TotalNumberofParticles): 
     UpdateParameters() 
     s='%8.3e %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e %8.3e\t\t'%(xpos1[i],ypos1[i],zpos1[i],xvel1[i],yvel1[i],zvel1[i],xacc1[i],yacc1[i],zacc1[i],xforc[i],yforc[i],zforc[i],potn[i]) 
     f.write(s) 
     ... 
    s='%8.3e %8.3e %8.3e\n'%(KE,PE,TE)  
    f.write(s) 
    t=t+delt 
f.close() 

Так что, если есть 500 частиц, каждая строка в файле данных будет иметь 7000 столбцов. Это как-то кажется плохим способом сохранения данных. Кроме того, симуляция продолжается несколько тысяч шагов времени. По мере того как программа продолжается, она становится медленнее. Может ли кто-нибудь дать мне представление о том, как я могу лучше сохранить свои данные? Также я хотел бы знать, как я могу получить эти данные для дальнейшего анализа.

ответ

3

Вместо того, чтобы писать каждый xpos[i] отдельно в цикле, записать весь массив в один идти с numpy.savez;

import numpy as np 

np.savez('myMD.dat', 
     xpos1=xpos1, ypos1=ypos1, zpos1=zpos1, 
     xvel1=xvel1, yvel1=yvel1, zvel1=zvel1, 
     xacc1=xacc1, yacc1=yacc1, zacc1=zacc1, 
     xforc=xforc, yforc=yforc, zforc=zforc, 
     potn=potn) 

Использование аргументов ключевых слов, подобных этому, гарантирует сохранение массивов с их собственным именем.

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

Таким образом, вместо

xpos1 = np.array(TotalNumberofParticles) 

сделать

xpos1 = np.array((number_of_iterations, TotalNumberofParticles)) 

Вы можете использовать numpy.load снова прочитать данные:

import numpy as np 

data = numpy.load('myMD.dat') 
xpos1 = data['xpos1'] 
# et cetera 

BTW, от PEP 8 (руководство по стилю Python):

Следует избегать импорта подстановочных знаков (from <module> import *), поскольку они неясны, какие имена присутствуют в пространстве имен, запутывая как читателей, так и множество автоматизированных инструментов.

+0

У меня просто запрос с 'np.savez ('myMD.dat', xpos1 = xpos1, ypos1 = ypos1, ... ..., zforc = zforc, potn = potn)'. Могу ли я писать эту строку в цикле, потому что данные для xpos1, ypos1 и т. Д. Должны записываться для всех частиц. И если да, могу ли я указать одно и то же ключевое слово в каждом случае? – kanayamalakar

+0

@kanayamalakar Я предполагаю, что вы хотите записать данные для всех частиц и всех временных шагов? Я изменил свой ответ, чтобы отразить это. –

1

Вы можете использовать рассол, чтобы читать и писать произвольные данные:

import pickle 

a= [4,6,3,7,] 

f=open("testfile", "wb") 
pickle.dump(a,f) 
f.close() 

f=open("testfile", "rb") 
b=pickle.load(f) 
f.close() 

print b