PageRenderTime 64ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/CUBIT_GEOCUBIT/geocubitlib/exportlib.py

https://gitlab.com/Aaeinstein54/specfem3d
Python | 855 lines | 820 code | 5 blank | 30 comment | 10 complexity | 21c28e5160b806775828b4223d341952 MD5 | raw file
  1. #!/usr/bin/env python
  2. #############################################################################
  3. # exportlib.py
  4. # this file is part of GEOCUBIT #
  5. # #
  6. # Created by Emanuele Casarotti #
  7. # Copyright (c) 2008 Istituto Nazionale di Geofisica e Vulcanologia #
  8. # #
  9. #############################################################################
  10. # #
  11. # This program is free software; you can redistribute it and/or modify #
  12. # it under the terms of the GNU General Public License as published by #
  13. # the Free Software Foundation; either version 2 of the License, or #
  14. # (at your option) any later version. #
  15. # #
  16. # This program is distributed in the hope that it will be useful, #
  17. # but WITHOUT ANY WARRANTY; without even the implied warranty of #
  18. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
  19. # GNU General Public License for more details. #
  20. # #
  21. # You should have received a copy of the GNU General Public License along #
  22. # with this program; if not, write to the Free Software Foundation, Inc., #
  23. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #
  24. # #
  25. #############################################################################
  26. #
  27. try:
  28. import start as start
  29. cubit = start.start_cubit()
  30. except:
  31. try:
  32. import cubit
  33. except:
  34. print 'error importing cubit, check if cubit is installed'
  35. pass
  36. import glob
  37. def add_sea_layer(block=1001,optionsea=False):
  38. if optionsea:
  39. sea=optionsea['sea']
  40. seaup=optionsea['seaup']
  41. sealevel=optionsea['sealevel']
  42. seathres=optionsea['seathres']
  43. else:
  44. sea=False
  45. seaup=False
  46. sealevel=False
  47. seathres=False
  48. ######TODO
  49. #add sea hex
  50. #change hex absoorbing....
  51. block_list=cubit.get_block_id_list()
  52. id_block = max(block for block in block_list if block<1000)
  53. cubit.cmd('delete block '+str(id_block))
  54. #sea
  55. command= 'block '+str(id_block)+' hex in node in face in block '+str(block)+' with Z_coord < '+str(seathres)
  56. cubit.cmd(command)
  57. command = "block "+str(id_block)+" name 'sea'"
  58. cubit.cmd(command)
  59. if not seaup:
  60. id_block+=1
  61. command= 'block '+str(id_block)+' hex in node in face in block '+str(block)+' with (Z_coord > '+str(seathres)+' and Z_coord < '+str(sealevel)+')'
  62. cubit.cmd(command)
  63. command = "block "+str(id_block)+" name 'shwater'"
  64. cubit.cmd(command)
  65. id_block+=1
  66. command= 'block '+str(id_block)+' hex in node in face in block '+str(block)+' with Z_coord >= '+str(sealevel)
  67. cubit.cmd(command)
  68. command = "block "+str(id_block)+" name 'continent'"
  69. cubit.cmd(command)
  70. def importing_cubfiles(cubfiles):
  71. import re
  72. rule_st=re.compile("(.+)_[0-9]+\.")
  73. rule_ex=re.compile(".+_[0-9]+\.(.+)")
  74. rule_int=re.compile(".+_([0-9]+)\.")
  75. filenames=glob.glob(cubfiles)
  76. try:
  77. st = rule_st.findall(filenames[0])[0]
  78. ex = rule_ex.findall(filenames[0])[0]
  79. listflag=True
  80. except:
  81. ex=''
  82. listflag=False
  83. if ex == 'cub':
  84. cubflag=True
  85. else:
  86. cubflag=False
  87. list_int=[]
  88. fs=[]
  89. try:
  90. for f in filenames:
  91. i=int(rule_int.findall(f)[0])
  92. list_int.append(i)
  93. list_int.sort()
  94. for i,ind in enumerate(list_int):
  95. f=st+'_'+str(ind)+'.'+ex
  96. fs.append(f)
  97. except:
  98. pass
  99. if listflag:
  100. filenames=fs
  101. else:
  102. pass
  103. return len(filenames),list_int,filenames,cubflag
  104. def refine_closecurve(block=1001,closed_filenames=None,acis=True):
  105. from utilities import load_curves
  106. from boundary_definition import build_block_side,define_surf
  107. from mesh_volume import refine_inside_curve
  108. #
  109. #
  110. curves=[]
  111. if not isinstance(closed_filenames,list): closed_filenames=[closed_filenames]
  112. for f in closed_filenames:
  113. print f
  114. if acis:
  115. curves=curves+load_curves(f)
  116. print curves
  117. blist=list(cubit.get_block_id_list())
  118. try:
  119. blist.remove(1001)
  120. except:
  121. pass
  122. try:
  123. blist.remove(1002)
  124. except:
  125. pass
  126. try:
  127. blist.remove(1003)
  128. except:
  129. pass
  130. try:
  131. blist.remove(1004)
  132. except:
  133. pass
  134. try:
  135. blist.remove(1005)
  136. except:
  137. pass
  138. try:
  139. blist.remove(1006)
  140. except:
  141. pass
  142. id_top=max(blist)
  143. cmd='group "coi" add node in hex in block '+str(id_top)
  144. cubit.cmd(cmd)
  145. #
  146. id_inside_arc=None
  147. for c in map(int,curves[0].split()): #curves is a list of one string
  148. c1001 = cubit.get_exodus_element_count(1001, "block")
  149. c1002 = cubit.get_exodus_element_count(1002, "block")
  150. c1003 = cubit.get_exodus_element_count(1003, "block")
  151. c1004 = cubit.get_exodus_element_count(1004, "block")
  152. c1005 = cubit.get_exodus_element_count(1005, "block")
  153. c1006 = cubit.get_exodus_element_count(1006, "block")
  154. #
  155. refine_inside_curve(c,ntimes=1,depth=1,block=block,surface=False)
  156. blist=list(cubit.get_block_id_list())
  157. cmd='create mesh geometry hex all except hex in block all feature_angle 135'
  158. cubit.cmd(cmd)
  159. blist_after=list(cubit.get_block_id_list())
  160. [blist_after.remove(x) for x in blist]
  161. id_inside=max(blist_after)
  162. cmd='group "coi" add node in hex in block '+str(id_inside)
  163. cubit.cmd(cmd)
  164. if id_inside_arc:
  165. cmd='del block '+str(id_inside-1)
  166. cubit.cmd(cmd)
  167. cmd='block '+str(id_inside)+' name "refined"'
  168. cubit.cmd(cmd)
  169. id_inside_arc=id_inside
  170. #
  171. _,_,_,_,_,top_surf,bottom_surf,surf_xmin,surf_ymin,surf_xmax,surf_ymax=define_surf()
  172. #
  173. c1001_after = cubit.get_exodus_element_count(1001, "block")
  174. c1002_after = cubit.get_exodus_element_count(1002, "block")
  175. c1003_after = cubit.get_exodus_element_count(1003, "block")
  176. c1004_after = cubit.get_exodus_element_count(1004, "block")
  177. c1005_after = cubit.get_exodus_element_count(1005, "block")
  178. c1006_after = cubit.get_exodus_element_count(1006, "block")
  179. entity='face'
  180. if c1001_after != c1001:
  181. refname=entity+'_topo'
  182. build_block_side(top_surf,refname,obj=entity,id_0=1001)
  183. #
  184. if c1002_after != c1002:
  185. refname=entity+'_bottom'
  186. build_block_side(bottom_surf,refname,obj=entity,id_0=1002)
  187. #
  188. if c1003_after != c1003:
  189. refname=entity+'_abs_xmin'
  190. build_block_side(surf_xmin,refname,obj=entity,id_0=1003)
  191. #
  192. if c1004_after != c1004:
  193. refname=entity+'_abs_ymin'
  194. build_block_side(surf_ymin,refname,obj=entity,id_0=1004)
  195. #
  196. if c1005_after != c1005:
  197. refname=entity+'_abs_xmax'
  198. build_block_side(surf_xmax,refname,obj=entity,id_0=1005)
  199. #
  200. if c1006_after != c1006:
  201. refname=entity+'_abs_ymax'
  202. build_block_side(surf_ymax,refname,obj=entity,id_0=1006)
  203. #
  204. cmd='disassociate mesh from volume all'
  205. cubit.cmd(cmd)
  206. cmd='group "coi" add node in face in block 1001 1002 1003 1004 1005 1006'
  207. cubit.cmd(cmd)
  208. cubit.cmd('del vol all')
  209. cubit.cmd('group "removedouble" add hex all except hex in block all')
  210. cubit.cmd('delete hex in removedouble')
  211. cubit.cmd('delet group removedouble')
  212. cmd='equivalence node in group coi tolerance 20'
  213. cubit.cmd(cmd)
  214. cmd='equivalence node all tolerance 10'
  215. cubit.cmd(cmd)
  216. cubit.cmd('del curve '+' '.join(str(x) for x in curves) )
  217. def collecting_merging(cpuxmin=0,cpuxmax=1,cpuymin=0,cpuymax=1,cpux=1,cpuy=1,cubfiles=False,ckbound_method1=False,ckbound_method2=False,merge_tolerance=None,decimate=False):
  218. import glob
  219. import re
  220. #
  221. rule_st=re.compile("(.+)_[0-9]+\.")
  222. rule_ex=re.compile(".+_[0-9]+\.(.+)")
  223. rule_int=re.compile(".+_([0-9]+)\.")
  224. boundary_dict={}
  225. ##
  226. try:
  227. from boundary_definition import check_bc, map_boundary
  228. except:
  229. pass
  230. #
  231. xmin,xmax,ymin,ymax,listfull=map_boundary(cpuxmin,cpuxmax,cpuymin,cpuymax,cpux,cpuy)
  232. #
  233. if cubfiles:
  234. nf,listip,filenames,cubflag=importing_cubfiles(cubfiles)
  235. else:
  236. nf=0
  237. filenames=[]
  238. ip=0
  239. #
  240. if nf > 0:
  241. for ip,filename in zip(listip,filenames):
  242. try:
  243. if ip in listfull:
  244. if cubflag:
  245. cubit.cmd('import cubit "'+filename+'"')
  246. else:
  247. cubit.cmd('import mesh geometry "'+filename+'" block all use nodeset sideset feature_angle 135.00 linear merge')
  248. if decimate: cubit.cmd('refine volume all numsplit 1 bias 1.0 depth 1 ')
  249. boundary=check_bc(ip,xmin,xmax,ymin,ymax,cpux,cpuy,cpuxmin,cpuxmax,cpuymin,cpuymax)
  250. boundary_dict[ip]=boundary
  251. list_vol=list(cubit.parse_cubit_list('volume','all'))
  252. for v in list_vol:
  253. cubit.cmd("disassociate mesh from volume "+str(v))
  254. command = "del vol "+str(v)
  255. cubit.cmd(command)
  256. except:
  257. cubit.cmd('import mesh geometry "'+filename+'" block all use nodeset sideset feature_angle 135.00 linear merge')
  258. if decimate: cubit.cmd('refine volume all numsplit 1 bias 1.0 depth 1 ')
  259. ip=0
  260. boundary=check_bc(ip,xmin,xmax,ymin,ymax,cpux,cpuy,cpuxmin,cpuxmax,cpuymin,cpuymax)
  261. boundary_dict[ip]=boundary
  262. list_vol=list(cubit.parse_cubit_list('volume','all'))
  263. for v in list_vol:
  264. cubit.cmd("disassociate mesh from volume "+str(v))
  265. command = "del vol "+str(v)
  266. cubit.cmd(command)
  267. cubit.cmd('export mesh "tmp_collect_NOmerging.e" dimension 3 block all overwrite')
  268. else:
  269. if decimate: cubit.cmd('refine volume all numsplit 1 bias 1.0 depth 1 ')
  270. boundary=check_bc(ip,xmin,xmax,ymin,ymax,cpux,cpuy,cpuxmin,cpuxmax,cpuymin,cpuymax)
  271. #
  272. #
  273. #print boundary_dict
  274. block_list=cubit.get_block_id_list()
  275. for block in block_list:
  276. ty=cubit.get_block_element_type(block)
  277. if ty == 'HEX8':
  278. cubit.cmd('block '+str(block)+' name "vol'+str(block)+'"')
  279. #
  280. #
  281. print 'chbound',ckbound_method1,ckbound_method2
  282. if ckbound_method1 and not ckbound_method2 and len(filenames) != 1:
  283. #use the equivalence method for groups
  284. if isinstance(merge_tolerance,list):
  285. tol=merge_tolerance[0]
  286. elif merge_tolerance:
  287. tol=merge_tolerance
  288. else:
  289. tol=100000
  290. #
  291. idiag=None
  292. #cubit.cmd('set info off')
  293. #cubit.cmd('set journal off')
  294. #cubit.cmd('set echo off')
  295. ind=0
  296. for ix in range(cpuxmin,cpuxmax):
  297. for iy in range(cpuymin,cpuymax):
  298. ind=ind+1
  299. ip=iy*cpux+ix
  300. print '******************* ',ip, ind,'/',len(listfull)
  301. #
  302. # ileft | ip
  303. # --------------------
  304. # idiag | idown
  305. #
  306. #
  307. if ip not in xmin and ip not in ymin:
  308. ileft=iy*cpux+ix-1
  309. idown=(iy-1)*cpux+ix
  310. idiag=idown-1
  311. elif ip in xmin and ip in ymin:
  312. ileft=ip
  313. idown=ip
  314. idiag=None
  315. elif ip in xmin:
  316. ileft=ip
  317. idown=(iy-1)*cpux+ix
  318. idiag=idown
  319. elif ip in ymin:
  320. ileft=iy*cpux+ix-1
  321. idown=ip
  322. idiag=ileft
  323. #
  324. print ip,ileft,idiag,idown
  325. if ip != idown:
  326. nup=boundary_dict[ip]['nodes_surf_ymin']
  327. ndow=boundary_dict[idown]['nodes_surf_ymax']
  328. merge_node_ck(nup,ndow)
  329. if idiag != idown:
  330. if ip in ymax and ip not in xmin:
  331. nlu=boundary_dict[ip]['node_curve_xminymax'] #node in curve chunck left up... r u
  332. nru=boundary_dict[ileft]['node_curve_xmaxymax']
  333. merge_node(nlu,nru)
  334. if ip in xmax:
  335. nrd=boundary_dict[ip]['node_curve_xmaxymin'] #node in curve chunck left up... r u
  336. nru=boundary_dict[idown]['node_curve_xmaxymax']
  337. merge_node(nrd,nru)
  338. nru=boundary_dict[ip]['node_curve_xminymin'] #node in curve chunck right up... r u
  339. nrd=boundary_dict[idown]['node_curve_xminymax']
  340. nld=boundary_dict[idiag]['node_curve_xmaxymax']
  341. nlu=boundary_dict[ileft]['node_curve_xmaxymin']
  342. merge_node_4(nru,nrd,nld,nlu)
  343. elif ip in xmin:
  344. nlu=boundary_dict[ip]['node_curve_xminymin'] #node in curve chunck right up... r u
  345. nld=boundary_dict[idown]['node_curve_xminymax']
  346. merge_node(nld,nlu)
  347. nru=boundary_dict[ip]['node_curve_xmaxymin'] #node in curve chunck right up... r u
  348. nrd=boundary_dict[idown]['node_curve_xmaxymax']
  349. merge_node(nrd,nru)
  350. #
  351. if ip != ileft:
  352. nright=boundary_dict[ip]['nodes_surf_xmin']
  353. nleft=boundary_dict[ileft]['nodes_surf_xmax']
  354. merge_node_ck(nright,nleft)
  355. #
  356. #
  357. if ip in ymin:
  358. nrd=boundary_dict[ip]['node_curve_xminymin'] #node in curve chunck right down... r u
  359. nld=boundary_dict[ileft]['node_curve_xmaxymin']
  360. merge_node(nrd,nld)
  361. if ip in ymax:
  362. nru=boundary_dict[ip]['node_curve_xminymax'] #node in curve chunck right up... r u
  363. nlu=boundary_dict[ileft]['node_curve_xmaxymax']
  364. merge_node(nlu,nru)
  365. cubit.cmd('set info on')
  366. cubit.cmd('set echo on')
  367. cubit.cmd('set journal on')
  368. #
  369. #
  370. cmd='group "negativejac" add quality hex all Jacobian high'
  371. cubit.cmd(cmd)
  372. group_id_1=cubit.get_id_from_name("negativejac")
  373. n1=cubit.get_group_nodes(group_id_1)
  374. if len(n1) != 0:
  375. print 'error, negative jacobian after the equivalence node command, use --merge2 instead of --equivalence/--merge/--merge1'
  376. elif ckbound_method2 and not ckbound_method1 and len(filenames) != 1:
  377. if isinstance(merge_tolerance,list):
  378. tol=merge_tolerance[0]
  379. elif merge_tolerance:
  380. tol=merge_tolerance
  381. else:
  382. tol=100000
  383. #
  384. idiag=None
  385. for ix in range(cpuxmin,cpuxmax):
  386. for iy in range(cpuymin,cpuymax):
  387. ip=iy*cpux+ix
  388. print '******************* ',ip
  389. #
  390. # ileft | ip
  391. # --------------------
  392. # idiag | idown
  393. #
  394. #
  395. if ip not in xmin and ip not in ymin:
  396. ileft=iy*cpux+ix-1
  397. idown=(iy-1)*cpux+ix
  398. idiag=idown-1
  399. elif ip in xmin and ip in ymin:
  400. ileft=ip
  401. idown=ip
  402. elif ip in xmin:
  403. ileft=ip
  404. idown=(iy-1)*cpux+ix
  405. idiag=idown
  406. elif ip in ymin:
  407. ileft=iy*cpux+ix-1
  408. idown=ip
  409. idiag=ileft
  410. #
  411. #
  412. if ip != idown:
  413. nup=boundary_dict[ip]['nodes_surf_ymin']
  414. ndow=boundary_dict[idown]['nodes_surf_ymax']
  415. for n1,n2 in zip(nup,ndow):
  416. cubit.cmd('equivalence node '+str(n1)+' '+str(n2)+' tolerance '+str(tol))
  417. if idiag != idown:
  418. if ip in ymax and ip not in xmin:
  419. nlu=boundary_dict[ip]['node_curve_xminymax'] #node in curve chunck left up... r u
  420. nru=boundary_dict[ileft]['node_curve_xmaxymax']
  421. for n in zip(nlu,nru):
  422. cubit.cmd('equivalence node '+' '.join(str(x) for x in n)+' tolerance '+str(tol))
  423. nru=boundary_dict[ip]['node_curve_xminymin'] #node in curve chunck right up... r u
  424. nrd=boundary_dict[idown]['node_curve_xminymax']
  425. nld=boundary_dict[idiag]['node_curve_xmaxymax']
  426. nlu=boundary_dict[ileft]['node_curve_xmaxymin']
  427. for n in zip(nru,nrd,nlu,nld):
  428. cubit.cmd('equivalence node '+' '.join(str(x) for x in n)+' tolerance '+str(tol))
  429. elif ip in xmin:
  430. nru=boundary_dict[ip]['node_curve_xminymin'] #node in curve chunck right up... r u
  431. nrd=boundary_dict[idown]['node_curve_xminymax']
  432. for n in zip(nru,nrd):
  433. cubit.cmd('equivalence node '+' '.join(str(x) for x in n)+' tolerance '+str(tol))
  434. #
  435. #
  436. if ip != ileft:
  437. nright=boundary_dict[ip]['nodes_surf_xmin']
  438. nleft=boundary_dict[ileft]['nodes_surf_xmax']
  439. for n1,n2 in zip(nleft,nright):
  440. cubit.cmd('equivalence node '+str(n1)+' '+str(n2)+' tolerance '+str(tol))
  441. #
  442. #
  443. if ip in ymin:
  444. nrd=boundary_dict[ip]['node_curve_xminymin'] #node in curve chunck right down... r u
  445. nld=boundary_dict[ileft]['node_curve_xmaxymin']
  446. for n in zip(nrd,nld):
  447. cubit.cmd('equivalence node '+' '.join(str(x) for x in n)+' tolerance '+str(tol))
  448. if ip in ymax:
  449. nru=boundary_dict[ip]['node_curve_xminymax'] #node in curve chunck right up... r u
  450. nlu=boundary_dict[ileft]['node_curve_xmaxymax']
  451. for n in zip(nru,nlu):
  452. cubit.cmd('equivalence node '+' '.join(str(x) for x in n)+' tolerance '+str(tol))
  453. #
  454. #
  455. cmd='topology check coincident node face all tolerance '+str(tol*2)+' nodraw brief result group "checkcoinc"'
  456. cubit.silent_cmd(cmd)
  457. group_id_1=cubit.get_id_from_name("checkcoinc")
  458. if group_id_1 != 0:
  459. n1=cubit.get_group_nodes(group_id_1)
  460. if len(n1) != 0:
  461. print 'error, coincident nodes after the equivalence node command, check the tolerance'
  462. import sys
  463. sys.exit()
  464. cmd='group "negativejac" add quality hex all Jacobian high'
  465. cubit.cmd(cmd)
  466. group_id_1=cubit.get_id_from_name("negativejac")
  467. n1=cubit.get_group_nodes(group_id_1)
  468. if len(n1) != 0:
  469. print 'error, negative jacobian after the equivalence node command, check the mesh'
  470. elif ckbound_method1 and ckbound_method2 and len(filenames) != 1:
  471. block_list=cubit.get_block_id_list()
  472. i=-1
  473. for block in block_list:
  474. ty=cubit.get_block_element_type(block)
  475. if ty == 'HEX8':
  476. i=i+1
  477. if isinstance(merge_tolerance,list):
  478. try:
  479. tol=merge_tolerance[i]
  480. except:
  481. tol=merge_tolerance[-1]
  482. elif merge_tolerance:
  483. tol=merge_tolerance
  484. else:
  485. tol=1
  486. cmd='topology check coincident node face in hex in block '+str(block)+' tolerance '+str(tol)+' nodraw brief result group "b'+str(block)+'"'
  487. cubit.cmd(cmd)
  488. print cmd
  489. cmd='equivalence node in group b'+str(block)+' tolerance '+str(tol)
  490. cubit.cmd(cmd)
  491. print cmd
  492. if isinstance(merge_tolerance,list):
  493. tol=max(merge_tolerance)
  494. elif merge_tolerance:
  495. tol=merge_tolerance
  496. else:
  497. tol=1
  498. #
  499. #
  500. cmd='topology check coincident node face all tolerance '+str(tol)+' nodraw brief result group "checkcoinc"'
  501. cubit.silent_cmd(cmd)
  502. group_id_1=cubit.get_id_from_name("checkcoinc")
  503. if group_id_1 != 0:
  504. n1=cubit.get_group_nodes(group_id_1)
  505. if len(n1) != 0:
  506. print 'error, coincident nodes after the equivalence node command, check the tolerance'
  507. import sys
  508. sys.exit()
  509. cmd='group "negativejac" add quality hex all Jacobian high'
  510. cubit.silent_cmd(cmd)
  511. group_id_1=cubit.get_id_from_name("negativejac")
  512. n1=cubit.get_group_nodes(group_id_1)
  513. if len(n1) != 0:
  514. print 'error, negative jacobian after the equivalence node command, use --merge instead of --equivalence'
  515. def collect(cpuxmin=0,cpuxmax=1,cpuymin=0,cpuymax=1,cpux=1,cpuy=1,cubfiles=False,ckbound_method1=False,ckbound_method2=False,merge_tolerance=None,curverefining=False,outfilename='totalmesh_merged',qlog=False,export2SPECFEM3D=False,listblock=None,listflag=None,outdir='.',add_sea=False,decimate=False,cpml=False,cpml_size=False,top_absorbing=False,hex27=False):
  516. #
  517. cubit.cmd('set journal error off')
  518. cubit.cmd('set verbose error off')
  519. collecting_merging(cpuxmin,cpuxmax,cpuymin,cpuymax,cpux,cpuy,cubfiles=cubfiles,ckbound_method1=ckbound_method1,ckbound_method2=ckbound_method2,merge_tolerance=merge_tolerance,decimate=decimate)
  520. cubit.cmd('set journal error on')
  521. cubit.cmd('set verbose error on')
  522. #
  523. if curverefining:
  524. block=1001 #topography
  525. refine_closecurve(block,curverefining,acis=True)
  526. #
  527. #
  528. if add_sea:
  529. block=1001
  530. add_sea_layer(block=block)
  531. outdir2='/'.join(x for x in outfilename.split('/')[:-1])
  532. if outdir2 == '':
  533. outdir2=outdir+'/'
  534. else:
  535. outdir2=outdir+'/'+outdir2+'/'
  536. import os
  537. try:
  538. os.makedirs(outdir2)
  539. except OSError:
  540. pass
  541. cubit.cmd('compress all')
  542. command="export mesh '"+outdir2+outfilename+".e' block all overwrite xml '"+outdir2+outfilename+".xml'"
  543. cubit.cmd(command)
  544. f=open(outdir2+'blocks.dat','w')
  545. blocks=cubit.get_block_id_list()
  546. #
  547. for block in blocks:
  548. name=cubit.get_exodus_entity_name('block',block)
  549. element_count = cubit.get_exodus_element_count(block, "block")
  550. nattrib=cubit.get_block_attribute_count(block)
  551. attr=[cubit.get_block_attribute_value(block,x) for x in range(0,nattrib)]
  552. ty=cubit.get_block_element_type(block)
  553. f.write(str(block)+' ; '+name+' ; nattr '+str(nattrib)+' ; '+' '.join(str(x) for x in attr)+' ; '+ty+' '+str(element_count)+'\n')
  554. f.close()
  555. #
  556. #
  557. cubit.cmd('set info echo journ off')
  558. cmd='del group all'
  559. cubit.silent_cmd(cmd)
  560. cubit.cmd('set info echo journ on')
  561. #
  562. command = "save as '"+outdir2+outfilename+".cub' overwrite"
  563. cubit.cmd(command)
  564. #
  565. print 'end meshing'
  566. #
  567. #
  568. if qlog:
  569. print '\n\nQUALITY CHECK.... ***************\n\n'
  570. import quality_log
  571. tq=open(outdir2+outfilename+'.quality','w')
  572. max_skewness,min_length=quality_log.quality_log(tq)
  573. #
  574. #
  575. #
  576. if export2SPECFEM3D:
  577. e2SEM(files=False,listblock=listblock,listflag=listflag,outdir=outdir,cpml=cpml,cpml_size=cpml_size,top_absorbing=top_absorbing,hex27=hex27)
  578. def e2SEM(files=False,listblock=None,listflag=None,outdir='.',cpml=False,cpml_size=False,top_absorbing=False,hex27=False):
  579. import glob
  580. if files:
  581. filenames=glob.glob(files)
  582. for f in filenames:
  583. print f
  584. extension=f.split('.')[-1]
  585. if extension == 'cub':
  586. cubit.cmd('open "'+f+'"')
  587. elif extension== 'e':
  588. cubit.cmd('import mesh "'+f+'" no_geom')
  589. else:
  590. print extension
  591. if listblock and listflag:
  592. pass
  593. else:
  594. listblock=[]
  595. listflag=[]
  596. block_list=list(cubit.get_block_id_list())
  597. for block in block_list:
  598. ty=cubit.get_block_element_type(block)
  599. if 'HEX' in ty:
  600. listblock.append(block)
  601. #listflag.append(block)
  602. listflag=range(1,len(block_list)+1)
  603. #
  604. for ib,iflag in zip(listblock,listflag):
  605. cubit.cmd("block "+str(ib)+" attribute count 1")
  606. cubit.cmd("block "+str(ib)+" attribute index 1 "+ str(iflag) )
  607. #
  608. import cubit2specfem3d
  609. cubit2specfem3d.export2SPECFEM3D(outdir,cpml=cpml,cpml_size=cpml_size,top_absorbing=top_absorbing,hex27=hex27)
  610. def invert_dict(d):
  611. inv = {}
  612. for k,v in d.iteritems():
  613. keys = inv.setdefault(v, [])
  614. keys.append(k)
  615. return inv
  616. def prepare_equivalence(nodes1,nodes2):
  617. cubit.cmd('set info off')
  618. cubit.cmd('set echo off')
  619. cubit.cmd('set journal off')
  620. length={}
  621. for ns in zip(nodes1,nodes2):
  622. cmd='group "tmpn" add edge in node '+' '.join(str(n) for n in ns )
  623. cubit.cmd(cmd)
  624. ge=cubit.get_id_from_name("tmpn")
  625. e1=cubit.get_group_edges(ge)
  626. lengthmin=1e9
  627. for e in e1:
  628. lengthmin=min(lengthmin,cubit.get_mesh_edge_length(e))
  629. length[ns]=lengthmin*.5
  630. cubit.cmd('delete group '+str(ge))
  631. minvalue=min(length.values())
  632. maxvalue=max(length.values())
  633. print 'min lentgh: ',minvalue,'max lentgh: ',maxvalue
  634. nbin= int((maxvalue/minvalue)/2.)+1
  635. factor=(maxvalue-minvalue)/nbin
  636. dic_new={}
  637. for k in length.keys():
  638. dic_new[k]=int((length[k]-minvalue)/factor)
  639. inv_length=invert_dict(dic_new)
  640. print inv_length.keys(),factor,minvalue
  641. ks=inv_length.keys()
  642. ks.sort()
  643. for k in range(0,len(inv_length.keys())-1):
  644. inv_length[ks[k]]=inv_length[ks[k]]+inv_length[ks[k+1]]
  645. cubit.cmd('set info on')
  646. cubit.cmd('set echo on')
  647. cubit.cmd('set journal on')
  648. return factor,minvalue,inv_length
  649. def merge_node_ck(n1,n2):
  650. factor,minvalue,inv_length=prepare_equivalence(n1,n2)
  651. cubit.cmd('set info off')
  652. cubit.cmd('set echo off')
  653. cubit.cmd('set journal off')
  654. cubit.cmd('set error off')
  655. for k in inv_length.keys()[:-1]:
  656. if len(inv_length[k]) > 0:
  657. cmd='equivalence node '+' '.join(' '.join(str(n) for n in x) for x in inv_length[k])+' tolerance '+str(k*factor+minvalue/2.)
  658. cubit.cmd(cmd)
  659. print 'equivalence '+str(len(inv_length[k]))+' couples of nodes - tolerance '+str(k*factor+minvalue/2.)
  660. cubit.cmd('group "checkmerge" add node '+' '.join(str(n) for n in n1)+' '+' '.join(str(n) for n in n2))
  661. idg=cubit.get_id_from_name('checkmerge')
  662. remainnodes=cubit.get_group_nodes(idg)
  663. print 'from '+str(len(n1)+len(n2))+' nodes -> '+str(len(remainnodes)) +' nodes'
  664. if len(n1) != len(remainnodes):
  665. print 'equivalence '+str(len(remainnodes))+' couples of nodes - tolerance '+str(minvalue/2.)
  666. cubit.cmd('set info on')
  667. cubit.cmd('set echo on')
  668. cubit.cmd('set journal on')
  669. cmd='equivalence node in group '+str(idg)+' tolerance '+str(minvalue/2.)
  670. cubit.cmd(cmd)
  671. cmd='block 3000 node in group '+str(idg)
  672. cubit.cmd(cmd)
  673. if len(n1) != len(remainnodes):
  674. cubit.cmd('export mesh "error_merging.e" dimension 3 block all overwrite')
  675. cubit.cmd('save as "error_merging.cub" dimension 3 block all overwrite')
  676. print 'error merging '
  677. if False:
  678. import sys
  679. sys.exit(2)
  680. cubit.cmd('delete group checkmerge')
  681. cubit.cmd('delete block 3000')
  682. cubit.cmd('set info on')
  683. cubit.cmd('set echo on')
  684. cubit.cmd('set journal on')
  685. def merge_node(n1,n2):
  686. factor,minvalue,inv_length=prepare_equivalence(n1,n2)
  687. cubit.cmd('set info off')
  688. cubit.cmd('set echo off')
  689. cubit.cmd('set journal off')
  690. for k in inv_length.keys()[:-1]:
  691. if len(inv_length[k]) > 0:
  692. cmd='equivalence node '+' '.join(' '.join(str(n) for n in x) for x in inv_length[k])+' tolerance '+str(k*factor+minvalue/2.)
  693. cubit.cmd(cmd)
  694. print 'equivalence '+str(len(inv_length[k]))+' couples of nodes - tolerance '+str(k*factor+minvalue/2.)
  695. cubit.cmd('set info on')
  696. cubit.cmd('set echo on')
  697. cubit.cmd('set journal on')
  698. def prepare_equivalence_4(nodes1,nodes2,nodes3,nodes4):
  699. cubit.cmd('set info off')
  700. cubit.cmd('set echo off')
  701. cubit.cmd('set journal off')
  702. length={}
  703. nodes=[nodes1,nodes2,nodes3,nodes4]
  704. check=map(len,nodes)
  705. checked_nodes=[]
  706. for ind,iflag in enumerate(check):
  707. if iflag:
  708. checked_nodes=checked_nodes+nodes[ind]
  709. cmd='group "tmpn" add edge in node '+' '.join(str(n) for n in checked_nodes )
  710. cubit.cmd(cmd)
  711. ge=cubit.get_id_from_name("tmpn")
  712. e1=cubit.get_group_edges(ge)
  713. lengthmin=1e9
  714. for e in e1:
  715. lengthmin=min(lengthmin,cubit.get_mesh_edge_length(e))
  716. length[e]=lengthmin*.5
  717. cubit.cmd('delete group '+str(ge))
  718. try:
  719. minvalue=min(length.values())
  720. maxvalue=max(length.values())
  721. except:
  722. try:
  723. print nodes
  724. print 'edges ', e1
  725. except:
  726. pass
  727. minvalue=10.
  728. maxvalue=2000.
  729. print 'min lentgh: ',minvalue,'max lentgh: ',maxvalue
  730. nbin= int((maxvalue/minvalue)/2.)+1
  731. factor=(maxvalue-minvalue)/nbin
  732. dic_new={}
  733. for k in length.keys():
  734. dic_new[k]=int((length[k]-minvalue)/factor)
  735. inv_length=invert_dict(dic_new)
  736. print inv_length.keys(),factor,minvalue
  737. ks=inv_length.keys()
  738. ks.sort()
  739. for k in range(0,len(inv_length.keys())-1):
  740. inv_length[ks[k]]=inv_length[ks[k]]+inv_length[ks[k+1]]
  741. cubit.cmd('set info on')
  742. cubit.cmd('set echo on')
  743. cubit.cmd('set journal on')
  744. return factor,minvalue,inv_length
  745. def ording_z(nodes):
  746. def get_z(node):
  747. x,y,z = cubit.get_nodal_coordinates(node)
  748. return z
  749. d = [(get_z(node), node) for node in nodes]
  750. d.sort()
  751. return [x[1] for x in d]
  752. def merge_node_4(n1,n2,n3,n4,newmethod=True):
  753. if newmethod:
  754. print "merge node 4 side"
  755. n1o=ording_z(n1)
  756. n2o=ording_z(n2)
  757. n3o=ording_z(n3)
  758. n4o=ording_z(n4)
  759. for ln in zip(n1o,n2o,n3o,n4o):
  760. cmd='equivalence node '+' '.join(str(n) for n in ln) +' tolerance 10000 '
  761. cubit.cmd(cmd)
  762. #
  763. #allnodes=n1+n2+n3+n4
  764. #print allnodes
  765. #for n in allnodes:
  766. # print n
  767. #cmd='equivalence node '+' '.join(str(n) for n in allnodes) +' tolerance 10 '
  768. #cubit.cmd(cmd)
  769. else:
  770. factor,minvalue,inv_length=prepare_equivalence_4(n1,n2,n3,n4)
  771. for k in inv_length.keys()[:-1]:
  772. if len(inv_length[k]) > 1:
  773. try:
  774. for x in inv_length[k]:
  775. if type(x) is not list:
  776. x=[x]
  777. else:
  778. pass
  779. cmd='equivalence node '+' '.join(' '.join(str(n) for n in x) )+' tolerance '+str(k*factor+minvalue/2.)
  780. except:
  781. print k,"***************************************** s"
  782. print inv_length[k]
  783. cubit.cmd(cmd)
  784. print 'equivalence '+str(len(inv_length[k]))+' couples of nodes - tolerance '+str(k*factor+minvalue/2.)
  785. if len(inv_length[k]) == 1:
  786. cmd='equivalence node '+' '.join(' '.join(str(n) for n in inv_length[k]))+' tolerance '+str(k*factor+minvalue/2.)
  787. cubit.cmd(cmd)
  788. print 'equivalence '+str(len(inv_length[k]))+' couples of nodes - tolerance '+str(k*factor+minvalue/2.)