NEMoSys  0.63.0
A modular, extensible resource with robust automated mesh generation, mesh quality analysis, adaptive mesh refinement, and data transfer between arbitrary meshes.
ep16Prep.C
Go to the documentation of this file.
1 /*******************************************************************************
2 * Promesh *
3 * Copyright (C) 2022, IllinoisRocstar LLC. All rights reserved. *
4 * *
5 * Promesh is the property of IllinoisRocstar LLC. *
6 * *
7 * IllinoisRocstar LLC *
8 * Champaign, IL *
9 * www.illinoisrocstar.com *
10 * promesh@illinoisrocstar.com *
11 *******************************************************************************/
12 /*******************************************************************************
13 * This file is part of Promesh *
14 * *
15 * This version of Promesh is free software: you can redistribute it and/or *
16 * modify it under the terms of the GNU Lesser General Public License as *
17 * published by the Free Software Foundation, either version 3 of the License, *
18 * or (at your option) any later version. *
19 * *
20 * Promesh is distributed in the hope that it will be useful, but WITHOUT ANY *
21 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS *
22 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more *
23 * details. *
24 * *
25 * You should have received a copy of the GNU Lesser General Public License *
26 * along with this program. If not, see <https://www.gnu.org/licenses/>. *
27 * *
28 *******************************************************************************/
29 #ifdef HAVE_EPIC
30 
32 
33 #include "AuxiliaryFunctions.H"
34 
35 #include <iostream>
36 
37 
38 ep16Prep::~ep16Prep()
39 {
40  delete _mdb;
41 }
42 
43 
44 ep16Prep *ep16Prep::readJSON(const std::string &ifname)
45 {
46  std::cout << "Reading JSON file" << std::endl;
47  std::ifstream inputStream(ifname);
48  if (!inputStream.good() || nemAux::find_ext(ifname) != ".json")
49  {
50  std::cerr << "Error opening file " << ifname << std::endl;
51  exit(1);
52  }
53  if (nemAux::find_ext(ifname) != ".json")
54  {
55  std::cerr << "Input File must be in .json format" << std::endl;
56  exit(1);
57  }
58 
59  jsoncons::json inputjson;
60  inputStream >> inputjson;
61 
62  // checking if array
63  if (inputjson.is_array())
64  {
65  std::cerr
66  << "Warning: Input is an array. Only first element will be processed"
67  << std::endl;
68  inputjson = inputjson[0];
69  }
70 
71  ep16Prep *ep = new ep16Prep(inputjson);
72  ep->readJSON();
73  return ep;
74 }
75 
76 
77 ep16Prep *ep16Prep::readJSON(const jsoncons::json &inputjson)
78 {
79  ep16Prep *ep = new ep16Prep(inputjson);
80  ep->readJSON();
81  ep->process();
82  ep->write();
83  return ep;
84 }
85 
86 
87 void ep16Prep::readJSON()
88 {
89  std::cout << "Reading Epic 2016 Input Generation JSON." << std::endl;
90 
91  // reading mandatory fields
92  std::string type;
93  _fname = _jstrm["File Name"].as<std::string>();
94  if (_jstrm.contains("Type"))
95  {
96  type = _jstrm["Type"].as<std::string>();
97  nemAux::toLower(type);
98  }
99 
100  if (type != "short form"
101  && type != "long form"
102  && type != "long form edit")
103  {
104  std::cerr << "Unknown type " << type
105  << ", switching to short form." << std::endl;
106  type = "short form";
107  }
108 
109  if (type == "long form")
110  {
111  std::cerr << "Long form is not supported yet." << std::endl;
112  exit(1);
113  }
114  else if (type == "short form")
115  {
116  _shortForm = true;
117  }
118 
119  // order definition
120  _set_key(_fname);
121  setNameType(_fname, inpFileType::INPGEN_TXT);
122  std::vector<std::string> order;
123 
124  // ordering the process based on type
125  if (type == "short form")
126  {
127  order = {
128  "prep.case",
129  "prep.run",
130  "prep.exodus",
131  "prep.arraysize",
132  "mesh.nodeset.projectile",
133  "mesh.nodeset.target",
134  "mesh.elementset.projectile",
135  "mesh.elementset.target",
136  "misc.velocity",
137  "misc.detonation"
138  };
139  }
140  else if (type == "long form edit")
141  {
142  order = {
143  "edit.read",
144  "edit.slideline.seek",
145  "edit.detonation",
146  "edit.main",
147  "edit.close"
148  };
149  }
150 
151  // set order
152  setOrder(order);
153 
154  // other preps
155  setCmntStr("$");
156 }
157 
158 
159 void ep16Prep::process()
160 {
161  // Top level information
162  if (_shortForm) {
163  wrtCmnt("EPIC 2016 INPUT FILE");
164  wrtCmnt("Generated on " + nemAux::getTimeStr() + " by NEMoSys");
165  wrtCmnt("Short Form Description Card for ExodusII/CUBIT Data");
166 
167  // reading mesh databse
168  std::string exo_fname = _jstrm["Mesh"]["File"].as<std::string>();
169  _mdb = new NEM::MSH::EXOMesh::exoMesh(exo_fname);
170  _mdb->read();
171 
172  // material information
173  jsoncons::json _matj = _jstrm["Material"];
174  for (const auto &km: _matj.object_range())
175  {
176  std::string kmkey = std::string(km.key());
177  nemAux::toLower(kmkey);
178  _mat[kmkey] = km.value().as<int>();
179  }
180 
181  // boundary conditions information
182  jsoncons::json _bcsj = _jstrm["Boundary Condition"];
183  for (const auto &km: _bcsj.object_range()) {
184  std::string kmkey = std::string(km.key());
185  nemAux::toLower(kmkey);
186  _bcs[kmkey] = km.value().as<std::string>();
187  // translate to EPIC language
188  std::string bcskmkey = _bcs[kmkey];
189  nemAux::toLower(bcskmkey);
190  if (bcskmkey == "fixed")
191  _bcs[kmkey] = "111";
192  }
193  }
194 
195  // begin processing based on order specified
196  std::vector<std::string> ord = getOrder();
197  for (const auto &oi : ord)
198  {
199  std::string tsk = nemAux::findToStr(oi, ".");
200  std::string _tsk = nemAux::findFromStr(oi, ".");
201  std::string __tsk = nemAux::findFromStr(_tsk, ".");
202  _tsk = nemAux::findToStr(_tsk, ".");
203  std::cout << tsk << " -- " << _tsk << " -- " << __tsk << "\n";
204  if (tsk == "prep")
205  wrtPre(_tsk, __tsk);
206  else if (tsk == "mesh")
207  wrtMsh(_tsk, __tsk);
208  else if (tsk == "misc")
209  wrtMisc(_tsk, __tsk);
210  else if (tsk == "edit")
211  edit(_tsk, __tsk);
212  }
213 }
214 
215 
216 void ep16Prep::wrtCmnt(const std::string &cmnt)
217 {
218  std::stringstream ss;
219  ss << getCmntStr() << cmnt;
220  _write(ss);
221 }
222 
223 
224 void ep16Prep::wrtPre(const std::string &_tsk, const std::string &__tsk)
225 {
226  std::stringstream _tcmnt;
227  std::stringstream _tstr;
228  if (_tsk == "case")
229  {
230  _tstr.clear();
231  _tstr.str(std::string());
232  _tcmnt.clear();
233  _tcmnt.str(std::string());
234  int _ctype = _jstrm["Case"]["Type"].as<int>();
235  int _cid = _jstrm["Case"]["Id"].as<int>();
236  std::string _des = " " + _jstrm["Case"]["Description"].as<std::string>();
237  _tcmnt << "CASE DESCRIPTION";
238  _tstr << std::setw(5) << _ctype
239  << std::setw(5) << _cid
240  << std::setw(70) << std::left << _des;
241  }
242  else if (_tsk == "run")
243  {
244  _tstr.clear();
245  _tstr.str(std::string());
246  _tcmnt.clear();
247  _tcmnt.str(std::string());
248  int _rmde, _unt, _pat, _dplt, _ssld;
249  double _tmx, _cpmx;
250  _pat = 3;
251  _dplt = 3;
252  _cpmx = 0.0;
253  _rmde = _jstrm["Run"]["Mode"].as<int>();
254  _unt = _jstrm["Run"]["Unit"].as<int>();
255  _tmx = _jstrm["Run"]["Tmax"].as<double>();
256  _ssld = _jstrm["Run"].get_with_default("SSLD", 1);
257  _tcmnt << "Run Card\n";
258  _tcmnt << getCmntStr() << " RUN UNIT PAT DPLT TMAX CPMAX";
259  _tstr.precision(4);
260  _tstr << std::setw(5) << _rmde
261  << std::setw(5) << _unt
262  << std::setw(5) << _pat
263  << std::setw(5) << _dplt
264  << std::setw(10) << std::scientific << _tmx
265  << std::setw(10) << _cpmx
266  << std::setw(1) << _ssld;
267  }
268  else if (_tsk == "exodus")
269  {
270  // data gathering
271  int _npns, _ntns, _npes, _ntes, _ctact, _conv, _sym, _tet;
272  double _gap;
273  std::vector<std::string> ns_names, eb_names;
274  ns_names = _mdb->getNdeSetNames();
275  eb_names = _mdb->getElmBlkNames();
276  _npns = 0;
277  _ntns = 0;
278  _npes = 0;
279  _ntes = 0;
280  for (auto ni = ns_names.begin(); ni != ns_names.end(); ni++)
281  {
282  std::string pre = nemAux::findToStr(*ni, "_");
283  nemAux::toLower(pre);
284  if (pre == "prj")
285  _npns++;
286  else if (pre == "trg")
287  _ntns++;
288  }
289  for (auto ei = eb_names.begin(); ei != eb_names.end(); ei++)
290  {
291  // skipping TRIANGULAR element blocks
292  NEM::MSH::EXOMesh::elementType et = _mdb->getElmBlkType(*ei);
294  {
295  std::cerr << "Warnning: TRIANGLE element blocks will be ignored!\n";
296  continue;
297  }
298 
299  std::string pre = nemAux::findToStr(*ei, "_");
300  nemAux::toLower(pre);
301  if (pre == "prj")
302  _npes++;
303  else if (pre == "trg")
304  _ntes++;
305  }
306  _ctact = 1;
307  _conv = 2;
308  _sym = 0;
309  _tet = 1;
310  _gap = 0.1;
311 
312  _tstr.clear();
313  _tstr.str(std::string());
314  _tcmnt.clear();
315  _tcmnt.str(std::string());
316  _tcmnt << "Exodus II Description Card\n";
317  _tcmnt << getCmntStr()
318  << "NPNS NTNS NPES NTES CTCT CONV SYM TET GAP";
319  _tstr.precision(4);
320  _tstr << std::setw(5) << _npns
321  << std::setw(5) << _ntns
322  << std::setw(5) << _npes
323  << std::setw(5) << _ntes
324  << std::setw(5) << _ctact
325  << std::setw(5) << _conv
326  << std::setw(5) << _sym
327  << std::setw(5) << _tet
328  << std::setw(10) << std::scientific << _gap;
329  }
330  else if (_tsk == "arraysize")
331  {
332  // data gathering
333  int _mxn, _mxl, _mxmn, _mxsn;
334  _mxn = _mdb->getNumberOfNodes();
335  _mxl = _mdb->getNumberOfElements();
336  _mxmn = _mxn;
337  _mxsn = _mxn;
338 
339  _tstr.clear();
340  _tstr.str(std::string());
341  _tcmnt.clear();
342  _tcmnt.str(std::string());
343  _tcmnt << "Array Size/Dimension Card\n";
344  _tcmnt << getCmntStr() << " MXN MXL MXMN MXSN";
345  _tstr << std::setw(10) << _mxn * 50
346  << std::setw(10) << _mxl * 50
347  << std::setw(10) << _mxmn * 50
348  << std::setw(10) << _mxsn * 50;
349  }
350  // write to stream
351  if (!_tcmnt.str().empty())
352  wrtCmnt(_tcmnt.str());
353  if (!_tstr.str().empty())
354  _write(_tstr);
355 }
356 
357 
358 void ep16Prep::wrtMsh(const std::string &_tsk, const std::string &__tsk)
359 {
360  std::stringstream _tcmnt;
361  std::stringstream _tstr;
362  if (_tsk == "nodeset")
363  {
364  _tcmnt.clear();
365  _tcmnt.str(std::string());
366  _tstr.clear();
367  _tstr.str(std::string());
368  std::string preStr;
369  if (__tsk == "projectile")
370  {
371  _tcmnt << "Projectile Node Set Cards\n";
372  preStr = "prj";
373  }
374  else if (__tsk == "target")
375  {
376  _tcmnt << "Target Node Set Cards\n";
377  preStr = "trg";
378  }
379  else
380  {
381  std::cerr << "Error: Unknown node set type " << __tsk << std::endl;
382  throw;
383  }
384  _tcmnt << getCmntStr() << "NSET XYZ";
385  wrtCmnt(_tcmnt.str());
386  for (int ns = 0; ns < _mdb->getNumberOfNodeSets(); ns++)
387  {
388  std::string pre = nemAux::findToStr(_mdb->getNdeSetName(ns), "_");
389  nemAux::toLower(pre);
390  if (pre == preStr)
391  {
392  int _nset = _mdb->getNdeSetId(ns);
393  std::string nsName = _mdb->getNdeSetName(ns);
394  nemAux::toLower(nsName);
395  std::string nsChar;
396  auto srch = _bcs.find(nsName);
397  if (srch != _bcs.end())
398  nsChar = srch->second;
399  else
400  nsChar = "000";
401  _tstr << std::setw(5) << _nset << std::setw(8) << nsChar;
402  _write(_tstr);
403  }
404  }
405  }
406  else if (_tsk == "elementset")
407  {
408  _tcmnt.clear();
409  _tcmnt.str(std::string());
410  _tstr.clear();
411  _tstr.str(std::string());
412  std::string preStr;
413  if (__tsk == "projectile")
414  {
415  _tcmnt << "Projectile Element/Particle Set Cards\n";
416  preStr = "prj";
417  }
418  else if (__tsk == "target")
419  {
420  _tcmnt << "Target Element/Particle Set Cards\n";
421  preStr = "trg";
422  }
423  else
424  {
425  std::cerr << "Error: Unknown node set type " << __tsk << std::endl;
426  throw;
427  }
428  _tcmnt << getCmntStr()
429  << "LSET MATL TYPE SSET THICK/AREA";
430  wrtCmnt(_tcmnt.str());
431  int _lset, _matl, _type, _sset;
432  double _ta;
433  std::string _blnk;
434  _blnk.insert(_blnk.end(), 50, ' ');
435  for (int es = 0; es < (_mdb->getNumberOfElementBlocks()); es++)
436  {
437  std::string es_name = _mdb->getElmBlkName(es);
438  nemAux::toLower(es_name);
439  std::string pre = nemAux::findToStr(es_name, "_");
440  if (pre == preStr)
441  {
442  _lset = _mdb->getElmBlkId(es);
443  _matl = _mat[es_name];
444  if (_matl == 0)
445  {
446  std::cerr << "WARNING: Keyword " << es_name
447  << " is not defined in input file." << std::endl;
448  continue;
449  }
450  _type = 0;
451  _sset = 0;
452  _ta = 0.;
453  _tstr.precision(4);
454  _tstr << std::setw(5) << _lset
455  << std::setw(5) << _matl
456  << std::setw(5) << _type
457  << std::setw(5) << _sset
458  << _blnk
459  << std::setw(10) << std::scientific << _ta;
460  _write(_tstr);
461  }
462  }
463  }
464 }
465 
466 
467 void ep16Prep::wrtMisc(const std::string &_tsk, const std::string &__tsk)
468 {
469  std::stringstream _tcmnt;
470  std::stringstream _tstr;
471  if (_tsk == "velocity")
472  {
473  _tcmnt.clear();
474  _tcmnt.str(std::string());
475  _tcmnt << "Projectile and Target Velocities Card\n";
476  _tcmnt << getCmntStr()
477  << " PXVEL PYVEL PZVEL TXVEL TYVEL TZVEL";
478  wrtCmnt(_tcmnt.str());
479 
480  // velocity information
481  std::vector<double> _prjv, _trgv;
482  jsoncons::json _vj = _jstrm["Velocity"];
483  for (int i = 0; i < 3; i++)
484  {
485  _prjv.push_back(_vj["Projectile"][i].as<double>());
486  _trgv.push_back(_vj["Target"][i].as<double>());
487  }
488 
489  _tstr.clear();
490  _tstr.str(std::string());
491  _tstr.precision(8);
492  _tstr << std::setw(10) << _prjv[0]
493  << std::setw(10) << _prjv[1]
494  << std::setw(10) << _prjv[2]
495  << std::setw(10) << _trgv[0]
496  << std::setw(10) << _trgv[1]
497  << std::setw(10) << _trgv[2];
498  _write(_tstr);
499  }
500  else if (_tsk == "detonation")
501  {
502  _tcmnt.clear();
503  _tcmnt.str(std::string());
504  _tcmnt << "Detonation Point Card\n";
505  _tcmnt << getCmntStr() << " XDET YDET ZDET";
506  wrtCmnt(_tcmnt.str());
507 
508  // detonation information
509  std::vector<double> _det;
510  jsoncons::json _vj = _jstrm["Detonation"];
511  for (int i = 0; i < 3; i++)
512  {
513  _det.push_back(_vj["Coordinate"][i].as<double>());
514  }
515 
516  _tstr.clear();
517  _tstr.str(std::string());
518  _tstr.precision(8);
519  _tstr << std::setw(10) << _det[0]
520  << std::setw(10) << _det[1]
521  << std::setw(10) << _det[2];
522  _write(_tstr);
523  }
524 }
525 
526 
527 void ep16Prep::edit(const std::string &_tsk, const std::string &__tsk)
528 {
529  if (_tsk == "read")
530  read(_fname);
531  else if (_tsk == "slideline" && __tsk == "seek")
532  {
533  // slide line keyword check
534  if (!_jstrm.contains("Slideline"))
535  return;
536  int seek = _jstrm["Slideline"].get_with_default("Seek", 6);
537 
538  std::stringstream iss;
539  std::stringstream oss;
540  iss << _buffer.rdbuf();
541  while (iss.rdbuf()->in_avail() != 0)
542  {
543  char cl[81];
544  iss.getline(cl, 81);
545  std::string line(cl);
546  if (line.find("seek") != std::string::npos)
547  {
548  // put back the line
549  oss << line << "\n";
550  int dmy;
551  // copying nmg value
552  iss >> dmy;
553  oss << std::setw(5) << dmy;
554  // change seek value to "seek"
555  iss >> dmy;
556  oss << std::setw(5) << seek;
557  char rem[70];
558  iss.read(rem, 70);
559  oss << std::string(rem);
560  }
561  else
562  {
563  oss << line << "\n";
564  }
565  }
566  // updating buffer
567  _buffer.str(std::string());
568  _buffer << oss.rdbuf();
569  }
570  else if (_tsk == "detonation")
571  {
572  // detonation information
573  if (!_jstrm.contains("Detonation"))
574  return;
575 
576  std::vector<double> _g;
577  _g.resize(3, 0.0);
578  double tburn = 0.0;
579 
580  if (_jstrm["Detonation"].contains("Gravity"))
581  {
582  _g[0] = _jstrm["Detonation"]["Gravity"][0].as<double>();
583  _g[1] = _jstrm["Detonation"]["Gravity"][1].as<double>();
584  _g[2] = _jstrm["Detonation"]["Gravity"][2].as<double>();
585  }
586 
587  if (_jstrm["Detonation"].contains("Tburn"))
588  tburn = _jstrm["Detonation"]["Tburn"].as<double>();
589 
590  std::stringstream iss;
591  std::stringstream oss;
592  iss << _buffer.rdbuf();
593  while (iss.rdbuf()->in_avail() != 0)
594  {
595  char cl[81];
596  iss.getline(cl, 81);
597  std::string line(cl);
598  if (line.find("rdet") != std::string::npos)
599  {
600  // put back the line
601  oss << line << "\n";
602  double dmy;
603  int dmyi;
604  // copying x/rdet value
605  iss >> dmy;
606  oss << std::setw(10) << std::setprecision(3) << std::scientific << dmy;
607  // copying y/tdet value
608  iss >> dmy;
609  oss << std::setw(10) << std::setprecision(3) << std::scientific << dmy;
610  // copying zdet value
611  iss >> dmy;
612  oss << std::setw(10) << std::setprecision(3) << std::scientific << dmy;
613  // copying new tburn value
614  iss >> dmy;
615  oss << std::setw(10) << std::setprecision(3) << std::scientific << tburn;
616  // copying shad value
617  iss >> dmyi;
618  oss << std::setw(5) << dmyi;
619  // copying npnt value
620  iss >> dmyi;
621  oss << std::setw(5) << dmyi;
622  // copying new xdd value
623  iss >> dmy;
624  oss << std::setw(10) << std::setprecision(3) << std::scientific << _g[0];
625  // copying new ydd value
626  iss >> dmy;
627  oss << std::setw(10) << std::setprecision(3) << std::scientific << _g[1];
628  // copying new zdd value
629  iss >> dmy;
630  oss << std::setw(10) << std::setprecision(3) << std::scientific << _g[2];
631  }
632  else
633  {
634  oss << line << "\n";
635  }
636  }
637  // updating buffer
638  _buffer.str(std::string());
639  _buffer << oss.rdbuf();
640  }
641  else if (_tsk == "main")
642  {
643  // detonation information
644  if (!_jstrm.contains("Main"))
645  return;
646 
647  // set defaults to unused values
648  int dplt = _jstrm["Main"].get_with_default("DPLT", -666);
649  double dtdyn = _jstrm["Main"].get_with_default("DTDYN", -666.0);
650 
651  std::stringstream iss;
652  std::stringstream oss;
653  iss << _buffer.rdbuf();
654  while (iss.rdbuf()->in_avail() != 0)
655  {
656  char cl[81];
657  iss.getline(cl, 81);
658  std::string line(cl);
659  if (line.find("sys") != std::string::npos)
660  {
661  char *buf = new char[5];
662  // put back the line
663  oss << line << "\n";
664  double dmy;
665  int dmyi;
666 
667  // copying sys value
668  iss >> dmyi;
669  oss << std::setw(5) << dmyi;
670 
671  // copying nplt value
672  iss >> dmyi;
673  oss << std::setw(5) << dmyi;
674 
675  // copying lplt value
676  iss >> dmyi;
677  oss << std::setw(5) << dmyi;
678 
679  // copying dplt value
680  iss.read(buf, 5);
681  dmyi = std::stoi(std::string(buf));
682  oss << std::setw(5) << (dplt == -666 ? dmyi : dplt);
683 
684  // copying dtsys value
685  iss >> dmy;
686  oss << std::setw(10) << std::setprecision(4) << std::scientific << dmy;
687 
688  // copying tsys value
689  iss >> dmy;
690  oss << std::setw(10) << std::setprecision(4) << std::scientific << dmy;
691 
692  // copying dtnode value
693  iss >> dmy;
694  oss << std::setw(10) << std::setprecision(4) << std::scientific << dmy;
695 
696  // copying tnode value
697  iss >> dmy;
698  oss << std::setw(10) << std::setprecision(4) << std::scientific << dmy;
699 
700  // copying dtdyn value
701  iss >> dmy;
702  oss << std::setw(10) << std::setprecision(4) << std::scientific
703  << (dtdyn == -666 ? dmy : dtdyn);
704 
705  // copying tdyn value
706  iss >> dmy;
707  oss << std::setw(10) << std::setprecision(4) << std::scientific << dmy;
708 
709  delete[] buf;
710  }
711  else
712  {
713  oss << line << "\n";
714  }
715  }
716  // updating buffer
717  _buffer.str(std::string());
718  _buffer << oss.rdbuf();
719  }
720  else if (_tsk == "close")
721  {
722  std::string ofname = _jstrm.get_with_default("Output File Name", _fname);
723  close(ofname);
724  }
725 }
726 
727 
728 void ep16Prep::read(const std::string &fname)
729 {
730  std::ifstream _ifile;
731  _ifile.open(fname);
732  if (!_ifile.good())
733  {
734  std::cerr << "Error opening file " << fname << std::endl;
735  throw;
736  }
737  _buffer.clear();
738  _buffer << _ifile.rdbuf();
739  //std::cout << "Buffer :\n" << _buffer.str() << std::endl;
740  _ifile.close();
741 }
742 
743 
744 void ep16Prep::close(const std::string &fname)
745 {
746  std::ofstream _ofile;
747  _ofile.open(fname);
748  if (!_ofile.is_open())
749  {
750  std::cerr << "Problem opening the output file." << std::endl;
751  exit(1);
752  }
753  _ofile << _buffer.rdbuf();
754  _ofile.close();
755 }
756 
757 #endif
std::string getTimeStr()
A complete I/O class for EXODUS II file format.
Definition: exoMesh.H:172
std::string find_ext(const std::string &fname)
std::string findToStr(const std::string &str, const std::string &ptrn)
std::string findFromStr(const std::string &str, const std::string &ptrn)
void toLower(std::string &str)
elementType
Definition: pntMesh.H:47
TRIANGLE
Definition: exoMesh.H:55