0%

如何将unv格式的网格转化成msh格式

出发点

使用Nektar++开源软件必须导入其支持的.xml格式,当前Nektar++支持msh格式,但是用gmsh生成网格可能不太方便,自己也不熟悉。所以现在使用其他网格生成软件导出的unv格式网格,在gmsh中将网格转化成unv格式。

实现

虽说gmsh支持unv网格转化为msh网格,但是在转化过程中常常会出现边界信息丢失或是混乱的状况。gmsh是根据几何的编号来划分物理边界的。这里生成网格后,对边界分配color ID,然后编写简单的程序将color ID强制分配给physical IDmaterial ID,最后利用gmsh转化为msh网格。

注意:

  • 生成导出的unv网格中坐标使用类似1.0D01的双精度的格式,C++读入含有D的数字时存在问题,尚未找到解决方法。
  • 导出网格对边界进行color ID分配时,避免使用0,使用0gmsh在导出version 2网格时可能会出错,出错症状是color ID0的元素无法按照默认方式导出。

参考

section 2411 describes elements

http://www.sdrl.uc.edu/sdrl/referenceinfo/universalfileformats/file-format-storehouse/universal-dataset-number-2411

section 2412 describes elements

http://www.sdrl.uc.edu/sdrl/referenceinfo/universalfileformats/file-format-storehouse/universal-dataset-number-2412

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
program unv2msh
implicit none
integer i,j
character*32 input
character*32 output
character*200 check
integer element_num,status

integer element_label,fe_id,phsical,material,color,element_node_label

input='ideas'
output='target.unv'

open(unit=1,file=input,status='old')
open(unit=2,file=output,status='replace')
check='0'
do while (trim(adjustl(check)).ne.'2411')
read(1,'(a)') check
write(2,'(g0)') trim(check)
end do
do while (trim(adjustl(check)).ne.'-1')
read(1,'(a)') check
write(2,'(g0)') trim(check)
end do
do while (trim(adjustl(check)).ne.'2412')
read(1,'(a)') check
write(2,'(g0)') trim(check)
end do

element_label=0
do while(element_label.ne.-1)
read(1,*) element_label
backspace(1)
if(element_label==-1) then
do i=1,3
read(1,'(a)') check
write(2,'(g0)') trim(check)
end do
exit
end if


read(1,*) element_label,fe_id,phsical,material,color,element_node_label
write(2,*) element_label,fe_id,color,color,color,element_node_label
if((element_node_label==4) .or. &
(element_node_label==3) .or. &
(element_node_label==6) .or. &
(element_node_label==8)) then
do i=1,1
read(1,'(a)') check
write(2,'(g0)') trim(check)
end do
else if(element_node_label==2) then
do i=1,2
read(1,'(a)') check
write(2,'(g0)') trim(check)
end do
end if
end do

status=0
do while (status==0)
read(1,'(a)',iostat=status) check
if(status.ne.0)exit
write(2,'(g0)') trim(check)
!if(trim(adjustl(check)).eq.'-1') then
! write(2,'(g0)') trim(check)
!else
! write(2,'(g0)') trim(check)
!end if
end do

close(1)
close(2)
end