8 #include "Parameters.H"
16 std::cout <<
"Rocon::Error: Called without an input file." << std::endl;
19 std::string configfile(inp);
21 ConfigFile.open(configfile.c_str());
23 std::cout <<
"Rocon::Error: Could not open configuration file, "
24 << configfile << std::endl;
27 IRAD::Util::Parameters configparams;
28 configparams.ReadFromStream(ConfigFile);
30 std::string inpath(configparams.Param(
"constraint_surface"));
31 int verbosity = configparams.GetValue<
int>(
"verbosity");
36 if(!configparams.Param(
"transform_x").empty()){
37 _transform_x = configparams.GetValue<
double>(
"transform_x");
40 if(!configparams.Param(
"transform_y").empty()){
41 _transform_y = configparams.GetValue<
double>(
"transform_y");
44 if(!configparams.Param(
"transform_z").empty()){
45 _transform_z = configparams.GetValue<
double>(
"transform_z");
48 if(!configparams.Param(
"transform").empty()){
53 std::cout <<
"Rocon: Reading " << inpath << std::endl;
60 MPI_Comm comm_null = MPI_COMM_NULL;
61 std::string bufwin(
"bufwin");
76 for(
int i = 0;
i < number_of_points*3;
i++)
78 if(std::fabs(coords[
i]) < tol && (coords[i] != 0.0)){
89 for(
int i = 0;
i < number_of_points;
i++)
92 coords[
i*3 + 1] *= yfac;
93 coords[
i*3 + 2] *= zfac;
104 COM::Window *win =
const_cast<COM::Window*
>(pmesh->window());
105 this->
_comm = win->get_communicator();
107 else this->
_rank = 0;
110 double test_coords[21];
111 test_coords[0] = test_coords[1] = test_coords[2] = 0.0;
112 test_coords[3] = test_coords[7] = 1.0;
113 test_coords[4] = test_coords[5] = test_coords[8] = 0.0;
114 test_coords[6] = 0.5;
115 test_coords[9] = test_coords[11] = test_coords[14] = 0.0;
116 test_coords[10] = test_coords[12] = test_coords[13] = 1.0;
117 test_coords[15] = test_coords[18] = test_coords[19] = 0.0;
118 test_coords[16] = 1.0;
119 test_coords[17] = test_coords[20] = -1.0;
120 double test_point[3];
121 test_point[0] = test_point[1] = 0.5;
124 test_disp[0] = test_disp[1] = 0.0;
142 double test_position[3];
144 testmbs.
initialize(test_coords,test_conn,7,5,1);
146 std::cout <<
"Rocon> Passed the test, found <" << test_position[0] <<
","
147 << test_position[1] <<
"," << test_position[2] <<
" >" << std::endl;
149 std::cout <<
"Rocon> FAILED THE TEST" << std::endl;
158 int *connectivity = NULL;
159 double *nodal_coordinates = NULL;
160 std::vector<int> pane_ids;
165 "Failed to extract coordinates from input.");
168 "Failed to extract surface triangles from input.");
169 int number_of_divisions = *ndiv;
170 int number_of_nodes = 0;
171 int number_of_elements = 0;
172 COM_get_size(
"tempwin.nc", pane_ids[0],&number_of_nodes);
173 COM_get_size(
"tempwin.:t3:real", pane_ids[0],&number_of_elements);
176 std::cout <<
"Rocon> Transforming coordinates" << std::endl;
181 std::cout <<
"Rocon> Checking input coordinates. " << std::endl;
186 for(
int i = 0;
i < number_of_elements*3;
i++)
187 connectivity[
i] -= 1;
189 this->
_mbs->
initialize(nodal_coordinates,connectivity,number_of_nodes,
190 number_of_elements,number_of_divisions);
192 std::cout <<
"Rocon> Initialized constraint surface with "
193 << number_of_nodes <<
" nodes and "
194 << number_of_elements <<
" triangles. (ndiv = "
195 << *ndiv <<
")" << std::endl;
197 double test_point[6];
198 test_point[0] = test_point[1] = 0.0;
199 test_point[2] = 0.0599999999999;
200 test_point[3] = test_point[4] = 0.0;
201 test_point[5] = 0.06;
203 test_disp[0] = test_disp[1] = 0.0;
208 double test_position[3];
210 std::cout <<
"Rocon> Passed the test2, found <" << test_position[0] <<
","
211 << test_position[1] <<
"," << test_position[2] <<
" >" << std::endl;
213 std::cout <<
"Rocon> FAILED THE TEST 2" << std::endl;
216 std::cout <<
"Rocon> Passed the test3, found <" << test_position[0] <<
","
217 << test_position[1] <<
"," << test_position[2] <<
" >" << std::endl;
219 std::cout <<
"Rocon> FAILED THE TEST 3" << std::endl;
228 const COM::Attribute *cflag,
229 COM::Attribute *bflag)
236 COM::Window *meshwin =
const_cast<COM::Window*
>(pmesh->window());
237 COM::Window *cflagwin =
const_cast<COM::Window*
>(cflag->window());
238 COM::Window *bflagwin =
const_cast<COM::Window*
>(bflag->window());
240 std::string meshwinname(meshwin->name());
241 std::string cflagwinname(cflagwin->name());
242 std::string bflagwinname(bflagwin->name());
244 std::string cflagname(cflag->name());
245 std::string bflagname(bflag->name());
247 unsigned int number_of_panes = 0;
248 std::vector<int> pane_ids;
250 number_of_panes = pane_ids.size();
251 int total_burned_out = 0;
252 int local_burned_out = 0;
257 std::vector<int>::iterator pii = pane_ids.begin();
258 while(pii != pane_ids.end()){
259 int pane_id = *pii++;
263 COM_get_array((cflagwinname+
".bcflag").c_str(),pane_id,&bcflag);
265 if(*bcflag == 0 || *bcflag == 2){
266 int *constrained = NULL;
267 COM_get_array((cflagwinname+
"."+cflagname).c_str(),pane_id,&constrained);
269 COM_get_size((cflagwinname+
"."+cflagname).c_str(),pane_id,&nreal,&nghost);
271 for(
int i = 0;
i < nreal;
i++)
278 pii = pane_ids.begin();
280 while(pii != pane_ids.end()){
281 int *connectivity = NULL;
282 int *constrained = NULL;
286 int pane_id = *pii++;
287 COM_get_array((cflagwinname+
"."+cflagname).c_str(),pane_id,&constrained);
288 if(constrained == NULL){
290 std::cout <<
"Rocon> Skipping pane " << pane_id
291 <<
" which has no cflag array."
296 int bflag_ghosts = 0;
297 int bflag_stride = 0;
301 &burning,&bflag_stride,&bflag_cap);
304 bool burning_pane = (burning != NULL);
315 COM_get_size((bflagwinname+
"."+bflagname).c_str(),pane_id,
316 &bflag_size,&bflag_ghosts);
319 COM_get_size((cflagwinname+
".nc").c_str(),pane_id,&nreal,&nghost);
321 std::cout <<
"Rocon> Burning out window " << cflagwinname
322 <<
" with " << nghost <<
" ghost nodes." << std::endl
323 <<
"Rocon> Bflag stats: size = " << bflag_size
324 <<
", nghosts = " << bflag_ghosts
325 <<
", stride = " << bflag_stride <<
", cap = "
326 << bflag_cap << std::endl;
329 int nreal_nodes = nreal-nghost;
330 int nghost_nodes = nghost;
333 COM_get_size((cflagwinname+
".conn").c_str(),pane_id,&nreal,&nghost);
334 if(nghost > 0 && !
_rank){
335 std::cout <<
"Rocon> Burning out window " << cflagwinname <<
" with "
336 << nghost <<
" ghost elements." << std::endl;
339 int nreal_elem = nreal - nghost;
340 int nghost_elem = nghost;
343 std::cout <<
"Rocon> Empty pane " << pane_id <<
" on window "
344 << cflagwinname <<
"." << std::endl;
349 std::string connNames;
351 &nmeshtypes, connNames);
353 const int* dims = NULL;
354 char elemType =
'\0';
357 if (nmeshtypes == 1 && (connNames.find(
":st") != std::string::npos))
361 std::cout <<
"Rocon> Processing block structured mesh."
364 COM_get_size((cflagwinname+
"."+connNames).c_str(), pane_id,
366 COM_get_array_const((cflagwinname+
"."+connNames).c_str(),
369 int nghost_layers = nghost;
372 std::cout <<
"Rocon> Conn size (dimension,ghost) = ("
373 << ndims <<
"," << nghost_layers << std::endl
375 for(
int i = 0;
i < ndims;
i++){
376 std::cout << dims[
i];
380 std::cout << std::endl;
382 std::vector<Mesh::IndexType> flat_extent(6,0);
383 for(
int i = 0;
i < ndims;
i++){
384 flat_extent[
i*2] = 1;
385 flat_extent[
i*2+1] = dims[
i];
387 for(
int i = 0;
i < 6;
i++)
388 if(flat_extent[
i] == 0)
393 std::cout <<
"Rocon> Pane Connectivity has " << pane_conn.
Nelem()
394 <<
" elements of size " << pane_conn.
Esize(1) << std::endl
395 <<
"Rocon> First elem: (" << pane_conn.
Node(1,1) <<
","
396 << pane_conn.
Node(1,2) <<
"," << pane_conn.
Node(1,3) <<
","
397 << pane_conn.
Node(1,4) <<
")" << std::endl;
403 std::cout <<
"Rocon> Processing unstructured mesh" << std::endl;
405 std::istringstream Istr(connNames);
407 int nnodes_per_element;
408 while(Istr >> ucname){
414 std::string fullname(cflagwinname +
"." + ucname);
418 std::cout <<
"Rocon> Found connectivity " << ucname
419 <<
" for pane " << pane_id
420 <<
", with size: " << nelem <<
", and "
421 << nghost <<
" ghosts. Stride = "
422 << stride <<
", and cap = " << cap << std::endl;
424 if(ucname.find(
"t3") != std::string::npos)
426 else if(ucname.find(
"t6") != std::string::npos)
428 else if(ucname.find(
"q4") != std::string::npos)
430 else if(ucname.find(
"q8") != std::string::npos)
432 else if(ucname.find(
"q9") != std::string::npos)
435 std::string msg(
"Rocon> Unknown connectivity type: "+ucname);
440 for(
int j = 0;
j < nelem;
j++){
441 std::vector<Mesh::IndexType> new_element(npe,0);
443 for(
int k = 0;
k < npe;
k++)
444 new_element.push_back(conn[
j*npe+
k]);
446 for(
int k = 0;
k < npe;
k++)
447 new_element.push_back(conn[
j+
k*stride]);
455 for(
int j = 0;
j < pane_conn.
Nelem();
j++){
456 std::vector<Mesh::IndexType>::iterator ei = pane_conn[
j].begin();
457 bool all_burned_out =
true;
458 while(ei != pane_conn[
j].end() && all_burned_out)
459 if(constrained[*ei++-1] == 0)
460 all_burned_out =
false;
469 for(
int j = 0;
j < pane_conn.
Nelem();
j++){
470 std::vector<Mesh::IndexType>::iterator ei = pane_conn[
j].begin();
471 while(ei != pane_conn[
j].end())
472 constrained[*ei++-1] = 1;
476 MPI_Reduce(&local_burned_out,&total_burned_out,
479 std::cout <<
"Rocon> Burned out " << total_burned_out <<
" elements."
492 COM::Attribute *target)
498 COM::Window *targwin =
const_cast<COM::Window*
>(target->window());
499 COM::Window *bflagwin =
const_cast<COM::Window*
>(bflag->window());
501 std::string targwinname(targwin->name());
502 std::string bflagwinname(bflagwin->name());
504 std::string targname(target->name());
505 std::string bflagname(bflag->name());
507 unsigned int number_of_panes = 0;
508 std::vector<int> pane_ids;
510 number_of_panes = pane_ids.size();
511 int local_nfiltered = 0;
512 int global_nfiltered = 0;
513 std::vector<int>::iterator pii = pane_ids.begin();
514 while(pii != pane_ids.end()){
519 int bflag_ghosts = 0;
521 int pane_id = *pii++;
522 COM_get_array((bflagwinname+
"."+bflagname).c_str(),pane_id,&burning);
523 COM_get_array((targwinname+
"."+targname).c_str(),pane_id,&targ);
525 COM_get_size((bflagwinname+
"."+bflagname).c_str(),pane_id,
526 &bflag_size,&bflag_ghosts);
527 COM_get_size((targwinname+
"."+targname).c_str(),pane_id,
528 &targ_size,&targ_ghosts);
529 assert(targ_size == bflag_size);
531 std::cout <<
"Rocon> Burning out " << targname <<
" on "
532 << targwinname << std::endl
533 <<
"Rocon> Target stats: size = " << targ_size
534 <<
", nghosts = " << targ_ghosts << std::endl;
536 for(
int i = 0;
i < targ_size;
i++)
543 MPI_Reduce(&local_nfiltered,&global_nfiltered,
546 std::cout <<
"Rocon> Burnout filtered " << global_nfiltered <<
" elements."
558 const COM::Attribute *disp,
560 COM::Attribute *constr)
567 COM::Window *meshwin =
const_cast<COM::Window*
>(pmesh->window());
568 COM::Window *dispwin =
const_cast<COM::Window*
>(disp->window());
569 COM::Window *poswin =
const_cast<COM::Window*
>(pos->window());
570 COM::Window *conwin =
const_cast<COM::Window*
>(constr->window());
572 std::string meshwinname(meshwin->name());
573 std::string dispwinname(dispwin->name());
574 std::string poswinname(poswin->name());
575 std::string conwinname(conwin->name());
577 std::string dispname(disp->name());
578 std::string posname(pos->name());
579 std::string conname(constr->name());
581 unsigned int number_of_panes = 0;
582 std::vector<int> pane_ids;
584 number_of_panes = pane_ids.size();
586 std::vector<int> paneids;
589 "Number of panes must match.");
592 "Number of panes must match.");
595 "Number of panes must match.");
597 std::vector<int>::iterator pii = pane_ids.begin();
598 int local_number_constrained = 0;
599 int local_number_checked = 0;
600 int global_number_constrained = 0;
601 int global_number_checked = 0;
602 while(pii != pane_ids.end()){
603 double *original_coordinates = NULL;
604 double *displacements = NULL;
605 double *positions = NULL;
606 int *constrained = NULL;
607 int number_of_nodes = 0;
609 int pane_id = *pii++;
610 COM_get_array((meshwinname+
".nc").c_str(),pane_id,&original_coordinates);
611 COM_get_size((meshwinname+
".nc"),pane_id,&number_of_nodes,&nghost);
613 number_of_nodes -= nghost;
618 COM_get_array((dispwinname+
"."+dispname).c_str(),pane_id,&displacements);
619 COM_get_array((poswinname+
"."+posname).c_str(),pane_id,&positions);
620 COM_get_array((conwinname+
"."+conname).c_str(),pane_id,&constrained);
622 std::cout <<
"Rocon> Skipping pane " << pane_id <<
" for no cflag." << std::endl;
624 if((constrained != NULL) && (number_of_nodes > 0)){
629 int *burning_flag = NULL;
631 COM_get_array((conwinname+
".bflag").c_str(),pane_id,&burning_flag);
637 bool pane_is_burning = (burning_flag != NULL);
639 local_number_checked += number_of_nodes;
640 for(
int i = 0;
i < number_of_nodes;
i++){
648 point[0] = original_coordinates[
i*3] - displacements[
i*3];
649 point[1] = original_coordinates[
i*3+1] - displacements[
i*3+1];
650 point[2] = original_coordinates[
i*3+2] - displacements[
i*3+2];
651 disp[0] = 2.0*displacements[
i*3];
652 disp[1] = 2.0*displacements[
i*3+1];
653 disp[2] = 2.0*displacements[
i*3+2];
663 local_number_constrained++;
667 positions[i*3] = original_coordinates[i*3] + displacements[i*3];
668 positions[i*3+1] = original_coordinates[i*3+1] + displacements[i*3+1];
669 positions[i*3+2] = original_coordinates[i*3+2] + displacements[i*3+2];
689 this->
_comm = meshwin->get_communicator();
691 else this->
_rank = 0;
692 MPI_Reduce(&local_number_constrained,&global_number_constrained,
694 MPI_Reduce(&local_number_checked,&global_number_checked,
697 std::cout <<
"Rocon> Checked " << global_number_checked
698 <<
" nodes." << std::endl;
699 std::cout <<
"Rocon> Found " << global_number_constrained
700 <<
" intersections." << std::endl;
707 COM::Attribute *disp,
708 const COM::Attribute *pos,
709 const COM::Attribute *constr)
716 COM::Window *meshwin =
const_cast<COM::Window*
>(pmesh->window());
717 COM::Window *dispwin =
const_cast<COM::Window*
>(disp->window());
718 COM::Window *poswin =
const_cast<COM::Window*
>(pos->window());
719 COM::Window *conwin =
const_cast<COM::Window*
>(constr->window());
721 std::string meshwinname(meshwin->name());
722 std::string dispwinname(dispwin->name());
723 std::string poswinname(poswin->name());
724 std::string conwinname(conwin->name());
726 std::string dispname(disp->name());
727 std::string posname(pos->name());
728 std::string conname(constr->name());
730 unsigned int number_of_panes = 0;
731 std::vector<int> pane_ids;
733 number_of_panes = pane_ids.size();
735 std::vector<int> paneids;
738 "Number of panes must match.");
741 "Number of panes must match.");
744 "Number of panes must match.");
746 std::vector<int>::iterator pii = pane_ids.begin();
747 int local_number_checked = 0;
748 int global_number_checked = 0;
749 int local_number_constrained = 0;
750 int global_number_constrained = 0;
751 while(pii != pane_ids.end()){
752 double *original_coordinates = NULL;
753 double *displacements = NULL;
754 double *positions = NULL;
755 int *constrained = NULL;
756 int number_of_nodes = 0;
758 int pane_id = *pii++;
759 COM_get_array((meshwinname+
".nc").c_str(),pane_id,&original_coordinates);
760 COM_get_size((meshwinname+
".nc"),pane_id,&number_of_nodes,&nghost);
762 number_of_nodes -= nghost;
763 COM_get_array((dispwinname+
"."+dispname).c_str(),pane_id,&displacements);
764 COM_get_array((poswinname +
"."+posname).c_str(),pane_id,&positions);
765 COM_get_array((conwinname +
"."+conname).c_str(),pane_id,&constrained);
766 if((constrained != NULL) && (number_of_nodes > 0)){
767 int *burning_flag = NULL;
769 COM_get_array((conwinname+
".bflag").c_str(),pane_id,&burning_flag);
771 bool pane_is_burning = (burning_flag != NULL);
776 local_number_checked += number_of_nodes;
777 for(
int i = 0;
i < number_of_nodes;
i++){
778 if(constrained[
i] == 1){
779 local_number_constrained++;
780 displacements[
i*3] = positions[
i*3] - original_coordinates[
i*3];
781 displacements[
i*3+1] = positions[
i*3+1] - original_coordinates[
i*3+1];
782 displacements[
i*3+2] = positions[
i*3+2] - original_coordinates[
i*3+2];
787 if(std::fabs(displacements[
i*3]) <= this->
_TOL)
788 displacements[i*3] = 0;
789 if(std::fabs(displacements[i*3+1]) <= this->
_TOL)
790 displacements[i*3+1] = 0;
791 if(std::fabs(displacements[i*3+2]) <= this->
_TOL)
792 displacements[i*3+2] = 0;
798 this->
_comm = meshwin->get_communicator();
800 else this->
_rank = 0;
801 MPI_Reduce(&local_number_constrained,&global_number_constrained,
804 std::cout <<
"Rocon> Constrained " << global_number_constrained
805 <<
" nodes." << std::endl;
818 std::string glb=mname+
".global";
829 glb.c_str(),
"bii", types);
834 glb.c_str(),
"bii", types);
839 glb.c_str(),
"biiob", types);
842 glb.c_str(),
"bibii", types);
846 glb.c_str(),
"biib", types);
850 glb.c_str(),
"bib", types);
858 std::string glb=mname+
".global";
int COMMPI_Comm_rank(MPI_Comm c)
void find_intersections(const COM::Attribute *pmesh, const COM::Attribute *disp, COM::Attribute *pos, COM::Attribute *constr)
Displace the points in pmesh by disp and calcuate the intersections (if any) with the constraint mesh...
int COM_Type
Indices for derived data types.
void AddElement(const std::vector< IndexType > &elem)
General connectivity object.
void rocon_load_module_(const char *name, long int length)
void init_from_file(const char *inp, const int *ndiv)
Initialize Rocon from the given file.
void COM_delete_window(const char *wname)
void CreateUnstructuredMesh(Connectivity &conn)
#define COM_assertion_msg(EX, msg)
static void unload(const std::string &mname)
void Rocon_unload_module(const char *name)
void constrain_displacements(const COM::Attribute *pmesh, COM::Attribute *disp, const COM::Attribute *pos, const COM::Attribute *constr)
Constrain the displacements, disp, to the appropriate positions, pos.
void ROCON_LOAD_MODULE(const char *name, long int length)
void ROCON_LOAD_MODULE_(const char *name, long int length)
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.
void CheckCoordinates(double *coords, int number_of_points, double tol)
void COM_set_object(const char *wa_str, int pane_id, Type *addr)
int COM_get_attribute_handle(const char *waname)
void ROCON_UNLOAD_MODULE(const char *name, long int length)
void COM_get_connectivities(const char *wname, int pane_id, int *nc, std::string &names)
double length(Vector3D *const v, int n)
void COM_get_object(const char *wa_str, int pane_id, Type **addr)
std::string & WindowName()
void burnout_filter(const COM::Attribute *bflag, COM::Attribute *target)
Sets target = 0 for every burning pane element on which bflag = 0.
#define COM_UNLOAD_MODULE_STATIC_DYNAMIC(moduleName, windowString)
void rocon_unload_module(const char *name, long int length)
IndexType & Node(IndexType e, IndexType n)
void initialize(double *nodes, int *triangles, unsigned int nv, unsigned int nt, int divisions=50)
IndexType Esize(IndexType n) const
void Rocon_load_module(const char *name)
void COM_window_init_done(const char *w_str, int pane_changed=true)
void COM_get_size(const char *wa_str, int pane_id, int *size, int *ng=0)
Get the sizes of an attribute.
Rocon()
Default constructor.
void COM_clone_attribute(const char *wname, const char *attr, int wg=1, const char *ptnname=0, int val=0)
Clone the subset of panes of another window of which the given pane attribute has value val...
void rocon_unload_module_(const char *name, long int length)
void COM_new_window(const char *wname, MPI_Comm c=MPI_COMM_NULL)
void COM_call_function(const int wf, int argc,...)
void burnout(const COM::Attribute *pmesh, const COM::Attribute *cflag, COM::Attribute *bflag)
Sets bflag = 0 for every element for which every node's cflag = 1.
bool intersection(const Vec3D &p, const Vec3D &d, Vec3D &x)
void ROCON_UNLOAD_MODULE_(const char *name, long int length)
static void load(const std::string &mname)
void COM_new_attribute(const char *wa_str, const char loc, const int type, int ncomp, const char *unit)
Registering an attribute type.
void COM_get_panes(const char *wname, std::vector< int > &pane_ids, int rank=-2)
void COM_set_member_function(const char *wf_str, Member_func_ptr func, const char *wa_str, const char *intents, const COM_Type *types)
void initialize(const COM::Attribute *pmesh, const int *ndiv)
Initialize Rocon with given mesh.
void rocon_load_module(const char *name, long int length)
void TransformCoordinates(double *coords, int number_of_points, double xfac, double yfac, double zfac)
Simple Block Structured Mesh object.
#define COM_LOAD_MODULE_STATIC_DYNAMIC(moduleName, windowString)
int COM_get_function_handle(const char *wfname)
here we put it at the!beginning of the common block The point to point and collective!routines know about but MPI_TYPE_STRUCT as yet does not!MPI_STATUS_IGNORE and MPI_STATUSES_IGNORE are similar objects!Until the underlying MPI library implements the C version of these are declared as arrays of MPI_STATUS_SIZE!The types and are OPTIONAL!Their values are zero if they are not available Note that!using these reduces the portability of MPI_IO INTEGER MPI_BOTTOM INTEGER MPI_DOUBLE_PRECISION INTEGER MPI_LOGICAL INTEGER MPI_2REAL INTEGER MPI_2DOUBLE_COMPLEX INTEGER MPI_LB INTEGER MPI_WTIME_IS_GLOBAL INTEGER MPI_GROUP_EMPTY INTEGER MPI_SUM
#define COM_EXTERN_MODULE(moduleName)