13 const std::string& nlist,
14 const std::string& mplist,
15 const std::string& prnsol,
16 const std::string& unit) {
22 constexpr int size = 100;
26 std::ifstream fmplist(mplist);
34 unsigned int icurrmat = 0;
35 bool readerror =
false;
36 while (fmplist.getline(line, size,
'\n')) {
39 if (strcmp(line,
"1") == 0) {
40 for (
size_t k = 0; k < 5; ++k) fmplist.getline(line, size,
'\n');
45 char* token = strtok(line,
" ");
47 if (!token || strcmp(token,
" ") == 0 || strcmp(token,
"\n") == 0 ||
48 strcmp(token,
"TEMPERATURE") == 0 || strcmp(token,
"PROPERTY=") == 0 ||
49 int(token[0]) == 10 ||
int(token[0]) == 13) {
53 if (strcmp(token,
"LIST") == 0) {
54 token = strtok(
nullptr,
" ");
55 token = strtok(
nullptr,
" ");
56 token = strtok(
nullptr,
" ");
57 token = strtok(
nullptr,
" ");
58 const int nMaterials =
ReadInteger(token, -1, readerror);
59 if (readerror || nMaterials < 0) {
61 <<
" Error reading file " << mplist <<
" (line " << il
70 material.medium =
nullptr;
73 std::cout <<
m_className <<
"::Initialise: " << nMaterials
76 }
else if (strcmp(token,
"MATERIAL") == 0) {
78 token = strtok(
nullptr,
" ");
79 token = strtok(
nullptr,
" ");
81 if (readerror || imat < 0) {
83 <<
" Error reading file " << mplist <<
" (line " << il
89 }
else if (strcmp(token,
"TEMP") == 0) {
91 token = strtok(
nullptr,
" ");
93 if (strncmp(token,
"PERX", 4) == 0) {
95 }
else if (strncmp(token,
"RSVX", 4) == 0) {
99 <<
" Unknown material property flag " << token <<
"\n"
100 <<
" in material properties file " << mplist <<
" (line "
104 fmplist.getline(line, size,
'\n');
107 token = strtok(line,
" ");
108 if (icurrmat < 1 || icurrmat >
m_materials.size()) {
110 <<
" Found out-of-range current material index "
112 <<
" in material properties file " << mplist <<
".\n";
115 }
else if (itype == 1) {
117 }
else if (itype == 2) {
122 <<
" Error reading file " << mplist <<
" (line " << il
127 }
else if (strcmp(token,
"PROPERTY") == 0) {
129 token = strtok(
nullptr,
" ");
130 token = strtok(
nullptr,
" ");
132 if (strcmp(token,
"PERX") == 0) {
134 }
else if (strcmp(token,
"RSVX") == 0) {
138 <<
" Unknown material property flag " << token <<
"\n"
139 <<
" in material properties file " << mplist <<
" (line "
143 token = strtok(
nullptr,
" ");
144 token = strtok(
nullptr,
" ");
148 <<
" Error reading file " << mplist <<
" (line " << il
152 }
else if (imat < 1 || imat > (
int)
m_materials.size()) {
154 <<
" Found out-of-range material index " << imat <<
"\n"
155 <<
" in material properties file " << mplist <<
".\n";
158 fmplist.getline(line, size,
'\n');
160 fmplist.getline(line, size,
'\n');
163 token = strtok(line,
" ");
164 token = strtok(
nullptr,
" ");
167 }
else if (itype == 2) {
172 <<
" Error reading file " << mplist <<
" (line " << il
189 <<
" materials from file " << mplist <<
".\n";
193 std::ifstream felist(elist);
203 while (felist.getline(line, size,
'\n')) {
206 if (strcmp(line,
"1") == 0) {
207 for (
size_t k = 0; k < 5; ++k) felist.getline(line, size,
'\n');
212 if (strstr(line,
"***") !=
nullptr) {
213 for (
size_t k = 0; k < 3; ++k) felist.getline(line, size,
'\n');
218 char* token = strtok(line,
" ");
220 if (!token || strcmp(token,
" ") == 0 || strcmp(token,
"\n") == 0 ||
221 int(token[0]) == 10 ||
int(token[0]) == 13 ||
222 strcmp(token,
"LIST") == 0 || strcmp(token,
"ELEM") == 0) {
227 token = strtok(
nullptr,
" ");
229 token = strtok(
nullptr,
" ");
230 token = strtok(
nullptr,
" ");
231 token = strtok(
nullptr,
" ");
232 token = strtok(
nullptr,
" ");
233 std::vector<int> inode;
234 for (
size_t k = 0; k < 8; ++k) {
235 token = strtok(
nullptr,
" ");
237 if (!readerror) inode.push_back(in);
239 if (!felist.getline(line, size,
'\n')) {
241 <<
" Error reading element " << ielem <<
".\n";
246 token = strtok(line,
" ");
248 if (!readerror) inode.push_back(in8);
249 token = strtok(
nullptr,
" ");
251 if (!readerror) inode.push_back(in9);
253 if (inode.size() != 10) {
255 <<
" Error reading file " << elist <<
" (line "
257 <<
" Read " << inode.size() <<
" node indices for element "
258 << ielem <<
" (expected 10).\n";
263 if (ielem - 1 != (
int)
m_elements.size() + nbackground) {
265 <<
" Synchronisation lost on file " << elist <<
" (line "
267 <<
" Element: " << ielem <<
" (expected "
276 <<
" Out-of-range material number on file " << elist
277 <<
" (line " << il <<
").\n"
278 <<
" Element: " << ielem <<
", material: " << imat <<
".\n";
284 <<
" Element " << ielem <<
" in " << elist <<
"\n"
285 <<
" uses material " << imat <<
" which does not have\n"
286 <<
" a positive permittivity in " << mplist <<
".\n";
292 bool degenerate =
false;
293 for (
size_t k = 0; k < 10; ++k) {
296 <<
" Found a node number < 1 in " << elist <<
" (line "
298 <<
" Element: " << ielem <<
", material: " << imat <<
".\n";
301 if (inode[k] > highestnode) highestnode = inode[k];
302 for (
size_t kk = k + 1; kk < 10; ++kk) {
303 if (inode[k] == inode[kk]) degenerate =
true;
317 <<
" Element " << ielem <<
" of file " << elist
318 <<
" is degenerate,\n"
319 <<
" no such elements allowed in this type of map.\n";
325 element.
matmap = imat - 1;
327 element.
emap[0] = inode[0] - 1;
328 element.
emap[1] = inode[1] - 1;
329 element.
emap[2] = inode[2] - 1;
330 element.
emap[3] = inode[3] - 1;
331 element.
emap[4] = inode[4] - 1;
332 element.
emap[7] = inode[5] - 1;
333 element.
emap[5] = inode[6] - 1;
334 element.
emap[6] = inode[7] - 1;
335 element.
emap[8] = inode[8] - 1;
336 element.
emap[9] = inode[9] - 1;
341 if (!ok)
return false;
345 <<
" Found no valid elements in file " << elist <<
".\n";
351 std::cout <<
" Read " <<
m_elements.size() <<
" elements from file "
353 <<
" Highest node number: " << highestnode <<
"\n"
354 <<
" Background elements skipped: " << nbackground <<
"\n";
359 <<
" Unknown length unit " << unit <<
". Will use cm.\n";
363 std::cout <<
m_className <<
":Initialise: Unit scaling factor = "
368 std::ifstream fnlist(nlist);
376 while (fnlist.getline(line, size,
'\n')) {
379 if (strcmp(line,
"1") == 0) {
380 for (
size_t k = 0; k < 5; ++k) fnlist.getline(line, size,
'\n');
385 if (strstr(line,
"***") !=
nullptr) {
386 for (
size_t k = 0; k < 3; ++k) fnlist.getline(line, size,
'\n');
391 char* token = strtok(line,
" ");
393 if (!token || strcmp(token,
" ") == 0 || strcmp(token,
"\n") == 0 ||
394 int(token[0]) == 10 ||
int(token[0]) == 13 ||
395 strcmp(token,
"LIST") == 0 || strcmp(token,
"NODE") == 0 ||
396 strcmp(token,
"SORT") == 0) {
401 token = strtok(
nullptr,
" ");
402 double xnode =
ReadDouble(token, -1, readerror);
403 token = strtok(
nullptr,
" ");
404 double ynode =
ReadDouble(token, -1, readerror);
405 token = strtok(
nullptr,
" ");
406 double znode =
ReadDouble(token, -1, readerror);
410 <<
" Error reading file " << nlist <<
" (line " << il
416 if (inode - 1 != (
int)
m_nodes.size()) {
418 <<
" Synchronisation lost on file " << nlist <<
" (line "
420 <<
" Node: " << inode <<
" (expected " <<
m_nodes.size()
421 <<
"), (x,y,z) = (" << xnode <<
", " << ynode <<
", " << znode
428 node.
x = xnode * funit;
429 node.
y = ynode * funit;
430 node.
z = znode * funit;
431 m_nodes.push_back(std::move(node));
435 if (!ok)
return false;
438 std::cout <<
" Read " <<
m_nodes.size() <<
" nodes from file "
441 if ((
int)
m_nodes.size() != highestnode) {
443 <<
" Number of nodes read (" <<
m_nodes.size() <<
") on " << nlist
445 <<
" does not match element list (" << highestnode <<
").\n";
449 if (!LoadPotentials(prnsol,
m_pot))
return false;
bool Initialise(const std::string &elist="ELIST.lis", const std::string &nlist="NLIST.lis", const std::string &mplist="MPLIST.lis", const std::string &prnsol="PRNSOL.lis", const std::string &unit="cm")