-
Notifications
You must be signed in to change notification settings - Fork 2
/
ans2unv.mac
228 lines (223 loc) · 6.68 KB
/
ans2unv.mac
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
!*
!* TITLE : ANSYS to Ideas UNV (i-deas) File translator
!* FUNCTION: This macro translates element and nodal data FOR THE CURRENTLY
!* SELECTED SET OF ELEMENTS into Ideas Neutral File (UNV)
!* format.
!* Based on the Ansys to Patran 2 macro developed by G. May
!* and available in ansys.net
!*
!* LIMITATIONS: 1) only the following element types can be read/written:
!* * SOLID45 = 8-noded hexahedral element
!* * SOLID45 = 4-noded tetrahedral element
!* * SOLID92 = 10-noded tetrahedral element
!* * SOLID95 = 20-noded hexahedral element
!*
!* USAGE: ans2unv,arg1,arg2
!*
!* where arg1 : *** NOT USED ***
!* arg2 : output file name (extension is .unv)
!* arg3 : element "domain" number [default=1]
!*
finish ! return to "BEGIN" level
/NOPR ! switch output OFF
/com,
/com,========================================================================
/com,= ANSYS to UNV (i-deas) File translator =
/com,========================================================================
/com,
ar51 = 'X' !
ar52 = 'Y' ! define some useful parameters
ar53 = 'Z' !
*get,ar33,ACTIVE,0,DBASE,LTIME
ar34 = NINT(ar33/10000-0.5)
ar54='%ar34%:' $ *if,ar34,LT,10,THEN $ ar54='0%ar34%:' $ *endif
ar35 = NINT(MOD(ar33/100,100)-0.5)
ar55='%ar35%:' $ *if,ar35,LT,10,THEN $ ar55='0%ar35%:' $ *endif
ar36 = MOD(ar33,100)
ar56='%ar36%' $ *if,ar36,LT,10,THEN $ ar56='0%ar36%' $ *endif
*dim,month,CHAR,12
month(1) = 'Jan','Feb','Mar','Apr','May','Jun'
month(7) = 'Jul','Aug','Sep','Oct','Nov','Dec'
*get,ar44,ACTIVE,0,DBASE,LDATE
ar37 = MOD(ar44,100)
ar57=' %ar37%' $ *if,ar37,LT,10,THEN $ ar57='0%ar37%' $ *endif
ar58 = month(NINT(MOD(ar44/100,100)))
ar39 = NINT(ar44/10000)
ar59='%ar39%' $ *if,ar39,LT,10,THEN $ ar59='0%ar39%' $ *endif
*set,month ! delete temporary parameter
!
! process input parameters
!
csys,0
*if,'%arg2%',EQ,'0',THEN
*msg,FATAL
Output file name (ARG2) undefined; exiting...
*endif
ar12 = '%arg2%'
*if,arg3,EQ,0,THEN $ ar13=1 $ *else $ ar13=arg3 $ *endif
/com,
/com, Size data (number of elements, number of nodes) to be written...
/com,
/com, * only elements which have all their nodes selected will be written
/com, * only nodes which are attached to the selected elements will be written
/com,
nsle,S ! select all nodes associated with selected elements
*get,ar70,NODE,,COUNT ! total number of nodes
*get,ar80,ELEM,,COUNT ! total number of elements
*msg,INFO,ar80,ar70,ar12
%/ &
%/ Writing %I elements and %I nodes &
%/ to Patran 2 Neutral File %C.mesh... %/
!
! open file for writing and write header cards...
!
/output,'%ar12%',unv,,
/sys,printf "\n * Writing header cards..."
*vwrite,
('Universal Format Finite Element Model')
*msg,INFO,ar12,'%ar54%%ar55%%ar56%',ar57,ar58,'%ar59%'
%C.unv: created at %C on %C %C %C
*vwrite,,
(' ')
!
! write nodal data cards:
!
/sys,printf "\n * Writing nodal data cards..."
*get,ar77,NODE,,NUM,MAX ! highest node number in selected set
*get,ar1000,parm,name,csys
*dim,nlist,ARRAY,%ar77%,4 ! array to hold nodal data
*vget,nlist(1,4),NODE,1,NSEL ! mask to hide unselected nodes
*do,ar20,1,3,1
! get nodal x,y,z-coordinates
ar50 = ar5%ar20%
*vmask,nlist(1,4)
*vget,nlist(1,%ar20%),NODE,1,LOC,%ar50%
*enddo
/NOPR ! switch output OFF
*vwrite
('NODES')
*vwrite
(' -1')
*vwrite
(' 2411')
*vmask,nlist(1,4)
*vwrite,SEQU,0,0,0,nlist(1,1),nlist(1,2),nlist(1,3)
(4(F10.0,TL1),' '/3D25.16)
*vwrite
(' -1')
*set,nlist ! delete temporary array
*vwrite,,
(' ')
*vwrite
('ELEMENT CONNECTIVITY')
*vwrite
(' -1')
*vwrite
(' 2412')
!/eof
!
! write element data cards:
!
/sys,printf "\n * Writing element data cards..."
*dim,en,ARRAY,10 ! array to hold element nodal topology
*dim,en2,ARRAY,20 ! array to hold element nodal topology
*get,ar88,ELEM,,NUM,MIN ! lowest element number in selected set
*do,ar20,1,ar80,1
!*do,ar20,1,5,1
*get,ar99,ELEM,%ar88%,ATTR,TYPE ! element type
*get,ar60,ETYPE,%ar99%,ATTR,ENAME ! element "name"
*if,ar60,EQ,95,THEN
! 20-noded hexahedra
ar61 = 116
ar62 = 20
*elseif,ar60,EQ,92,THEN
! 10-noded tetrahedra
ar61 = 118
ar62 = 10
*elseif,ar60,EQ,45,THEN
! 8-noded hexahedra without rotations
ar61 = 115
ar62 = 8
*elseif,ar60,EQ,73,THEN
! 8-noded hexahedra with rotations
ar61 = 8
ar62 = 8
*elseif,ar60,EQ,72,THEN
! 4-noded tetrahedra with rotations
ar61 = 5
ar62 = 4
*else
/output,
*msg,FATAL,ar60,ar88
Unsupported element type %I for element %I; exiting...
*endif
ar63 = NINT(0.5+(ar62+9)/10)
/NOPR ! switch output OFF
!*vwrite,ar88,ar61,0,1,3,ar62, !not yet to account for linear tetra elements
!(6(F10.0,TL1)' ')
*vget,en(1),ELEM,%ar88%,NODE,1,,,4
*if,ar60,EQ,95,THEN
! 20-noded hexahedra
*vwrite,ar88,ar61,0,1,1,ar62,
(6(F10.0,TL1)' ')
*vget,en2(1),ELEM,%ar88%,NODE,1,,,4
*vlen,1
*vwrite,en2(1),en2(9),en2(2),en2(10),en2(3),en2(11),en2(4),en2(12)
(8(1F10.0,TL1),' ')
!*vget,en(1),ELEM,%ar88%,NODE,11,,,4
*vlen,1
*vwrite,en2(17),en2(18),en2(19),en2(20),en2(5),en2(13),en2(6),en2(14)
(8(1F10.0,TL1),' ')
*vlen,1
*vwrite,en2(7),en2(15),en2(8),en2(16)
(4(1F10.0,TL1),' ')
*elseif,ar60,EQ,92,THEN
! 10-noded tetrahedra
*vwrite,ar88,ar61,0,1,1,ar62,
(6(F10.0,TL1)' ')
*vlen,1
!*vwrite,en(1),en(2),en(3),en(4),en(5),en(6),en(7),en(8),en(9),en(10)
*vwrite,en(2),en(9),en(4),en(10),en(3),en(6),en(5),en(8),en(7),en(1)
(10(1F10.0,TL1),' ')
*elseif,ar60,EQ,72,THEN
! 4-noded tetrahedra
*vwrite,ar88,ar61,0,1,1,ar62,
(6(F10.0,TL1)' ')
*vlen,1
*vwrite,en(1),en(2),en(3),en(4)
(4(1F10.0,TL1),' ')
*else
*if,en(3),eq,en(4),then
! 4-noded tetrahedra
ar61 = 111
ar62 = 4
*vwrite,ar88,ar61,0,1,1,ar62,
(6(F10.0,TL1)' ')
*vlen,1
*vwrite,en(1),en(2),en(3),en(5)
(4(1F10.0,TL1),' ')
*else
! 8-noded hexahedra
*vwrite,ar88,ar61,0,1,1,ar62,
(6(F10.0,TL1)' ')
*vlen,1
*vwrite,en(1),en(2),en(3),en(4),en(5),en(6),en(7),en(8)
(8(1F10.0,TL1),' ')
*endif
*endif
ar88 = ELNEXT(ar88) ! next element number is selected set
*enddo
*set,en ! delete temporary array
*set,en2 ! delete temporary array for 20 node hexahedrals
! write end-of-file card and close file
*vwrite
(' -1')
/output,
/com,complete!
finish ! return to "BEGIN" level
/GOPR ! switch output ON
/com,
/com,========================================================================
/com,= finished =
/com,========================================================================
/com,