52 *_out <<
"GEM_Partition ID: " << _id << endl
53 <<
"Mesh Entities: Total Real Ghosts" << endl
54 <<
"Number of Nodes: (" << _nc.size()/3 <<
","
55 << _nc.size()/3 - _ngnodes <<
"," << _ngnodes <<
")"
57 <<
"Number of Elements: (" << nelem() <<
","
58 << nelem() - _ngtet - _ngpyr - _ngpris - _nghex <<
","
59 << _ngtet + _ngpyr + _ngpris + _nghex <<
")" << endl
60 <<
"Cell Mapping: (" << _cell_ordering[0] <<
","
61 << _cell_ordering[1] <<
"," << _cell_ordering[2] <<
","
62 << _cell_ordering[3] <<
")" << endl;
63 if(_tetconn.size() > 0)
64 *_out <<
"Tets: (" << _tetconn.size()/4 <<
","
65 << _tetconn.size()/4 - _ngtet <<
"," << _ngtet <<
")" << endl;
66 if(_pyrconn.size() > 0)
67 *_out <<
"Pyramids: (" << _pyrconn.size()/5 <<
","
68 << _pyrconn.size()/5 - _ngpyr <<
"," << _ngpyr <<
")" << endl;
69 if(_prisconn.size() > 0)
70 *_out <<
"Prisms: (" << _prisconn.size()/6 <<
","
71 << _prisconn.size()/6 - _ngpris <<
"," << _ngpris <<
")" << endl;
72 if(_hexconn.size() > 0)
73 *_out <<
"Hexes: (" << _hexconn.size()/8 <<
","
74 << _hexconn.size()/8 - _nghex <<
"," << _nghex <<
")" << endl;
77 *_out <<
"Cell debugging: " << endl;
79 unsigned int nlin = 5;
80 if(_tetconn.size() > 0) {
81 *_out <<
"Tet Cell IDs: " << endl;
82 nel = _tetconn.size()/4;
86 *_out << setw(12) << Elem2Cell(std::make_pair((
unsigned int)1,++el));
90 if(el%nlin) *_out << endl;
92 if(_pyrconn.size() > 0){
93 *_out <<
"Pyr Cell IDs: " << endl;
94 nel = _pyrconn.size()/5;
97 *_out << setw(12) << Elem2Cell(std::make_pair((
unsigned int)2,++el));
101 if(el%nlin) *_out << endl;
103 if(_prisconn.size() > 0){
104 *_out <<
"Pris Cell IDs:" << endl;
105 nel = _prisconn.size()/6;
108 *_out << setw(12) << Elem2Cell(std::make_pair((
unsigned int)3,++el));
112 if(el%nlin) *_out << endl;
114 if(_hexconn.size() > 0){
115 *_out <<
"Hex Cell IDs: " << endl;
116 nel = _hexconn.size()/8;
119 *_out << setw(12) << Elem2Cell(std::make_pair((
unsigned int)4,++el));
123 if(el%nlin) *_out << endl;
134 *_out <<
"==================================================" << endl
135 <<
"Number of partition boundaries: " << _pb.size() << endl;
136 unsigned int border = 0;
137 while(border < _pb.size()){
139 *_out <<
"------------------------------------------------" << endl
140 <<
" Partition Boundary #" << border+1 << endl;
142 *_out <<
"------------------------------------------------" << endl;
144 *_out <<
"==================================================" << endl;
153 *_out <<
"Remote Partition: " << _rpart << endl
154 <<
"Nodes: (" << _sharenodes.size() <<
","
155 << _sendnodes.size() <<
"," << _recvnodes.size()
157 <<
"Cells: (" << _sendcells.size() <<
","
158 << _recvcells.size() <<
")" << endl;
166 *_out <<
"==================================================" << endl
167 <<
"Number of Domain Boundaries: " << _db.size() << endl;
168 unsigned int patch = 0;
169 while(patch < _db.size()){
171 *_out <<
"------------------------------------------------" << endl;
173 *_out <<
"------------------------------------------------" << endl;
175 *_out <<
"==================================================" << endl;
184 *_out <<
"Domain Boundary ID: " << _id << endl
185 <<
" Triangles: (" << _triconn.size()/3 <<
"," << _ngtri <<
")"
187 <<
" Quads: (" << _quadconn.size()/4 <<
"," << _ngquad
194 int ncsend,
int ncrecv,
int *sharedn,
195 int *sendn,
int *recvn,
int *sendc,
int *recvc)
199 _sendcells.resize(ncsend);
200 while(indy < ncsend){
201 _sendcells[indy] = sendc[indy];
204 _recvcells.resize(ncrecv);
206 while(indy < ncrecv){
207 _recvcells[indy] = recvc[indy];
211 _sendnodes.resize(nnsend);
212 while(indy < nnsend){
213 _sendnodes[indy] = sendn[indy];
217 _recvnodes.resize(nnrecv);
218 while(indy < nnrecv){
219 _recvnodes[indy] = recvn[indy];
223 _sharenodes.resize(nnshared);
224 while(indy < nnshared){
225 _sharenodes[indy] = sharedn[indy];
234 unsigned int ngnodes)
237 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays(" << _id
239 map<unsigned int,unsigned int> s2v_imap;
240 list<unsigned int> nodelist;
241 std::vector<unsigned int>::iterator ci = _triconn.begin();
242 unsigned int indy = 0;
243 while(ci != _triconn.end()){
246 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays: Error: Found 0 in"
247 <<
" triangle conn. for boundary_id = " << _id <<
"\n"
248 <<
" triangle/node (" << indy/3 <<
"," << (indy-((indy/3)*3)+1)
250 <<
" Number of total triangles = " << _triconn.size()/3 <<
"\n"
251 <<
" Number of ghost tri = " << _ngtri <<
"\n";
254 nodelist.push_back(*ci++);
257 ci = _quadconn.begin();
258 while(ci != _quadconn.end()){
260 nodelist.push_back(*ci++);
263 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays(" << _id <<
"): "
264 <<
"nnodes before sort/unique: " << nodelist.size() <<
"\n";
268 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays)" << _id <<
"): "
269 <<
"nnodes after sort/unique: " << nodelist.size() <<
"\n";
271 unsigned int nreal_volume_nodes = ic.size()/3 - ngnodes;
272 unsigned int nreal_tris = _triconn.size()/3 - _ngtri;
273 unsigned int nreal_quads = _quadconn.size()/3 - _ngquad;
277 list<unsigned int>::iterator nli = nodelist.begin();
278 while(nli != nodelist.end()){
280 if(*nli > nreal_volume_nodes){
281 unsigned int nrel = 0;
283 vector<unsigned int>::iterator ti = _triconn.begin();
284 while(nrel < nreal_tris){
287 if((
unsigned int)*nli == (
unsigned int)*ti++){
289 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays:"
290 <<
" Found ghost node, volume_id("
292 <<
") in real tri(" << nrel+1
293 <<
") of surface " << _id <<
". Aborting." << endl;
302 ti = _quadconn.begin();
303 while(nrel < nreal_quads){
308 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays:"
309 <<
" Found ghost node, volume_id("
310 << *nli <<
") in real quad(" << nrel+1
311 <<
") of surface " << _id <<
". Aborting." << endl;
321 unsigned int nrel = 0;
323 vector<unsigned int>::iterator ti = _triconn.begin();
325 while(nrel < nreal_tris && !found){
327 while(ein < 3 && !found){
328 if((
unsigned int)*nli == (
unsigned int)*ti++)
336 ti = _quadconn.begin();
337 while(nrel < nreal_quads && !found){
339 while(ein < 4 && !found){
347 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays: WARNING: "
348 <<
" Found isolated real node(" << *nli <<
") on surface."
355 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays: "
356 <<
"Aborting due to previous errors." << std::endl;
360 surface_coordinates.resize(3*nodelist.size());
361 unsigned int nghosts = 0;
362 unsigned int nvol_real = ic.size()/3 - ngnodes;
363 unsigned int real_node = 0;
364 unsigned int ghost_node = 0;
365 list<unsigned int>::iterator nli = nodelist.begin();
366 while(nli != nodelist.end())
367 if(*nli++ > nvol_real)
369 nli = nodelist.begin();
370 unsigned int nreal_nodes = nodelist.size() - nghosts;
372 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays(" << _id
374 << nreal_nodes <<
"," << nghosts <<
")\n";
376 while(nli != nodelist.end()){
377 unsigned int node = *nli++;
378 if(node > nvol_real){
379 surface_coordinates[(nreal_nodes+ghost_node)*3] = ic[(node -1)*3];
380 surface_coordinates[(nreal_nodes+ghost_node)*3+1] = ic[(node -1)*3+1];
381 surface_coordinates[(nreal_nodes+ghost_node)*3+2] = ic[(node -1)*3+2];
383 s2v_imap.insert(make_pair(node,nreal_nodes+ghost_node));
386 surface_coordinates[real_node*3] = ic[(node-1)*3];
387 surface_coordinates[real_node*3+1] = ic[(node-1)*3+1];
388 surface_coordinates[real_node*3+2] = ic[(node-1)*3+2];
390 s2v_imap.insert(make_pair(node,real_node));
393 surface_ngnodes = ghost_node;
394 ci = _triconn.begin();
395 surface_tri.resize(_triconn.size());
396 surface_quad.resize(_quadconn.size());
397 unsigned int ind = 0;
398 while(ci != _triconn.end())
399 surface_tri[ind++] = s2v_imap[*ci++];
401 ci = _quadconn.begin();
402 while(ci != _quadconn.end())
403 surface_quad[ind++] = s2v_imap[*ci++];
405 *_out <<
"GEM_DomainBoundary::PopulateSurfaceArrays(" << _id
414 std::vector<double> &fvec,
415 unsigned int ncomp,
const string &unit)
417 string aname(volume_window+
"."+fname);
428 std::vector<double> &fvec,
429 unsigned int ncomp,
const string &unit)
431 string aname(wname+
"."+fname);
442 std::vector<std::vector<unsigned int> > &indices,
443 unsigned int §ion_size,
444 std::vector<int> &pconn)
447 unsigned int nrp = rpids.size();
448 pconn.push_back(nrp);
450 std::vector<unsigned int>::iterator rpi = rpids.begin();
451 unsigned int rpindex = 0;
452 while(rpi != rpids.end()){
453 pconn.push_back(*rpi++);
455 unsigned int ne = indices[rpindex].size();
457 section_size += (ne+1);
458 std::vector<unsigned int>::iterator ei = indices[rpindex].begin();
459 while(ei != indices[rpindex].end())
460 pconn.push_back(*ei++);
477 std::vector<std::vector<
478 std::vector<unsigned int> > > &index_vectors,
479 unsigned int &nreal,
unsigned int &ng,
480 std::vector<int> &pc)
483 unsigned int section_size = 0;
486 if(index_vectors[i].size() == 0 && _out){
488 <<
"Roccom_create_pconn::Attempt to create empty pconn. Aborting.\n";
493 nreal = section_size;
494 while(i < 5 && index_vectors[i].size() != 0){
504 unsigned int nel,
unsigned int ngel,
505 std::vector<unsigned int> &conn,
506 unsigned int esize,
bool ghost_part)
508 if(nel == 0 || esize == 0)
return;
509 unsigned int nreal = conn.size()/esize - ngel;
526 *_out <<
"Roccom_register_mesh::Error: Unknown mesh type, aborting.\n";
529 mesh_type = wname +
"." + mesh_type +
":";
531 if(nreal > 0 && !ghost_part){
532 entity = mesh_type +
"real";
536 if(ngel > 0 && ghost_part){
537 entity = mesh_type +
"virtual";
548 COM_set_size((wname+
".nc"),pane_id,surface_coordinates.size()/3,
550 COM_set_array((wname+
".nc"),pane_id,&surface_coordinates[0],3);
551 unsigned int nreal = _triconn.size()/3 - _ngtri;
554 COM_set_array((wname+
".:t3:real"),pane_id,&(surface_tri[0]),3);
556 nreal = _quadconn.size()/4 - _ngquad;
559 COM_set_array((wname+
".:q4:real"),pane_id,&(surface_quad[0]),4);
562 nreal = _triconn.size()/3-_ngtri;
563 COM_set_size((wname+
".:t3:virtual"),pane_id,_ngtri,_ngtri);
564 COM_set_array((wname+
".:t3:virtual"),pane_id,&(surface_tri[nreal*3]),3);
567 nreal = _quadconn.size()/4-_ngquad;
568 COM_set_size((wname+
".:q4:virtual"),pane_id,_ngquad,_ngquad);
569 COM_set_array((wname+
".:q4:virtual"),pane_id,&(surface_quad[nreal*4]),4);
577 if(volume_window.empty() || surface_window.empty())
586 if(volume_window.empty() || surface_window.empty())
606 if(volume_window.empty() || surface_window.empty())
609 *_out <<
"GEM_Partition(" << _id <<
")::WriteRocstar: Writing volume window"
610 <<
" in " << prefix <<
". CWD = " <<
TRAIL_CWD() << std::endl;
652 *_out <<
"GEM_Partition(" << _id
653 <<
")::WriteRocstar: Writing surface window\n";
688 *_out <<
"GEM_Partition(" << _id
689 <<
")::InitRoccomWindows: Creating windows" << endl;
690 volume_window = wname+
"_vol";
691 surface_window = wname+
"_surf";
695 *_out <<
"GEM_Partition(" << _id
696 <<
")::InitRoccomWindows: Populate Volume Window"
698 if(!PopulateVolumeWindow(volume_window))
701 *_out <<
"GEM_Partition(" << _id
702 <<
")::InitRoccomWindows: Populate Surface Window"
704 if(!PopulateSurfaceWindow(surface_window))
713 *_out <<
"GEM_Partition(" << _id <<
")::CreatePconn: enter" << endl;
715 unsigned int nrp = _pb.size();
716 std::vector<unsigned int> rpid_v;
717 std::vector<std::vector<std::vector<unsigned int> > > indices_v(5);
719 indices_v[0].resize(nrp);
720 indices_v[1].resize(nrp);
721 indices_v[2].resize(nrp);
722 indices_v[3].resize(nrp);
723 indices_v[4].resize(nrp);
724 unsigned int rpin = 0;
727 unsigned int rpid = fb.
_rpart * 100 + 1;
736 unsigned int nreal = 0;
737 Create_com_pconn(rpid_v,indices_v,nreal,pconn_nghost,pconn);
738 assert(pconn.size() - pconn_nghost == nreal);
739 COM_set_size((wname+
".pconn"),pane_id,pconn.size(),pconn_nghost);
742 *_out <<
"GEM_Partition(" << _id <<
")::CreatePconn: exit" << endl;
750 *_out <<
"GEM_Partition(" << _id
751 <<
")::PopulateVolumeWindow: enter" << endl;
752 pane_id = _id * 100 + 1;
754 unsigned int nnodes = _nc.size()/3;
757 unsigned int el_type = 0;
760 switch(_cell_ordering[el_type]){
762 nreal = _tetconn.size()/4 - _ngtet;
764 Register_com_volconn(wname,pane_id,nreal,_ngtet,_tetconn,4,
false);
767 nreal = _pyrconn.size()/5 - _ngpyr;
769 Register_com_volconn(wname,pane_id,nreal,_ngpyr,_pyrconn,5,
false);
772 nreal = _prisconn.size()/6 - _ngpris;
774 Register_com_volconn(wname,pane_id,nreal,_ngpris,_prisconn,6,
false);
777 nreal = _hexconn.size()/8 - _nghex;
779 Register_com_volconn(wname,pane_id,nreal,_nghex,_hexconn,8,
false);
787 switch(_cell_ordering[el_type]){
789 nreal = _tetconn.size()/4 - _ngtet;
791 Register_com_volconn(wname,pane_id,_ngtet,_ngtet,_tetconn,4,
true);
794 nreal = _pyrconn.size()/5 - _ngpyr;
796 Register_com_volconn(wname,pane_id,_ngpyr,_ngpyr,_pyrconn,5,
true);
799 nreal = _prisconn.size()/6 - _ngpris;
801 Register_com_volconn(wname,pane_id,_ngpris,_ngpris,_prisconn,6,
true);
804 nreal = _hexconn.size()/8 - _nghex;
806 Register_com_volconn(wname,pane_id,_nghex,_nghex,_hexconn,8,
true);
813 *_out <<
"GEM_Partition(" << _id
814 <<
")::PopulateVolumeWindow: exit" << endl;
822 *_out <<
"GEM_Partition(" << _id
823 <<
")::PopulateSurfaceWindow: enter" << endl;
825 int npatches = _db.size();
827 while(patch < npatches){
829 fp.
pane_id = _id * 100 + (patch+1) + 1;
835 *_out <<
"GEM_Partition(" << _id
836 <<
")::PopulateSurfaceWindow: exit" << endl;
846 unsigned int nel = conn.size()/es;
855 conn[el] = conn[el+1];
874 pair<unsigned int,unsigned int>
877 unsigned int elem_type = 0;
879 unsigned int nreal_elems;
880 while(elem_type < 4){
881 switch(_cell_ordering[elem_type]){
883 nreal_elems = _tetconn.size()/4 - _ngtet;
884 if(cell <= (offset+nreal_elems))
885 return(make_pair(1,cell-offset));
887 offset += nreal_elems;
890 nreal_elems = _pyrconn.size()/5 - _ngpyr;
891 if(cell <= (offset+nreal_elems))
892 return(make_pair(2,cell-offset));
894 offset += nreal_elems;
897 nreal_elems = _prisconn.size()/6 - _ngpris;
898 if(cell <= (offset+nreal_elems))
899 return(make_pair(3,cell-offset));
901 offset += nreal_elems;
904 nreal_elems = _hexconn.size()/8 - _nghex;
905 if(cell <= (offset+nreal_elems))
906 return(make_pair(4,cell-offset));
908 offset += nreal_elems;
914 while(elem_type < 4){
915 switch(_cell_ordering[elem_type]){
917 nreal_elems = _tetconn.size()/4 - _ngtet;
918 if(cell <= (offset+_ngtet))
919 return(make_pair(1,cell-offset+nreal_elems));
924 nreal_elems = _pyrconn.size()/5 - _ngpyr;
925 if(cell <= (offset+_ngpyr))
926 return(make_pair(2,cell-offset+nreal_elems));
931 nreal_elems = _prisconn.size()/6 - _ngpris;
932 if(cell <= (offset+_ngpris))
933 return(make_pair(3,cell-offset+nreal_elems));
938 nreal_elems = _hexconn.size()/8 - _nghex;
939 if(cell <= (offset+_nghex))
940 return(make_pair(4,cell-offset+nreal_elems));
948 *_out <<
"GEM_Partition(" << _id
949 <<
")::Cell2Elem: Fatal error - Could not find cell "
950 << cell <<
", dying.\n";
958 unsigned int elem_type = 0;
960 unsigned int nreal_elem;
961 while(elem_type < 4){
962 switch(_cell_ordering[elem_type]){
964 nreal_elem = _tetconn.size()/4 - _ngtet;
965 if(ti.first != 1 || ti.second > nreal_elem)
966 offset += nreal_elem;
968 return(offset+ti.second);
972 nreal_elem = _pyrconn.size()/5 - _ngpyr;
973 if(ti.first != 2 || ti.second > nreal_elem)
974 offset += nreal_elem;
976 return(offset+ti.second);
980 nreal_elem = _prisconn.size()/6 - _ngpris;
981 if(ti.first != 3 || ti.second > nreal_elem)
982 offset += nreal_elem;
984 return(offset+ti.second);
988 nreal_elem = _hexconn.size()/8 - _nghex;
989 if(ti.first != 4 || ti.second > nreal_elem)
990 offset += nreal_elem;
992 return(offset+ti.second);
999 while(elem_type < 4){
1000 switch(_cell_ordering[elem_type]){
1002 nreal_elem = _tetconn.size()/4 - _ngtet;
1006 return(offset+ti.second-nreal_elem);
1010 nreal_elem = _pyrconn.size()/5 - _ngpyr;
1014 return(offset+ti.second-nreal_elem);
1018 nreal_elem = _prisconn.size()/6 - _ngpris;
1022 return(offset+ti.second-nreal_elem);
1026 nreal_elem = _hexconn.size()/8 - _nghex;
1030 return(offset+ti.second-nreal_elem);
1037 *_out <<
"GEM_Partition(" << _id
1038 <<
")::Elem2Cell: Fatal error. Could not find element "
1039 <<
"(" << ti.first <<
"," << ti.second <<
"). Dying.\n";
1046 int nval_cells,
double *node_data,
1049 _solver_data._string_data.push_back(wname);
1050 _solver_data._field_data.resize(2);
1051 unsigned int ncells = _tetconn.size()/4 + _hexconn.size()/8 +
1052 _prisconn.size()/6 + _pyrconn.size()/5;
1053 unsigned int nnodes = _nc.size()/3;
1055 *_out <<
"GEM_Partition(" << _id <<
")::SetSolverDataBlock: "
1056 <<
"Receiving data for " << nval_cells <<
" doubles on " << ncells
1057 <<
" cells and " << nval_nodes <<
" doubles on " << nnodes
1058 <<
" nodes." << std::endl;
1059 _solver_data._field_data[0].resize(nval_cells*ncells);
1060 _solver_data._field_data[1].resize(nval_nodes*nnodes);
1061 _solver_data._stride_field.resize(2);
1062 _solver_data._stride_field[0] = nval_cells;
1063 _solver_data._stride_field[1] = nval_nodes;
1064 memcpy(&_solver_data._field_data[0][0],cell_data,
1065 sizeof(
double)*nval_cells*ncells);
1066 memcpy(&_solver_data._field_data[1][0],node_data,
1067 sizeof(
double)*nval_nodes*nnodes);
1073 int nval_cells,
double *node_data,
1076 _solver_data._string_data.push_back(wname);
1077 unsigned int current_size = _solver_data._field_data.size();
1078 if(current_size == 0)
1079 _solver_data._field_data.resize(2);
1081 std::vector<double> temp;
1082 _solver_data._field_data.push_back(temp);
1083 _solver_data._field_data.push_back(temp);
1084 _solver_data._stride_field.push_back(0);
1085 _solver_data._stride_field.push_back(0);
1087 unsigned int ncells = _tetconn.size()/4 + _hexconn.size()/8 +
1088 _prisconn.size()/6 + _pyrconn.size()/5;
1089 unsigned int nnodes = _nc.size()/3;
1090 _solver_data._field_data[current_size].resize(nval_cells*ncells);
1091 _solver_data._field_data[current_size+1].resize(nval_nodes*nnodes);
1092 _solver_data._stride_field.resize(2);
1093 _solver_data._stride_field[current_size] = nval_cells;
1094 _solver_data._stride_field[current_size+1] = nval_nodes;
1095 memcpy(&_solver_data._field_data[current_size][0],cell_data,
1096 sizeof(
double)*nval_cells*ncells);
1097 memcpy(&_solver_data._field_data[current_size+1][0],node_data,
1098 sizeof(
double)*nval_nodes*nnodes);
1106 list<unsigned int> snlist;
1107 vector<unsigned int>::iterator ci = _triconn.begin();
1108 while(ci != _triconn.end())
1109 snlist.push_back(*ci++);
1110 ci = _quadconn.begin();
1111 while(ci != _quadconn.end())
1112 snlist.push_back(*ci++);
1115 _nnodes = snlist.size();
1124 double *node_data,
int nval_nodes)
1126 _solver_data._string_data.push_back(wname);
1127 _solver_data._field_data.resize(2);
1128 unsigned int ncells = _triconn.size()/3 + _quadconn.size()/4;
1129 unsigned int nnodes = NNodes();
1131 *_out <<
"GEM_DomainBoundary(" << _id <<
")::SetSolverDataBlock: "
1132 <<
"Receiving data for " << nval_cells <<
" doubles on " << ncells
1133 <<
" cells and " << nval_nodes <<
" doubles on " << nnodes
1134 <<
" nodes." << std::endl;
1135 _solver_data._field_data[0].resize(nval_cells*ncells);
1136 _solver_data._field_data[1].resize(nval_nodes*nnodes);
1137 _solver_data._stride_field.resize(2);
1138 _solver_data._stride_field[0] = nval_cells;
1139 _solver_data._stride_field[1] = nval_nodes;
1140 memcpy(&_solver_data._field_data[0][0],cell_data,
1141 sizeof(
double)*nval_cells*ncells);
1142 memcpy(&_solver_data._field_data[1][0],node_data,
1143 sizeof(
double)*nval_nodes*nnodes);
1152 int nreal_cell = _tetconn.size()/4 + _prisconn.size()/6 +
1153 _pyrconn.size()/5 + _hexconn.size()/8 - (_ngtet + _ngpris +
1156 while(index < ncsend){
1158 if(!(csend[ind] <= nreal_cell)){
1160 *_out <<
"SEND CELL " << index <<
" is a ghost cell!!" << endl;
1163 if(!(csend[ind] > 0)){
1165 *_out <<
"SEND CELL " << index <<
" is zero or negative!" << endl;
1170 list<int> recvcell_list;
1171 while(index < ncrecv) {
1173 if(!(crecv[ind] > nreal_cell)){
1175 *_out <<
"RECV CELL " << index <<
" is a real cell!!" << endl;
1178 if(!(crecv[ind] > 0)){
1180 *_out <<
"RECV CELL " << index <<
" is zero or negative!" << endl;
1184 list<int>::iterator rci = recvcell_list.begin();
1185 while(rci != recvcell_list.end() && !duped){
1186 if(crecv[ind] == *rci++){
1188 *_out <<
"RECV CELL " << index
1189 <<
" is duplicated in the receive list!"
1195 recvcell_list.push_back(crecv[ind]);
1202 int nnrecv,
int ncsend,
int ncrecv,
1203 int *nshared,
int *nsend,
int *nrecv,
1204 int *csend,
int *crecv)
1208 *_out <<
"GEM_Mesh(" << _id <<
")::AddPartitionBoundary: "
1209 <<
"Adding Border with"
1210 <<
" partition " << rpid <<
"." << endl;
1214 if(!validate_comm_list(ncsend,ncrecv,csend,crecv)){
1216 *_out <<
"GEM_Mesh(" << _id <<
")::AddPartitionBoundary"
1217 <<
": Validation of "
1218 <<
"communication arrays failed, aborting." << endl;
1221 new_pb.
populate(rpid,nnshare,nnsend,nnrecv,ncsend,ncrecv,
1222 nshared,nsend,nrecv,csend,crecv);
1223 _pb.push_back(new_pb);
1228 int nquad,
int ngquad,
int *quads)
1230 assert(ntri >= ngtri && nquad >= ngquad);
1232 *_out <<
"GEM_Mesh(" << _id <<
")::AddDomainBoundary: "
1233 <<
"Adding domain boundary with"
1234 <<
" id " << db_id <<
"." << endl;
1244 while(indy < 3*ntri){
1245 assert(tris[indy] != 0);
1246 new_db.
_triconn[indy] = tris[indy];
1250 while(indy < 4*nquad){
1251 assert(quads[indy] != 0);
1256 unsigned int csize = _db.size();
1258 *_out <<
"GEM_Partition(" << _id <<
")::AddDomainBoundary: "
1259 <<
"DomainBoundary " << csize <<
" has (nodes,tri,gtri,quad,gquad)"
1260 <<
" = (" << new_db.
_nnodes <<
"," << ntri <<
"," << ngtri <<
","
1261 << nquad <<
"," << ngquad <<
")" << std::endl;
1262 _db.push_back(new_db);
1270 *_out <<
"GEM_Partition(" << _id <<
")::Debugging turned on\n";
1280 Ostr <<
"GEM_Partition(" << _id <<
")::SetNodalCoordinates "
1281 <<
" total nodes = " << nn <<
", " << ng <<
" ghosts.\n";
1282 *_out << Ostr.str();
1287 memcpy((
void *)&_nc[0],(
void *)data,3*nn*
sizeof(
double));
1294 *_out <<
"GEM_Partition(" << _id <<
")::SetVolumeElements "
1295 <<
" total cells = " << ncells <<
" of size " << npe
1296 <<
" of which " << ng <<
" are ghosts." << endl;
1298 unsigned int datasize = ncells*npe*
sizeof(int);
1299 assert(ncells >= ng);
1300 int ndatp = npe*ncells;
1301 for(
int ndat =0;ndat < ndatp;ndat++)
1302 assert(data[ndat] != 0);
1306 _tetconn.resize(4*ncells);
1307 dest = &_tetconn[0];
1311 _pyrconn.resize(5*ncells);
1312 dest = &_pyrconn[0];
1316 _prisconn.resize(6*ncells);
1317 dest = &_prisconn[0];
1321 _hexconn.resize(8*ncells);
1322 dest = &_hexconn[0];
1327 *_out <<
"GEM_Partition::Unknown volume element type. Aborting."
1331 memcpy(dest,data,datasize);
1361 unsigned int nborders = pb.size();
1362 _pb.resize(nborders);
1366 unsigned int border = 0;
1367 while(border < nborders){
1368 _pb[border]._rpart = pb[border]._rpart;
1369 _pb[border]._sendcells = pb[border]._sendcells;
1370 _pb[border]._recvcells = pb[border]._recvcells;
1371 _pb[border]._sharenodes = pb[border]._sharenodes;
1372 _pb[border]._sendnodes = pb[border]._sendnodes;
1373 _pb[border]._recvnodes = pb[border]._recvnodes;
1375 _pb[border]._out = pb[border]._out;
1387 std::vector<GEM_DomainBoundary> indb(_db);
1388 std::vector<GEM_DomainBoundary> &outdb = _db;
1391 list<unsigned int> local_patches;
1392 unsigned int partpatch = 0;
1393 unsigned int npartpatch = indb.size();
1394 while(partpatch < npartpatch)
1395 local_patches.push_back(bcmap[indb[partpatch++]._id]);
1396 local_patches.sort();
1397 local_patches.unique();
1398 unsigned int nlocal_patches = local_patches.size();
1400 *_out <<
"GEM_Partition(" << _id
1401 <<
")::MapDomainBoundaries: Local patches: " << endl
1402 <<
"GEM_Partition(" << _id <<
")::MapDomainBoundaries: ";
1403 list<unsigned int>::iterator pli = local_patches.begin();
1404 while(pli != local_patches.end())
1405 *_out << *pli++ <<
" ";
1410 outdb.resize(nlocal_patches);
1411 std::vector< list<unsigned int> > ppatch_list;
1412 ppatch_list.resize(nlocal_patches);
1417 unsigned int local_patch = 0;
1418 list<unsigned int>::iterator li = local_patches.begin();
1419 while(li != local_patches.end()){
1426 unsigned int local_tri_size = 0;
1427 unsigned int local_quad_size = 0;
1432 while(partpatch < npartpatch){
1434 unsigned int ggbpid = pp.
_id;
1435 unsigned int tdbid = bcmap[ggbpid];
1437 local_tri_size += pp.
_triconn.size()/3;
1439 local_quad_size += pp.
_quadconn.size()/4;
1441 ppatch_list[local_patch].push_back(partpatch);
1445 fp.
_triconn.resize(3*local_tri_size);
1455 while(local_patch < nlocal_patches){
1457 fp.
_out = indb[0]._out;
1458 unsigned int tri = 0;
1459 unsigned int gtri = 0;
1460 unsigned int quad = 0;
1461 unsigned int gquad = 0;
1464 li = ppatch_list[local_patch].begin();
1465 while(li != ppatch_list[local_patch].end()){
1467 unsigned int pptri = 0;
1468 unsigned int ppquad = 0;
1469 unsigned int ntri = pp.
_triconn.size()/3;
1470 unsigned int nrealtri = ntri - pp.
_ngtri;
1471 unsigned int nquad = pp.
_quadconn.size()/4;
1472 unsigned int nrealquad = nquad - pp.
_ngquad;
1473 while(ppquad < nquad){
1474 if(ppquad < nrealquad){
1491 while(pptri < ntri){
1492 if(pptri < nrealtri){
1527 *_out <<
"GEM_Partition::ResolveCellMapping: enter";
1528 unsigned int npb = _pb.size();
1533 unsigned int cell = 0;
1534 while(cell < nsend){
1540 while(cell < nrecv){
1546 *_out <<
"GEM_Partition(" << _id <<
")::ResolveCellMapping: exit";
void AddDomainBoundary(int db_id, int ntri, int ngtri, int *tris, int nquad, int ngquad, int *quads)
bool InitRoccomWindows(const std::string &wname)
void Create_com_surfsoln(const std::string &wname, const std::string &fname, std::vector< double > &fvec, unsigned int ncomp, const std::string &unit)
void MapDomainBoundaries(std::map< unsigned int, unsigned int > &bcmap)
void Create_com_pconn(std::vector< unsigned int > rpids, std::vector< std::vector< std::vector< unsigned int > > > &index_vectors, unsigned int &nreal, unsigned int &ng, std::vector< int > &pc)
void Create_com_volsoln(const std::string &fname, std::vector< double > &fvec, unsigned int ncomp, const std::string &unit)
void COM_delete_window(const char *wname)
std::vector< unsigned int > _recvnodes
std::vector< unsigned int > _sendcells
void COM_set_size(const char *wa_str, int pane_id, int size, int ng=0)
Set sizes of for a specific attribute.
This file contains the prototypes for Roccom API.
unsigned int NNodes(void)
**********************************************************************Rocstar Simulation Suite Illinois Rocstar LLC All rights reserved ****Illinois Rocstar LLC IL **www illinoisrocstar com **sales illinoisrocstar com WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **Arising OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE **********************************************************************INTERFACE SUBROUTINE ic
bool TRAIL_WriteWindow(const std::string &wname, const std::string &path, const std::string &twin, const std::string &tpath, double t, unsigned int id, MPI_Comm comm, std::ostream *=NULL)
real *8 function offset(vNorm, x2, y2, z2)
void AddParitionBoundary(int rpid, int nnshare, int nnsend, int nnrecv, int ncsend, int ncrecv, int *nshared, int *nsend, int *nrecv, int *csend, int *crecv)
bool validate_comm_list(int ncsend, int ncrecv, int *csend, int *crecv)
std::vector< unsigned int > _quadconn
int COM_get_attribute_handle(const char *waname)
void ResolveCellMapping(GEM_Partition &sp)
bool WriteRocstar(const std::string &, double t=0.0)
bool flip_elements(std::vector< unsigned int > &, unsigned int)
bool SetSolverDataBlock(const std::string &wname, double *cell_data, int nval_cells, double *node_data, int nval_nodes)
std::vector< unsigned int > _sharenodes
std::vector< unsigned int > _recvcells
std::vector< unsigned int > _sendnodes
bool CreatePconn(const std::string &wname)
bool AddSolverDataBlock(const std::string &wname, double *cell_data, int nval_cells, double *node_data, int nval_nodes)
unsigned int Elem2Cell(std::pair< unsigned int, unsigned int >)
void Register_com_volconn(const std::string &wname, int paneid, unsigned int nel, unsigned int ngel, std::vector< unsigned int > &conn, unsigned int esize, bool ghost_part=false)
std::vector< unsigned int > _triconn
bool PopulateSurfaceWindow(const std::string &wname)
std::string TRAIL_CWD(void)
void populate(int rpid, int nnshared, int nnsend, int nnrecv, int ncsend, int ncrecv, int *sharedn, int *sendn, int *recvn, int *sendc, int *recvc)
void COM_window_init_done(const char *w_str, int pane_changed=true)
void COM_new_window(const char *wname, MPI_Comm c=MPI_COMM_NULL)
bool Register_com_surfmesh(const std::string &wname)
bool ReadRocstar(const std::string &, double t=0.0)
bool SetSolverDataBlock(const std::string &wname, double *cell_data, int nval_cells, double *node_data, int nval_nodes)
void COM_set_array(const char *wa_str, int pane_id, void *addr, int strd=0, int cap=0)
Associates an array with an attribute for a specific pane.
void SetVolumeElements(int *data, int ncells, int ng, int npe)
std::pair< unsigned int, unsigned int > Cell2Elem(unsigned int)
void AddPconnSection(std::vector< unsigned int > rpids, std::vector< std::vector< unsigned int > > &indices, unsigned int §ion_size, std::vector< int > &pconn)
bool PopulateVolumeWindow(const std::string &wname)
void COM_new_attribute(const char *wa_str, const char loc, const int type, int ncomp, const char *unit)
Registering an attribute type.
void report_domain_boundaries()
void SetNodalCoordinates(double *data, int nn, int ng)
void PopulateSurfaceArrays(const std::vector< double > &, unsigned int)
void report_partition_boundaries()
bool PopulatePartitionBoundaries(std::vector< GEM_PartitionBoundary > &pb)
#define COM_EXTERN_MODULE(moduleName)