Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/ElmerGUI/netgen/libsrc/interface/writeabaqus.cpp
3206 views
1
//
2
// Write Abaqus file
3
//
4
//
5
6
#include <mystdlib.h>
7
8
#include <myadt.hpp>
9
#include <linalg.hpp>
10
#include <csg.hpp>
11
#include <meshing.hpp>
12
13
namespace netgen
14
{
15
#include "writeuser.hpp"
16
17
18
19
20
void WriteAbaqusFormat (const Mesh & mesh,
21
const string & filename)
22
23
{
24
25
cout << "\nWrite Abaqus Volume Mesh" << endl;
26
27
ofstream outfile (filename.c_str());
28
29
outfile << "*Heading" << endl;
30
outfile << " " << filename << endl;
31
32
outfile.precision(8);
33
34
outfile << "*Node" << endl;
35
36
int np = mesh.GetNP();
37
int ne = mesh.GetNE();
38
int i, j, k;
39
40
for (i = 1; i <= np; i++)
41
{
42
outfile << i << ", ";
43
outfile << mesh.Point(i)(0) << ", ";
44
outfile << mesh.Point(i)(1) << ", ";
45
outfile << mesh.Point(i)(2) << "\n";
46
}
47
48
int elemcnt = 0; //element counter
49
int finished = 0;
50
int indcnt = 1; //index counter
51
52
while (!finished)
53
{
54
int actcnt = 0;
55
const Element & el1 = mesh.VolumeElement(1);
56
int non = el1.GetNP();
57
if (non == 4)
58
{
59
outfile << "*Element, type=C3D4, ELSET=PART" << indcnt << endl;
60
}
61
else if (non == 10)
62
{
63
outfile << "*Element, type=C3D10, ELSET=PART" << indcnt << endl;
64
}
65
else
66
{
67
cout << "unsupported Element type!!!" << endl;
68
}
69
70
for (i = 1; i <= ne; i++)
71
{
72
const Element & el = mesh.VolumeElement(i);
73
74
if (el.GetIndex() == indcnt)
75
{
76
actcnt++;
77
if (el.GetNP() != non)
78
{
79
cout << "different element-types in a subdomain are not possible!!!" << endl;
80
continue;
81
}
82
83
elemcnt++;
84
outfile << elemcnt << ", ";
85
if (non == 4)
86
{
87
outfile << el.PNum(1) << ", ";
88
outfile << el.PNum(2) << ", ";
89
outfile << el.PNum(4) << ", ";
90
outfile << el.PNum(3) << "\n";
91
}
92
else if (non == 10)
93
{
94
outfile << el.PNum(1) << ", ";
95
outfile << el.PNum(2) << ", ";
96
outfile << el.PNum(4) << ", ";
97
outfile << el.PNum(3) << ", ";
98
outfile << el.PNum(5) << ", ";
99
outfile << el.PNum(9) << ", ";
100
outfile << el.PNum(7) << ", " << "\n";
101
outfile << el.PNum(6) << ", ";
102
outfile << el.PNum(8) << ", ";
103
outfile << el.PNum(10) << "\n";
104
}
105
else
106
{
107
cout << "unsupported Element type!!!" << endl;
108
for (j = 1; j <= el.GetNP(); j++)
109
{
110
outfile << el.PNum(j);
111
if (j != el.GetNP()) outfile << ", ";
112
}
113
outfile << "\n";
114
}
115
}
116
}
117
indcnt++;
118
if (elemcnt == ne) {finished = 1; cout << "all elements found by Index!" << endl;}
119
if (actcnt == 0) {finished = 1;}
120
}
121
122
if (mesh.GetIdentifications().GetMaxNr())
123
{
124
// periodic identification, implementation for
125
// Helmut J. Boehm, TU Vienna
126
127
char cfilename[255];
128
strcpy (cfilename, filename.c_str());
129
130
char mpcfilename[255];
131
strcpy (mpcfilename, cfilename);
132
size_t len = strlen (cfilename);
133
if (len >= 4 && (strcmp (mpcfilename+len-4, ".inp") == 0))
134
strcpy (mpcfilename+len-4, ".mpc");
135
else
136
strcat (mpcfilename, ".mpc");
137
138
ofstream mpc (mpcfilename);
139
140
int masternode(0);
141
142
ARRAY<INDEX_2> pairs;
143
BitArray master(np), help(np);
144
master.Set();
145
for (i = 1; i <= 3; i++)
146
{
147
mesh.GetIdentifications().GetPairs (i, pairs);
148
help.Clear();
149
for (j = 1; j <= pairs.Size(); j++)
150
{
151
help.Set (pairs.Get(j).I1());
152
}
153
master.And (help);
154
}
155
for (i = 1; i <= np; i++)
156
if (master.Test(i))
157
masternode = i;
158
159
cout << "masternode = " << masternode << " = "
160
<< mesh.Point(masternode) << endl;
161
ARRAY<int> slaves(3);
162
for (i = 1; i <= 3; i++)
163
{
164
mesh.GetIdentifications().GetPairs (i, pairs);
165
for (j = 1; j <= pairs.Size(); j++)
166
{
167
if (pairs.Get(j).I1() == masternode)
168
slaves.Elem(i) = pairs.Get(j).I2();
169
}
170
cout << "slave(" << i << ") = " << slaves.Get(i)
171
<< " = " << mesh.Point(slaves.Get(i)) << endl;
172
}
173
174
175
outfile << "**\n"
176
<< "*NSET,NSET=CTENODS\n"
177
<< slaves.Get(1) << ", "
178
<< slaves.Get(2) << ", "
179
<< slaves.Get(3) << endl;
180
181
182
outfile << "**\n"
183
<< "**POINT_fixed\n"
184
<< "**\n"
185
<< "*BOUNDARY, OP=NEW\n";
186
for (j = 1; j <= 3; j++)
187
outfile << masternode << ", " << j << ",, 0.\n";
188
189
outfile << "**\n"
190
<< "*BOUNDARY, OP=NEW\n";
191
for (j = 1; j <= 3; j++)
192
{
193
Vec3d v(mesh.Point(masternode), mesh.Point(slaves.Get(j)));
194
double vlen = v.Length();
195
int dir = 0;
196
if (fabs (v.X()) > 0.9 * vlen) dir = 2;
197
if (fabs (v.Y()) > 0.9 * vlen) dir = 3;
198
if (fabs (v.Z()) > 0.9 * vlen) dir = 1;
199
if (!dir)
200
cout << "ERROR: Problem with rigid body constraints" << endl;
201
outfile << slaves.Get(j) << ", " << dir << ",, 0.\n";
202
}
203
204
outfile << "**\n"
205
<< "*EQUATION, INPUT=" << mpcfilename << endl;
206
207
208
BitArray eliminated(np);
209
eliminated.Clear();
210
for (i = 1; i <= mesh.GetIdentifications().GetMaxNr(); i++)
211
{
212
mesh.GetIdentifications().GetPairs (i, pairs);
213
if (!pairs.Size())
214
continue;
215
216
for (j = 1; j <= pairs.Size(); j++)
217
if (pairs.Get(j).I1() != masternode &&
218
!eliminated.Test(pairs.Get(j).I2()))
219
{
220
eliminated.Set (pairs.Get(j).I2());
221
for (k = 1; k <= 3; k++)
222
{
223
mpc << "4" << "\n";
224
mpc << pairs.Get(j).I2() << "," << k << ", -1.0, ";
225
mpc << pairs.Get(j).I1() << "," << k << ", 1.0, ";
226
mpc << slaves.Get(i) << "," << k << ", 1.0, ";
227
mpc << masternode << "," << k << ", -1.0 \n";
228
}
229
}
230
}
231
}
232
233
234
cout << "done" << endl;
235
}
236
237
}
238
239