32 const std::string& elist,
33 const std::string& nlist,
34 const std::string& mplist,
35 const std::string& volt,
36 const std::string& unit) {
37 const std::string hdr =
m_className +
"::Initialise:";
44 constexpr int size = 100;
48 std::ifstream fheader(header);
55 fheader.getline(line, size,
'\n');
56 char* token = strtok(line,
" ");
57 bool readerror =
false;
58 const int nNodes =
ReadInteger(token, 0, readerror);
59 token = strtok(
nullptr,
" ");
60 const int nElements =
ReadInteger(token, 0, readerror);
61 std::cout << hdr <<
"\n Read " << nNodes <<
" nodes and " << nElements
62 <<
" elements from file " << header <<
".\n";
64 PrintErrorReadingFile(hdr, header, 0);
73 std::ifstream fnodes(nlist);
82 std::cerr << hdr <<
" Unknown length unit " << unit <<
". Will use cm.\n";
85 if (
m_debug) std::cout << hdr <<
" Unit scaling factor = " << funit <<
".\n";
88 for (
int il = 0; il < nNodes; il++) {
90 fnodes.getline(line, size,
'\n');
93 token = strtok(line,
" ");
94 token = strtok(
nullptr,
" ");
97 token = strtok(
nullptr,
" ");
98 double xnode =
ReadDouble(token, -1, readerror);
99 token = strtok(
nullptr,
" ");
100 double ynode =
ReadDouble(token, -1, readerror);
101 token = strtok(
nullptr,
" ");
102 double znode =
ReadDouble(token, -1, readerror);
104 PrintErrorReadingFile(hdr, nlist, il);
111 node.
x = xnode * funit;
112 node.
y = ynode * funit;
113 node.
z = znode * funit;
114 m_nodes.push_back(std::move(node));
121 if (!LoadPotentials(volt,
m_pot))
return false;
124 std::ifstream fmplist(mplist);
131 fmplist.getline(line, size,
'\n');
132 token = strtok(line,
" ");
134 std::cerr << hdr <<
"\n Error reading number of materials from "
139 const unsigned int nMaterials =
ReadInteger(token, 0, readerror);
144 material.medium =
nullptr;
146 for (
int il = 2; il < ((int)nMaterials + 2); il++) {
147 fmplist.getline(line, size,
'\n');
148 token = strtok(line,
" ");
150 token = strtok(
nullptr,
" ");
151 double dc =
ReadDouble(token, -1.0, readerror);
153 PrintErrorReadingFile(hdr, mplist, il);
158 std::cout <<
" Set material " << il - 2 <<
" of "
159 << nMaterials <<
" to eps " << dc <<
".\n";
169 std::ifstream felems(elist);
176 for (
int il = 0; il < nElements; il++) {
178 felems.getline(line, size,
'\n');
181 token = strtok(line,
" ");
189 token = strtok(
nullptr,
" ");
191 token = strtok(
nullptr,
" ");
192 std::vector<int> inode;
193 for (
size_t k = 0; k < 10; ++k) {
194 token = strtok(
nullptr,
" ");
196 if (!readerror) inode.push_back(in);
199 if (inode.size() != 10) {
200 PrintErrorReadingFile(hdr, elist, il);
201 std::cerr <<
" Read " << inode.size() <<
" node indices for element"
202 << il <<
" (expected 10).\n";
208 std::cout <<
" Read nodes " << inode[0] <<
", " << inode[1]
209 <<
", " << inode[2] <<
", " << inode[3]
210 <<
", ... from element " << il + 1 <<
" of "
211 << nElements <<
" with material " << imat <<
".\n";
215 if (imat < 0 || imat > (
int)nMaterials) {
216 std::cerr << hdr <<
"\n Out-of-range material number on file " << elist
217 <<
" (line " << il <<
").\n"
218 <<
" Element: " << il <<
", material: " << imat <<
".\n";
223 std::cerr << hdr <<
"\n Element " << il <<
" in " << elist <<
"\n"
224 <<
" uses material " << imat <<
" which does not have\n"
225 <<
" a positive permittivity in " << mplist <<
".\n";
231 bool degenerate =
false;
232 for (
size_t k = 0; k < 10; ++k) {
234 std::cerr << hdr <<
"\n Found a node number < 1 on file " << elist
235 <<
" (line " << il <<
").\n Element: " << il
236 <<
", material: " << imat <<
".\n";
239 for (
size_t kk = k + 1; kk < 10; ++kk) {
240 if (inode[k] == inode[kk]) degenerate =
true;
245 std::cerr << hdr <<
"\n Element " << il <<
" of file " << elist
246 <<
" is degenerate,\n"
247 <<
" no such elements are allowed in this type of map.\n";
255 element.
emap[0] = inode[0] - 1;
256 element.
emap[1] = inode[1] - 1;
257 element.
emap[2] = inode[2] - 1;
258 element.
emap[3] = inode[3] - 1;
259 element.
emap[4] = inode[4] - 1;
260 element.
emap[7] = inode[5] - 1;
261 element.
emap[5] = inode[6] - 1;
262 element.
emap[6] = inode[7] - 1;
263 element.
emap[8] = inode[8] - 1;
264 element.
emap[9] = inode[9] - 1;
271 if (!ok)
return false;
275 std::cout << hdr <<
" Finished.\n";
bool Initialise(const std::string &header="mesh.header", const std::string &elist="mesh.elements", const std::string &nlist="mesh.nodes", const std::string &mplist="dielectrics.dat", const std::string &volt="out.result", const std::string &unit="cm")