Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
printfeas.C
Go to the documentation of this file.
1 /* *******************************************************************
2  * Rocstar Simulation Suite *
3  * Copyright@2015, Illinois Rocstar LLC. All rights reserved. *
4  * *
5  * Illinois Rocstar LLC *
6  * Champaign, IL *
7  * www.illinoisrocstar.com *
8  * sales@illinoisrocstar.com *
9  * *
10  * License: See LICENSE file in top level of distribution package or *
11  * http://opensource.org/licenses/NCSA *
12  *********************************************************************/
13 /* *******************************************************************
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES *
16  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND *
17  * NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR *
18  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *
21  * USE OR OTHER DEALINGS WITH THE SOFTWARE. *
22  *********************************************************************/
33 #include "roccom.h"
34 
35 #include <fstream>
36 #include <iomanip>
37 #include <iostream>
38 #include <sstream>
39 #include <string>
40 #include <cstring>
41 
42 #define SwitchOnDataType(dType, funcCall) \
43  switch (dType) { \
44  case COM_CHAR: \
45  case COM_BYTE: \
46  { typedef char TT; \
47  funcCall; } \
48  break; \
49  case COM_UNSIGNED_CHAR: \
50  { typedef unsigned char TT; \
51  funcCall; } \
52  break; \
53  case COM_SHORT: \
54  { typedef short TT; \
55  funcCall; } \
56  break; \
57  case COM_UNSIGNED_SHORT: \
58  { typedef unsigned short TT; \
59  funcCall; } \
60  break; \
61  case COM_INT: \
62  { typedef int TT; \
63  funcCall; } \
64  break; \
65  case COM_UNSIGNED: \
66  { typedef unsigned int TT; \
67  funcCall; } \
68  break; \
69  case COM_LONG: \
70  { typedef long TT; \
71  funcCall; } \
72  break; \
73  case COM_UNSIGNED_LONG: \
74  { typedef unsigned long TT; \
75  funcCall; } \
76  break; \
77  case COM_FLOAT: \
78  { typedef float TT; \
79  funcCall; } \
80  break; \
81  case COM_DOUBLE: \
82  { typedef double TT; \
83  funcCall; } \
84  break; \
85  case COM_LONG_DOUBLE: \
86  { typedef long double TT; \
87  funcCall; } \
88  break; \
89  }
90 
91 struct AttrInfo {
92  std::string m_name;
93  char m_location;
94  int m_dataType;
95  int m_numComp;
96  std::string m_units;
97 };
98 
99 struct ConnInfo {
100  std::string m_name;
101  std::string m_type;
102  int m_numElements;
103  int m_numGhost;
104 };
105 
106 template <typename TT>
107 void PrintStructured(const TT* pData, const int ndims, const int* dims_nodes,
108  int ghost, char loc, std::ostream& out)
109 {
110  const int dims[3] = { dims_nodes[0] - (loc!='n'),
111  ndims>=2 ? dims_nodes[1] - (loc!='n') : 0,
112  ndims>=3 ? dims_nodes[2] - (loc!='n') : 0};
113 
114  const int last[3] = { dims[0] - ghost,
115  ndims>=2 ? dims[1] - ghost : 0,
116  ndims>=3 ? dims[2] - ghost : 0};
117 
118  if ( ndims==3) {
119  for (int k=ghost; k<last[2]; ++k)
120  for (int j=ghost; j<last[1]; ++j)
121  for (int i=ghost; i<last[0]; ++i) {
122  out << " " << std::scientific
123  << (!pData ? (TT)-987654321
124  : (loc=='p' ? pData[0]
125  : pData[i+j*dims[0]+k*dims[0]*dims[1]]));
126  if ((i - ghost) % 10 == 9) out << std::endl;
127  }
128  }
129  else if (ndims==2) {
130  for (int j=ghost; j<last[1]; ++j)
131  for (int i=ghost; i<last[0]; ++i) {
132  out << " " << std::scientific
133  << (!pData ? (TT)-987654321
134  : (loc=='p' ? pData[0] : pData[i+j*dims[0]]));
135  if ((i - ghost) % 10 == 9) out << std::endl;
136  }
137 
138  }
139  else {
140  for (int i=ghost; i<last[0]; ++i) {
141  out << " " << std::scientific
142  << (!pData ? (TT)-987654321 : (loc=='p' ? pData[0] : pData[i]));
143  if ((i - ghost) % 10 == 9) out << std::endl;
144  }
145 
146  }
147  out << std::endl;
148 }
149 
150 template <typename TT>
151 void PrintUnstructured(const TT* pData, int size, bool panel, std::ostream& out)
152 {
153  int i;
154  for (i=0; i<size; ++i) {
155  out << " " << std::scientific << (!pData ? (TT)-987654321
156  : (panel ? pData[0]
157  : pData[i]));
158  if (i % 10 == 9) out << std::endl;
159  }
160  out << std::endl;
161 }
162 
163 void PrintConn(const int* pConn, const ConnInfo& ci, char type,
164  std::ostream& out)
165 {
166  int nn;
167  std::istringstream sin(ci.m_type.substr(1));
168  sin >> nn;
169 
170  int elem;
171  for (elem=0; elem<ci.m_numElements-ci.m_numGhost; ++elem) {
172  switch (type) {
173  case 't': // The overall type is 't', so all the tables must be 't'
174  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
175  << " " << pConn[elem+2*ci.m_numElements] << std::endl;
176  break;
177 
178  case 'q':
179  if (ci.m_type[0] == 't')
180  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
181  << " " << pConn[elem+2*ci.m_numElements] << " "
182  << pConn[elem+2*ci.m_numElements] << std::endl;
183  else // must be q4, q8 or q9.
184  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
185  << " " << pConn[elem+2*ci.m_numElements] << " "
186  << pConn[elem+3*ci.m_numElements] << std::endl;
187  break;
188 
189  case 'T': // The overall type is 'T', so all the tables must be 'T'
190  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
191  << " " << pConn[elem+2*ci.m_numElements] << " "
192  << pConn[elem+3*ci.m_numElements] << std::endl;
193  break;
194 
195  case 'B':
196  if (ci.m_type[0] == 'T')
197  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
198  << " " << pConn[elem+2*ci.m_numElements] << " "
199  << pConn[elem+2*ci.m_numElements] << " "
200  << pConn[elem+3*ci.m_numElements] << " "
201  << pConn[elem+3*ci.m_numElements] << " "
202  << pConn[elem+3*ci.m_numElements] << " "
203  << pConn[elem+3*ci.m_numElements] << std::endl;
204  else if (ci.m_type == "P5")
205  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
206  << " " << pConn[elem+2*ci.m_numElements] << " "
207  << pConn[elem+3*ci.m_numElements] << " "
208  << pConn[elem+4*ci.m_numElements] << " "
209  << pConn[elem+4*ci.m_numElements] << " "
210  << pConn[elem+4*ci.m_numElements] << " "
211  << pConn[elem+4*ci.m_numElements] << std::endl;
212  else if (ci.m_type == "P6" || ci.m_type == "W6")
213  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
214  << " " << pConn[elem+2*ci.m_numElements] << " "
215  << pConn[elem+2*ci.m_numElements] << " "
216  << pConn[elem+3*ci.m_numElements] << " "
217  << pConn[elem+4*ci.m_numElements] << " "
218  << pConn[elem+5*ci.m_numElements] << " "
219  << pConn[elem+5*ci.m_numElements] << std::endl;
220  else
221  out << " " << pConn[elem] << " " << pConn[elem+ci.m_numElements]
222  << " " << pConn[elem+2*ci.m_numElements] << " "
223  << pConn[elem+3*ci.m_numElements] << " "
224  << pConn[elem+4*ci.m_numElements] << " "
225  << pConn[elem+5*ci.m_numElements] << " "
226  << pConn[elem+6*ci.m_numElements] << " "
227  << pConn[elem+7*ci.m_numElements] << std::endl;
228  break;
229  }
230  }
231 }
232 
233 void COM_print_window(const std::string& wName, const std::string& timeStr,
234  std::ostream& out, bool with_ghost) {
235  // Obtain the list of panes
236  int nPanes;
237  int* paneIds;
238  COM_get_panes(wName.c_str(), &nPanes, &paneIds);
239 
240  // Obtain the list of attributes
241  int nAttrs; // Number of attributes
242  char* attrStr; // names of attributes separated by spaces
243  COM_get_attributes(wName.c_str(), &nAttrs, &attrStr);
244 
245  // First get the nodal coordinate info.
246  int i;
247  std::string name;
248  std::vector<AttrInfo> attrs(nAttrs+1);
249  attrs[0].m_name = "nc";
250  COM_get_attribute((wName + '.' + attrs[0].m_name).c_str(),
251  &(attrs[0].m_location), &(attrs[0].m_dataType),
252  &(attrs[0].m_numComp), &(attrs[0].m_units));
253 
254  // Then get the basic attribute info.
255  {
256  std::istringstream sin(attrStr);
257  for (i=1; i<nAttrs+1; ++i) {
258  sin >> attrs[i].m_name;
259  COM_get_attribute((wName + '.' + attrs[i].m_name).c_str(),
260  &(attrs[i].m_location), &(attrs[i].m_dataType),
261  &(attrs[i].m_numComp), &(attrs[i].m_units));
262  }
263  }
264 
265  if ( nPanes>0) {
266  out << "TITLE=\"" << wName << ". Time: " << timeStr << ".\"" << std::endl;
267  out << "VARIABLES= \"x\", \"y\", \"z\"";
268  }
269 
270  // Eliminate window and pane attributes, note element attributes.
271  // EDIT: pane attributes with one item are used as element data.
272  // We might as well get rid of vectors and tensors, too.
273  std::vector<int> elemCentered;
274  int var = 4;
275  std::vector<AttrInfo>::iterator p = attrs.begin();
276  ++p;
277  while (p != attrs.end()) {
278  if ((*p).m_location != 'n' ) {
279  p = attrs.erase(p);
280  continue;
281  }
282 
283  if ((*p).m_numComp == 1) {
284  out << ", \"" << (*p).m_name << '"';
285  ++var;
286  } else {
287  int x;
288  for (x=1; x<=(*p).m_numComp; ++x) {
289  out << ", \"" << x << '-' << (*p).m_name << '"';
290  ++var;
291  }
292  }
293  ++p;
294  }
295  out << std::endl;
296 
297  int zone_count=0;
298  // Loop through the panes to find the meshes
299  for (i=0; i<nPanes; ++i) {
300 
301  int nElems, ngElems;
302  name = wName + ".conn";
303  COM_get_size(name.c_str(), paneIds[i], &nElems, &ngElems);
304  if ( with_ghost) ngElems = 0;
305  if ( nElems-ngElems==0) continue; // Skip empty panes
306 
307  out << "ZONE T=\"" << std::setw(5) << std::setfill('0')
308  << paneIds[i] << "\", ";
309 
310  // Obtain the size of nodes
311  int nNodes; // total number of nodes
312  int ghost; // Number of ghost nodes
313  name = wName + ".nc";
314  COM_get_size(name.c_str(), paneIds[i], &nNodes, &ghost);
315  if ( with_ghost) ghost=0;
316 
317  // Obtain the connectivity tables
318  int nConn; // Number of connectivity tables
319  char* connNames; // Names of connectivity tables separated by space
320  COM_get_connectivities(wName.c_str(), paneIds[i], &nConn, &connNames);
321 
322  int ndims;
323  const int* dims = NULL;
324  char elemType = '\0';
325  int eTotal = 0;
326  std::vector<ConnInfo> connInfo(nConn);
327  if (nConn == 1 && strncmp(connNames, ":st", 3) == 0) { // Structured mesh
328  connInfo.clear();
329 
330  name = wName + '.' + connNames;
331  COM_get_size(name.c_str(), paneIds[i], &ndims, &ghost);
332  if ( with_ghost) ghost=0;
333 
334  // Obtain the dimensions (must be a const array) of the pane
335  COM_get_array_const(name.c_str(), paneIds[i], &dims);
336 
337  out << "I=" << dims[0] - 2 * ghost;
338  if ( ndims>=2) out << ", J=" << dims[1] - 2 * ghost;
339  if ( ndims>=3) out << ", K=" << dims[2] - 2 * ghost;
340 
341  out << ", ZONETYPE=ORDERED, ";
342  } else { // Unstructured mesh
343  // Obtain the sizes of connectivity tables
344  std::istringstream sin(connNames);
345  std::vector<ConnInfo>::iterator c;
346  for (c=connInfo.begin(); c!=connInfo.end(); ++c) {
347  sin >> (*c).m_type;
348  (*c).m_name = wName + '.' + (*c).m_type;
349  (*c).m_type.erase(0, 1);
350  std::string::size_type x = (*c).m_type.find(':', 2);
351  if (x != std::string::npos)
352  (*c).m_type.erase(x);
353 
354  COM_get_size((*c).m_name.c_str(), paneIds[i], &((*c).m_numElements),
355  &((*c).m_numGhost));
356  if ( with_ghost) (*c).m_numGhost = 0;
357  eTotal += (*c).m_numElements - (*c).m_numGhost;
358 
359  // Tecplot can't do mixed elements, so we have to use the biggest
360  // and fudge the rest.
361  if (elemType == '\0' || elemType == 't'
362  || ((elemType == 'q' || elemType == 'T')
363  && (*c).m_type[0] > 'A' && (*c).m_type[0] < 'Z')
364  || (*c).m_type[0] == 'B' || (*c).m_type[0] == 'H')
365  elemType = (*c).m_type[0];
366  }
367  out << "N=" << nNodes - ghost << ", E=" << eTotal << ", ZONETYPE=";
368  switch (elemType) {
369  case 't':
370  out << "FETRIANGLE, ";
371  break;
372 
373  case 'q':
374  out << "FEQUADRILATERAL, ";
375  break;
376 
377  case 'T':
378  out << "FETETRAHEDRON, ";
379  break;
380 
381  case 'P':
382  case 'W':
383  case 'H':
384  elemType = 'B';
385  // Intentional fall-through
386 
387  case 'B':
388  out << "FEBRICK, ";
389  break;
390  }
391 
392  // free the buffer of connNames
393  COM_free_buffer(&connNames);
394  }
395 
396  out << "DATAPACKING=BLOCK";
397  if (!elemCentered.empty()) {
398  std::vector<int>::iterator cv = elemCentered.begin();
399  out << ", VARLOCATION=([" << *cv;
400  ++cv;
401  while (cv != elemCentered.end()) {
402  out << ',' << *cv;
403  ++cv;
404  }
405  out << "]=CELLCENTERED)";
406  }
407  out << std::endl;
408 
409  for (p=attrs.begin(); p!=attrs.end(); ++p) {
410  const void* pArray = NULL;
411  if ((*p).m_numComp == 1) {
412  out << "# Begin " << (*p).m_name << std::endl;
413  COM_get_array_const((wName + '.' + (*p).m_name).c_str(), paneIds[i],
414  &pArray);
415  if (dims != NULL) { // Structured
416  SwitchOnDataType((*p).m_dataType,
417  PrintStructured((TT*)pArray, ndims, dims, ghost,
418  (*p).m_location, out));
419  } else {
420  SwitchOnDataType((*p).m_dataType,
421  PrintUnstructured((TT*)pArray,
422  ((*p).m_location != 'n' ? eTotal
423  : nNodes - ghost),
424  (*p).m_location == 'p', out));
425  }
426  } else {
427  int comp;
428  for (comp=1; comp<=(*p).m_numComp; ++comp) {
429  std::ostringstream sout;
430  sout << wName << '.' << comp << '-' << (*p).m_name;
431  out << "# Begin " << comp << '-' << (*p).m_name << std::endl;
432  COM_get_array_const(sout.str().c_str(), paneIds[i], &pArray);
433  if (dims != NULL) { // Structured
434  SwitchOnDataType((*p).m_dataType,
435  PrintStructured((TT*)pArray, ndims, dims, ghost,
436  (*p).m_location, out));
437  } else {
438  SwitchOnDataType((*p).m_dataType,
439  PrintUnstructured((TT*)pArray,
440  ((*p).m_location != 'n' ? eTotal
441  : nNodes - ghost),
442  (*p).m_location == 'p', out));
443  }
444  }
445  }
446  }
447 
448  if (!connInfo.empty()) {
449  std::vector<ConnInfo>::iterator c = connInfo.begin();
450  while (c != connInfo.end()) {
451  const int* pConn = NULL;
452  COM_get_array_const((*c).m_name.c_str(), paneIds[i], &pConn);
453  PrintConn(pConn, *c, elemType, out);
454  ++c;
455  }
456  }
457 
458  if ( COM_get_attribute_handle( (wName+".ridges").c_str()) >0) {
459  ++zone_count;
460 
461  int n; COM_get_size( (wName+".ridges").c_str(), paneIds[i], &n);
462 
463  if ( n>0) {
464  out << "ZONE T=\"fea" << std::setw(5) << std::setfill('0')
465  << paneIds[i] << "\", N=" << nNodes - ghost
466  << ", E=" << n << ", ZONETYPE=FELINESEG, DATAPACKING=BLOCK\n";
467  out << "VARSHARELIST=([1-" << var << "]=" << zone_count << ")" << std::endl;
468 
469  int *pArray;
470  COM_get_array( (wName+".ridges").c_str(), paneIds[i], &pArray);
471 
472  for (int i=0; i<n; ++i) {
473  out << " " << pArray[i] << " " << pArray[i+n] << std::endl;
474  }
475 
476  ++zone_count;
477  }
478  }
479  }
480 
481  // Free buffers for pane ids and attribute names
482  COM_free_buffer(&paneIds);
483  COM_free_buffer(&attrStr);
484 }
485 
487 
489 inline static void remove_arg( int *argc, char ***argv, int i) {
490  for ( int j=i; j<*argc-1; ++j) (*argv)[j]=(*argv)[j+1];
491  --*argc;
492 }
493 
494 int main(int argc, char* argv[])
495 {
496  COM_init(&argc, &argv);
497 
498  bool with_ghost = (argc>1 && std::strcmp(argv[1],"-g")==0);
499  if ( with_ghost) remove_arg( &argc, &argv, 1);
500 
501  bool read_control = (argc>1 && std::strcmp(argv[1],"-c")==0);
502  if ( read_control) remove_arg( &argc, &argv, 1);
503 
504  if (argc < 2 || argc > 3 ) {
505  std::cerr << "Usage: hdf2plt [-g] <hdf input files> [<output file>]" << std::endl;
506  std::cerr << " or: hdf2plt [-g] -c <Rocin control file> [<output file>]" << std::endl;
507  std::cerr << "\nOptions:\n\t -g: Includes ghost nodes and elements in output\n"
508  << "\nExamples:\n"
509  << "\thdf2plt -g \"surfmesh*.hdf\" output.plt\n"
510  << "\thdf2plt -g -c surfmesh.txt output.plt" << std::endl;
511  return -1;
512  }
513 
515 
516  int IN_obtain = COM_get_function_handle("IN.obtain_attribute");
517 
518  std::string file_in(argv[1]);
519  std::string win_in = file_in;
520 
521  std::string::size_type st = win_in.find_last_of('/');
522  if (st != std::string::npos)
523  win_in.erase(0, st+1);
524  st = win_in.find_first_not_of("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
525  if (st != std::string::npos)
526  win_in.erase(st);
527 
528  // Initialize an empty time string
529  int len = 15;
530  char timeStr[16];
531  timeStr[0] = '\0';
532 
533  if (read_control) {
534  std::cerr << "Reading by control file " << file_in
535  << " into window " << win_in << std::endl;
536 
537  int IN_read = COM_get_function_handle("IN.read_by_control_file");
538  COM_call_function(IN_read, file_in.c_str(), win_in.c_str(), NULL,
539  timeStr, &len);
540  } else {
541  std::cerr << "Reading HDF file(s) " << file_in
542  << " into window " << win_in << std::endl;
543 
544  int IN_read = COM_get_function_handle("IN.read_window");
545  COM_call_function(IN_read, file_in.c_str(), win_in.c_str(), NULL, NULL,
546  timeStr, &len);
547  }
548 
549  std::string win_all(win_in + ".all");
550  int IN_all = COM_get_attribute_handle(win_all.c_str());
551 
552  std::cerr << "Obtaining data attributes for window " << win_in << std::endl;
553  COM_call_function(IN_obtain, &IN_all, &IN_all);
554 
555  if (argc == 2) {
556  std::cerr << "Writing window out to standard output " << std::endl;
557  COM_print_window(win_in, timeStr, std::cout, with_ghost);
558  } else {
559  std::cerr << "Writing window out to " << argv[2] << std::endl;
560  std::ofstream fout(argv[2]);
561  COM_print_window(win_in, timeStr, fout, with_ghost);
562  }
563 
564  // COM_UNLOAD_MODULE_STATIC_DYNAMIC(Rocin);
565 
566  COM_finalize();
567  return 0;
568 }
569 
570 
void PrintConn(const int *pConn, const ConnInfo &ci, std::ostream &out)
Definition: cgns2smf.C:232
j indices k indices k
Definition: Indexing.h:6
void COM_get_attribute(const std::string wa_str, char *loc, int *type, int *ncomp, std::string *unit)
Definition: roccom_c++.h:269
int m_numGhost
Definition: cgns2smf.C:140
void PrintUnstructured(const TT **pData, int nComp, int size, std::ostream &out)
Definition: cgns2smf.C:221
int m_dataType
Definition: cgns2smf.C:131
This file contains the prototypes for Roccom API.
void COM_print_window(const char *wName, std::ostream &ostr)
Print a terse human-readable description of this window to this ostream.
Definition: printin.C:64
void PrintStructured(const TT **pData, int nComp, int ndims, const int *dims_nodes, int ghost, char loc, std::ostream &out)
Definition: cgns2smf.C:176
void COM_get_array(const char *wa_str, int pane_id, void **addr, int *strd, int *cap)
Get the address for an attribute on a specific pane.
std::string m_name
Definition: cgns2smf.C:137
int COM_get_attribute_handle(const char *waname)
Definition: roccom_c++.h:412
static void remove_arg(int *argc, char ***argv, int i)
Remove an argument from the argument list.
Definition: printfeas.C:489
void COM_get_connectivities(const char *wname, int pane_id, int *nc, std::string &names)
Definition: roccom_c++.h:363
std::string m_units
Definition: cgns2smf.C:133
void COM_get_attributes(const char *wname, int *na, std::string &names)
Definition: roccom_c++.h:360
void COM_finalize()
Definition: roccom_c++.h:59
std::string m_type
Definition: cgns2smf.C:138
NT & sin
Definition: Rocin.h:64
blockLoc i
Definition: read.cpp:79
void int int REAL * x
Definition: read.cpp:74
const NT & n
std::string m_name
Definition: cgns2smf.C:129
void COM_get_size(const char *wa_str, int pane_id, int *size, int *ng=0)
Get the sizes of an attribute.
Definition: roccom_c++.h:274
void COM_call_function(const int wf, int argc,...)
Definition: roccom_c.C:48
int main(int argc, char *argv[])
Definition: blastest.C:94
int m_numComp
Definition: cgns2smf.C:132
#define SwitchOnDataType(dType, funcCall)
Definition: printfeas.C:42
j indices j
Definition: Indexing.h:6
char m_location
Definition: cgns2smf.C:130
void COM_init(int *argc, char ***argv)
Definition: roccom_c++.h:57
int m_numElements
Definition: cgns2smf.C:139
void COM_get_panes(const char *wname, std::vector< int > &pane_ids, int rank=-2)
Definition: roccom_c++.h:350
void COM_free_buffer(int **buf)
Definition: roccom_c++.h:397
#define COM_LOAD_MODULE_STATIC_DYNAMIC(moduleName, windowString)
Definition: roccom_basic.h:111
int COM_get_function_handle(const char *wfname)
Definition: roccom_c++.h:428
#define COM_EXTERN_MODULE(moduleName)
Definition: roccom_basic.h:116
std::vector< int > paneIds
Array of paneIds.
Definition: hdf2pltV2.C:60