Guest User

Untitled

a guest
Nov 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.82 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Tue Oct 2 11:38:14 2018
  4.  
  5. @author: chong
  6. """
  7.  
  8. # -*- coding: utf-8 -*-
  9. """
  10. Created on Wed Sep 26 15:00:59 2018
  11.  
  12. @author: chong
  13. """
  14.  
  15. import os
  16. import struct
  17. import numpy as np
  18.  
  19.  
  20.  
  21. def read_out(filename):
  22. RECORDSIZE=4
  23. version=0
  24. NflowUnits=0
  25. Nsubcatch=0
  26. Nnodes=0
  27. Nlinks=0
  28. Npolluts=0
  29.  
  30.  
  31. magic1=0
  32. magic2=0
  33. magic3=0
  34. err=0
  35. startPos=0
  36. nPeriods=0
  37. errCode=0
  38. IDpos=0
  39. propertyPos=0
  40.  
  41. pollutantUnit=''
  42.  
  43. sub_name=[]
  44. node_name=[]
  45. link_name=[]
  46. poll_name=[]
  47. reportInterval=[]
  48. subcatchResultValueList=[]
  49. nodeResultValueList=[]
  50. linkResultValueList=[]
  51. systemResultValueList=[]
  52. data={}
  53.  
  54. #各个要素id
  55.  
  56. br=open(filename,'rb')
  57. #判断文件是否正常打开
  58. if(br==None or os.path.getsize(filename)):
  59. err=1
  60.  
  61. #读取末尾的位置属性
  62. br.seek(os.path.getsize(filename)-RECORDSIZE*6)
  63. IDpos=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  64. propertyPos=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  65. startPos=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  66. nPeriods=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  67. errCode=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  68. magic2=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  69.  
  70. #print(IDpos,propertyPos,startPos,nPeriods,errCode,magic2)
  71.  
  72. #读取开头的magic变量
  73. br.seek(0)
  74. magic1=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  75.  
  76. if(magic1!=magic2 or errCode!=0 or nPeriods==0):
  77. err=1
  78. else:
  79. err=0
  80.  
  81. if(err==1):
  82. br.close()
  83. return sub_data,node_data,link_data
  84. else:
  85.  
  86. #读取版本号,单位,汇水区个数,节点个数,管道个数,污染物个数
  87. version=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  88. NflowUnits=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  89. Nsubcatch=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  90. Nnodes=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  91. Nlinks=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  92. Npolluts=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  93.  
  94. #print(version,NflowUnits,Nsubcatch,Nnodes,Nlinks,Npolluts)
  95.  
  96. #读取各个id列表
  97. br.seek(IDpos)
  98.  
  99.  
  100. for i in range(Nsubcatch):
  101. numSubIdNames=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  102. subcatchByte=br.read(numSubIdNames)
  103. sub_name.append(subcatchByte.decode(encoding = "utf-8"))
  104.  
  105. for i in range(Nnodes):
  106. numNodeIdNames=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  107. nodeByte=br.read(numNodeIdNames)
  108. node_name.append(nodeByte.decode(encoding = "utf-8"))
  109.  
  110. for i in range(Nlinks):
  111. numlinkIdNames=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  112. linkByte=br.read(numlinkIdNames)
  113. link_name.append(linkByte.decode(encoding = "utf-8"))
  114.  
  115. for i in range(Npolluts):
  116. numpollutsIdNames=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  117. pollutsByte=br.read(numpollutsIdNames)
  118. poll_name.append(pollutsByte.decode(encoding = "utf-8"))
  119.  
  120. #读取污染物单位
  121. unit=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  122. #print(unit)
  123. if unit==0:
  124. pollutantUnit='mg/L'
  125. if unit==1:
  126. pollutantUnit='ug/L'
  127. if unit==2:
  128. pollutantUnit='counts/L'
  129.  
  130. #读取各个属性个数
  131. br.seek(propertyPos)
  132. numSubcatProperty=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  133. offsetTemp1=numSubcatProperty*Nsubcatch
  134. br.seek((offsetTemp1+1)*4,1)
  135. numNodeProperty=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  136. offsetTemp2=numNodeProperty*Nnodes
  137. br.seek((offsetTemp2+3)*4,1)
  138. numLinkProperty=int.from_bytes(br.read(RECORDSIZE),byteorder='little')
  139.  
  140. #print(numSubcatProperty,numNodeProperty,numLinkProperty)
  141.  
  142. #读取各个属性
  143. subcatchProNameList=[]
  144. subcatchProValueList=[]
  145. nodeProNameList=[]
  146. nodeProValueList=[]
  147. linkProNameList=[]
  148. linkProValueList=[]
  149.  
  150. br.seek(propertyPos+4)
  151. subcatchProNameList.append(int.from_bytes(br.read(RECORDSIZE),byteorder='little'))
  152. for i in range(Nsubcatch):
  153. subcatchProValueList.append(struct.unpack('f',br.read(RECORDSIZE)))
  154. #txtSubcatchPro.Text+=subcatchProValueList[i].To
  155.  
  156. br.read(RECORDSIZE)
  157. for k in range(3):
  158. nodeProNameList.append(int.from_bytes(br.read(RECORDSIZE),byteorder='little'))
  159. for i in range(Nnodes*3):
  160. nodeProValueList.append(struct.unpack('f',br.read(RECORDSIZE)))
  161.  
  162. #print(nodeProValueList)
  163.  
  164. br.read(RECORDSIZE)
  165. for k in range(5):
  166. linkProNameList.append(int.from_bytes(br.read(RECORDSIZE),byteorder='little'))
  167. for i in range(Nlinks*5):
  168. linkProValueList.append(struct.unpack('f',br.read(RECORDSIZE)))
  169.  
  170. #print(nodeProValueList)
  171.  
  172. '''
  173. computing result
  174. '''
  175. #读取计算结果
  176. br.seek(startPos)
  177. for i in range(nPeriods):
  178. dt=struct.unpack('f',br.read(RECORDSIZE))
  179. reportInterval.append(dt)
  180. br.read(RECORDSIZE)
  181. tem=[]
  182. for su in range(Nsubcatch):
  183. tem1=[]
  184. for su1 in range(8+Npolluts):
  185. tem1.append(struct.unpack('f',br.read(RECORDSIZE)))
  186. tem.append(tem1)
  187. subcatchResultValueList.append(tem)
  188.  
  189. tem=[]
  190. for no in range(Nnodes):
  191. tem1=[]
  192. for no1 in range(6+Npolluts):
  193. tem1.append(struct.unpack('f',br.read(RECORDSIZE)))
  194. tem.append(tem1)
  195. nodeResultValueList.append(tem)
  196.  
  197. tem=[]
  198. for li in range(Nlinks):
  199. tem1=[]
  200. for li1 in range(5+Npolluts):
  201. tem1.append(struct.unpack('f',br.read(RECORDSIZE)))
  202. tem.append(tem1)
  203. linkResultValueList.append(tem)
  204.  
  205. tem=[]
  206. for sy in range(15):
  207. tem.append(struct.unpack('f',br.read(RECORDSIZE)))
  208. systemResultValueList.append(tem)
  209.  
  210. br.close()
  211. '''
  212. k=0
  213. for item in sub_name:
  214. sub_data[item]=subcatchResultValueList[-1][k]
  215. k+=1
  216. k=0
  217. for item in link_name:
  218. data[item]=linkResultValueList[t][k][0]
  219. k+=1
  220. k=0
  221. for item in node_name:
  222. data[item]=[nodeResultValueList[t][k][6],nodeResultValueList[t][k][0]]
  223. k+=1
  224. '''
  225.  
  226. return nodeResultValueList,node_name
  227.  
  228. '''
  229. 基础解析方法
  230. '''
  231. def get_depth(o_data,node_name,t):
  232. '''
  233. t时刻所有节点的水位
  234. '''
  235. k=0
  236. depth={}
  237. for item in node_name:
  238. depth[item]=o_data[t][k][0][0]
  239. k+=1
  240. return depth
  241.  
  242. def get_head(o_data,node_name,t):
  243. '''
  244. t时刻所有节点的Head
  245. '''
  246. k=0
  247. head={}
  248. for item in node_name:
  249. head[item]=o_data[t][k][1][0]
  250. k+=1
  251. return head
  252.  
  253.  
  254. def get_volume(o_data,node_name,t):
  255. '''
  256. t时刻所有节点的volume
  257. '''
  258. k=0
  259. volume={}
  260. for item in node_name:
  261. volume[item]=o_data[t][k][0][0]
  262. k+=1
  263. return volume
  264.  
  265.  
  266. def get_lateral_inflow(o_data,node_name,t):
  267. '''
  268. t时刻所有节点流入量
  269. '''
  270. k=0
  271. inflow={}
  272. for item in node_name:
  273. inflow[item]=o_data[t][k][3][0]
  274. k+=1
  275. return inflow
  276.  
  277. def get_total_inflow(o_data,node_name,t):
  278. '''
  279. 到t时刻所有节点的总流量
  280. '''
  281. k=0
  282. t_inflow={}
  283. for item in node_name:
  284. t_inflow[item]=o_data[t][k][4][0]
  285. k+=1
  286. return t_inflow
  287.  
  288.  
  289. def get_flood(o_data,node_name,t):
  290. '''
  291. t时刻所有节点的flooding
  292. '''
  293. k=0
  294. flood={}
  295. for item in node_name:
  296. flood[item]=o_data[t][k][5][0]
  297. k+=1
  298. return flood
  299.  
  300. def get_cod(o_data,node_name,t):
  301. '''
  302. t时刻所有节点COD
  303. '''
  304. k=0
  305. COD={}
  306. for item in node_name:
  307. COD[item]=o_data[t][k][6][0]
  308. k+=1
  309. return COD
  310.  
  311.  
  312.  
  313.  
  314. '''
  315. 功能解析方法,调用上述方法进行解析
  316. '''
  317. def depth(filename,pool_list,t):
  318. '''
  319. t时刻out文件中的前池水位
  320. '''
  321. data,name=read_out(filename)
  322. depth=get_depth(data,name,t-1)
  323. pool_d={}
  324. for pool in pool_list:
  325. pool_d[pool]=depth[pool]
  326.  
  327. return pool_d
  328.  
  329. if __name__=='__main__':
  330. filename='./sim/ot.out'
  331. data,name=read_out(filename)
  332.  
  333. #将data写入txt
  334. T=len(data)
  335. N=len(data[0])
  336. M=len(data[0][0])
  337. print(T,N,M)
  338. t=10
  339. '''
  340. text=''
  341. n=N-1
  342. for t in range(T):
  343. for m in range(M):
  344. text+=str(data[t][n][m][0])+'\t\t'
  345. text+='\n'
  346.  
  347. output = open('data.txt', 'wt')
  348. output.write(text)
  349. output.close()
  350. '''
  351.  
  352. print(name)
  353. print(".................................")
  354. print(get_cod(data,name,t))
  355. print(".................................")
  356. print(get_depth(data,name,t))
  357. print(".................................")
  358. print(get_flood(data,name,t))
  359. print(".................................")
  360. print(get_total_inflow(data,name,t))
  361. print(".................................")
  362. print(get_lateral_inflow(data,name,t))
  363. print(".................................")
  364. print(get_volume(data,name,t))
  365. print(".................................")
  366. print(get_head(data,name,t))
  367.  
  368. pool_list=['CC-storage']
  369.  
  370. print(depth(filename,pool_list,t))
Add Comment
Please, Sign In to add comment