97 std::cout <<
"Please enter the file name without the file extension '.xda': ";
99 std::cin >> input_filename;
102 std::cout <<
"\n\nEnter the (uniform) wall thickness ";
103 double wall_thickness;
104 std::cin >> wall_thickness;
107 std::cout <<
"\n\nDo you want to create a separate ID for each planar facet\n"
108 <<
"on the fluid-structure interaction boundary?"
109 <<
"\n" <<
"Enter y or n: ";
110 char multi_boundary_ids_marker;
111 std::cin >> multi_boundary_ids_marker;
112 bool do_multi_boundary_ids=
true;
113 if(multi_boundary_ids_marker==
'n') do_multi_boundary_ids=
false;
121 xda_file_name=input_filename+
".xda";
124 fluid_surface_file=
"fluid_"+input_filename+
".poly";
127 solid_surface_file=
"solid_"+input_filename+
".poly";
132 std::ifstream infile(xda_file_name.c_str(),std::ios_base::in);
135 unsigned nbound_cond;
141 infile.getline(dummy, 100);
147 infile.getline(dummy, 100);
153 infile.getline(dummy, 100);
156 infile.getline(dummy, 100);
162 while (dummy[0]!=
'T') {infile.getline(dummy, 100);}
167 getline(infile,
line);
168 istringstream ostr(
line);
169 istream_iterator<string> it(ostr);
170 istream_iterator<string>
end;
171 unsigned nnod_el = 0;
175 first_node.push_back(atoi((*it).c_str()));
179 oomph_info <<
"Number of nodes per element: " << nnod_el << std::endl;
188 cout <<
"First nodes: " << std::endl;
189 for(
unsigned j=0;
j<nnod_el;
j++)
191 global_node[
k]=first_node[
k];
192 cout << first_node[
k] <<
" ";
198 for(
unsigned i=1;
i<n_element;
i++)
200 for(
unsigned j=0;
j<nnod_el;
j++)
202 infile >> global_node[
k];
205 infile.getline(dummy, 100);
215 for(
unsigned i=0;
i<n_node;
i++)
223 std::vector<bool> done_for_fluid(n_node,
false);
224 std::vector<bool> done_for_solid(n_node,
false);
228 std::map<unsigned,unsigned> fluid_node_nmbr;
234 std::map<unsigned,unsigned> solid_inner_node_nmbr;
235 std::map<unsigned,unsigned> solid_outer_node_nmbr;
250 unsigned n_solid_node=0;
253 unsigned n_fluid_node=0;
257 std::map<unsigned, double> x_outer_node;
258 std::map<unsigned, double> y_outer_node;
259 std::map<unsigned, double> z_outer_node;
260 std::map<unsigned,Vector<double> > normal_for_outer_wall;
281 std::set<unsigned> quadratic_fsi_boundary_nodes;
287 unsigned element_nmbr;
290 for(
unsigned i=0;
i<nbound_cond;
i++)
294 infile>> element_nmbr ;
303 if(bound_id!=1 && bound_id!=2 && bound_id!=3 && bound_id!=4 )
305 std::ostringstream error_stream;
306 error_stream <<
"bound_id=" << bound_id
307 <<
". This function only takes xda type meshes with"
308 <<
" one inflow (boundary 2) and two outflows (boundaries 3"
309 <<
" and 4); the FSI interface must have the id 1. Your"
310 <<
" input file contains a boundary with id : "
312 <<
"Don't panic, there are only few things to change"
313 <<
" in this well commented code, good luck ;) \n";
330 side_node[0]=global_node[nnod_el*element_nmbr+1];
331 side_node[1]=global_node[nnod_el*element_nmbr];
332 side_node[2]=global_node[nnod_el*element_nmbr+2];
333 side_node[3]=global_node[nnod_el*element_nmbr+4];
334 side_node[4]=global_node[nnod_el*element_nmbr+6];
335 side_node[5]=global_node[nnod_el*element_nmbr+5];
339 side_node[0]=global_node[nnod_el*element_nmbr];
340 side_node[1]=global_node[nnod_el*element_nmbr+1];
341 side_node[2]=global_node[nnod_el*element_nmbr+3];
342 side_node[3]=global_node[nnod_el*element_nmbr+4];
343 side_node[4]=global_node[nnod_el*element_nmbr+8];
344 side_node[5]=global_node[nnod_el*element_nmbr+7];
348 side_node[0]=global_node[nnod_el*element_nmbr+1];
349 side_node[1]=global_node[nnod_el*element_nmbr+2];
350 side_node[2]=global_node[nnod_el*element_nmbr+3];
351 side_node[3]=global_node[nnod_el*element_nmbr+5];
352 side_node[4]=global_node[nnod_el*element_nmbr+9];
353 side_node[5]=global_node[nnod_el*element_nmbr+8];
357 side_node[0]=global_node[nnod_el*element_nmbr+2];
358 side_node[1]=global_node[nnod_el*element_nmbr];
359 side_node[2]=global_node[nnod_el*element_nmbr+3];
360 side_node[3]=global_node[nnod_el*element_nmbr+6];
361 side_node[4]=global_node[nnod_el*element_nmbr+7];
362 side_node[5]=global_node[nnod_el*element_nmbr+9];
367 "Unexcpected side number in your '.xda' input file\n",
381 quadratic_fsi_boundary_nodes.insert(side_node[0]);
382 quadratic_fsi_boundary_nodes.insert(side_node[1]);
383 quadratic_fsi_boundary_nodes.insert(side_node[2]);
384 quadratic_fsi_boundary_nodes.insert(side_node[3]);
385 quadratic_fsi_boundary_nodes.insert(side_node[4]);
386 quadratic_fsi_boundary_nodes.insert(side_node[5]);
390 quadratic_nodes[0]=side_node[0];
391 quadratic_nodes[1]=side_node[1];
392 quadratic_nodes[2]=side_node[2];
393 quadratic_nodes[3]=side_node[3];
394 quadratic_nodes[4]=side_node[4];
395 quadratic_nodes[5]=side_node[5];
396 quadratic_fsi_boundary_face_element_nodes.push_back(quadratic_nodes);
399 double x1=x_node[side_node[0] ];
400 double x2=x_node[side_node[1] ];
401 double x3=x_node[side_node[2] ];
403 double y1=y_node[side_node[0] ];
404 double y2=y_node[side_node[1] ];
405 double y3=y_node[side_node[2] ];
407 double z1=z_node[side_node[0] ];
408 double z2=z_node[side_node[1] ];
409 double z3=z_node[side_node[2] ];
412 normal[0] =(y2-y1)*(z3-z1) - (z2-z1)*(y3-y1);
420 for(
unsigned idim=0; idim<3; idim++)
426 for(
unsigned ii=0; ii<6; ii++)
429 unsigned inod=side_node[ii];
435 if(!done_for_fluid[inod])
437 done_for_fluid[inod]=
true;
446 if(!done_for_solid[inod])
448 done_for_solid[inod]=
true;
449 normal_for_outer_wall[inod].resize(3);
458 x_outer_node[inod]= x_node[inod];
459 y_outer_node[inod]= y_node[inod];
460 z_outer_node[inod]= z_node[inod];
462 normal_for_outer_wall[inod][0]+=
normal[0];
463 normal_for_outer_wall[inod][1]+=
normal[1];
464 normal_for_outer_wall[inod][2]+=
normal[2];
471 for(
unsigned ii=0;ii<3; ii++)
473 fluid_faces[0][nfluid_face[0]-1][ii]=side_node[ii];
482 for(
unsigned ii=0; ii<3; ii++)
485 unsigned inod=side_node[ii];
488 if(!done_for_fluid[inod])
490 done_for_fluid[inod]=
true;
497 nfluid_face[bound_id-1]++;
500 for(
unsigned ii=0;ii<3; ii++)
502 fluid_faces[bound_id-1][nfluid_face[bound_id-1]-1][ii]=side_node[ii];
513 for(
unsigned i=0;
i<4;
i++)
515 fluid_faces[
i].resize(nfluid_face[
i]);
521 normal_for_outer_wall.begin();
522 it!=normal_for_outer_wall.end();it++)
525 for (
unsigned i=0;
i<3;
i++)
527 sum+=
pow((*it).second[
i],2);
529 for (
unsigned i=0;
i<3;
i++)
531 (*it).second[
i]/=
sqrt(sum);
537 unsigned nquadratic_nodes=quadratic_fsi_boundary_nodes.size();
540 filename=input_filename+
"_quadratic_fsi_boundary.dat";
541 std::ofstream quadratic_fsi_boundary_file(
filename.c_str());
542 quadratic_fsi_boundary_file << nquadratic_nodes
543 <<
" # number of quadratic FSI nodes\n";
544 quadratic_fsi_boundary_file << quadratic_fsi_boundary_face_element_nodes.size()
545 <<
" # number of FSI facets\n";
546 for (std::set<unsigned>::iterator it=quadratic_fsi_boundary_nodes.begin();
547 it!=quadratic_fsi_boundary_nodes.end();it++)
549 quadratic_fsi_boundary_file << x_node[*it] <<
" "
550 << y_node[*it] <<
" "
551 << z_node[*it] <<
" "
557 quadratic_fsi_boundary_face_element_nodes.begin();
558 it!=quadratic_fsi_boundary_face_element_nodes.end();it++)
560 quadratic_fsi_boundary_file << (*it)[0] <<
" "
565 << (*it)[5] <<
" " << std::endl;
567 quadratic_fsi_boundary_file.close();
573 filename=input_filename+
"_quadratic_outer_solid_boundary.dat";
574 std::ofstream quadratic_outer_solid_boundary_file(
filename.c_str());
575 quadratic_outer_solid_boundary_file
577 <<
" # number of quadratic nodes on outer solid boundary\n";
578 quadratic_outer_solid_boundary_file
579 << quadratic_fsi_boundary_face_element_nodes.size()
580 <<
" # number of facets on outer solid boundary\n";
581 for (std::set<unsigned>::iterator it=
582 quadratic_fsi_boundary_nodes.begin();
583 it!=quadratic_fsi_boundary_nodes.end();it++)
585 quadratic_outer_solid_boundary_file
586 << x_outer_node[*it]+wall_thickness*normal_for_outer_wall[*it][0] <<
" "
587 << y_outer_node[*it]+wall_thickness*normal_for_outer_wall[*it][1] <<
" "
588 << z_outer_node[*it]+wall_thickness*normal_for_outer_wall[*it][2] <<
" "
594 quadratic_fsi_boundary_face_element_nodes.begin();
595 it!=quadratic_fsi_boundary_face_element_nodes.end();it++)
597 quadratic_outer_solid_boundary_file << (*it)[0] <<
" "
602 << (*it)[5] <<
" " << std::endl;
604 quadratic_outer_solid_boundary_file.close();
613 std::ofstream fluid_output_stream(fluid_surface_file.c_str(),
std::ios::out);
614 fluid_output_stream <<
"# This poly file was created from a"
615 <<
" VMTK mesh." <<
'\n'
616 <<
"# VMTK assigns for the front inflow "
617 <<
"face the boundary id 2, the left " <<
'\n'
618 <<
"# bifurcation face the id 3, the right"
619 <<
" bifurcation face the id 4 and for the other"
620 <<
" boundaries (FSI interface) the id 1 " <<
'\n'
621 <<
"# Oomph-lib's meshes need distinct ids "
622 <<
"for each planar facet, so we assign new boundary ids."
624 <<
"# The relation between old and new ids is listed"
625 <<
" at the end of this file.\n";
627 std::ofstream solid_output_stream(solid_surface_file.c_str(),
std::ios::out);
628 solid_output_stream <<
"# This poly file was created from the fluid vmtk "
629 <<
" mesh assuming constant wall thickness.\n"
630 <<
"# Oomph-lib's meshes need distinct "
631 <<
"ids for each planar facet so we assign new \n"
632 <<
"# boundary ids. The relation between old and new "
633 <<
" ids is listed at the end of this file.\n";
638 fluid_output_stream <<
'\n' <<
"# Node list : " <<
'\n';
641 fluid_output_stream << n_fluid_node <<
' ' << 3 <<
' ' << 0
642 <<
' ' << 1 <<
'\n'<<
'\n';
645 std::vector<bool> done_fluid_node(n_node,
false);
649 for(
unsigned i=0;
i<4;
i++)
652 unsigned nface=nfluid_face[
i];
655 for(
unsigned iface=0; iface<nface; iface++)
662 for(
unsigned ii=0; ii<3; ii++)
665 unsigned inod=(*face_node)[ii];
668 if(!done_fluid_node[inod])
670 done_fluid_node[inod]=
true;
674 fluid_node_nmbr[inod]=counter;
677 fluid_output_stream << counter <<
' '
678 << x_node[inod] <<
' '
679 << y_node[inod] <<
' '
680 << z_node[inod] <<
' '
690 solid_output_stream <<
'\n' <<
"# Node list : " <<
'\n';
693 solid_output_stream << n_solid_node <<
' ' << 3 <<
' ' << 0
694 <<
' ' << 1 <<
'\n'<<
'\n';
697 std::vector<bool> done_solid_node(n_node,
false);
705 unsigned nface=nfluid_face[0];
708 for(
unsigned iface=0; iface<nface; iface++)
714 for(
unsigned ii=0; ii<3; ii++)
717 unsigned inod=(*face_node)[ii];
720 if(!done_solid_node[inod])
722 done_solid_node[inod]=
true;
726 solid_inner_node_nmbr[inod]=counter;
728 solid_output_stream << counter <<
' '
729 << x_node[inod] <<
' '
730 << y_node[inod] <<
' '
731 << z_node[inod] <<
' '
738 solid_outer_node_nmbr[inod]=counter;
742 << x_outer_node[inod]+wall_thickness*normal_for_outer_wall[inod][0]
744 << y_outer_node[inod]+wall_thickness*normal_for_outer_wall[inod][1]
746 << z_outer_node[inod]+wall_thickness*normal_for_outer_wall[inod][2]
754 fluid_output_stream <<
'\n' <<
"# Face list : " <<
'\n';
757 fluid_output_stream << nfluid_face[0]+nfluid_face[1]+nfluid_face[2]
758 +nfluid_face[3] <<
' ' << 1 <<
'\n'<<
'\n';
763 for(
unsigned i=0;
i<4;
i++)
765 fluid_output_stream <<
'\n'
766 <<
"#============================="
767 <<
"====================================="
768 <<
'\n'<<
"# Faces originally on boundary "
770 <<
"# --------------------------------" <<
'\n';
773 unsigned nface=nfluid_face[
i];
776 for(
unsigned iface=0; iface<nface; iface++)
779 fluid_output_stream <<
"# Face " << counter <<
'\n';
782 fluid_output_stream << 1 <<
' ' << 0 <<
' ' ;
786 if(do_multi_boundary_ids)
788 fluid_output_stream << counter <<
'\n';
792 fluid_output_stream <<
i+1 <<
'\n';
796 fluid_output_stream << 3 <<
' ' ;
809 unsigned n_double_boundary_nodes=0;
812 for(
unsigned l=0; l<3;l++)
816 unsigned inod=(*face_node)[l];
819 fluid_output_stream <<fluid_node_nmbr[inod] <<
' ';
824 if (done_for_solid[inod])
826 double_boundary_nod[n_double_boundary_nodes]=inod;
827 n_double_boundary_nodes++;
835 if(n_double_boundary_nodes>1)
837 for(
unsigned idbn=0; idbn<n_double_boundary_nodes-1; idbn++)
840 for(
unsigned j=0;
j<2;
j++)
844 for(
unsigned l=
j+idbn; l<2+idbn; l++)
848 solid_linking_faces[
i-1][nsolid_linking_faces[
i-1]][index]=
849 solid_inner_node_nmbr[double_boundary_nod[l]];
852 for(
unsigned l=idbn; l<idbn+
j+1; l++)
856 solid_linking_faces[
i-1][nsolid_linking_faces[
i-1]][index]=
857 solid_outer_node_nmbr[double_boundary_nod[l]];
860 nsolid_linking_faces[
i-1]++;
864 fluid_output_stream <<
'\n'<<
'\n';
871 solid_output_stream <<
'\n' <<
"# Face list : " <<
'\n';
874 solid_output_stream << 2*nfluid_face[0]+ nsolid_linking_faces[0]
875 + nsolid_linking_faces[1]+ nsolid_linking_faces[2]
876 <<
' ' << 1 <<
'\n'<<
'\n';
880 for(
unsigned i=0;
i<5;
i++)
882 solid_output_stream <<
'\n'
883 <<
"#====================================="
884 <<
"============================="
885 <<
'\n'<<
"# Faces originally on boundary "
887 <<
"# --------------------------------" <<
'\n';
895 nface=nfluid_face[0];
899 nface=nsolid_linking_faces[
i-1];
903 for(
unsigned iface=0; iface<nface; iface++)
909 face_node=&(fluid_faces[0][iface]);
914 face_node=&(solid_linking_faces[
i-1][iface]);
918 solid_output_stream <<
"# Face " << counter <<
'\n';
921 solid_output_stream << 1 <<
' ' << 0 <<
' ' ;
925 if(do_multi_boundary_ids)
927 solid_output_stream << counter <<
'\n';
931 solid_output_stream <<
i+1 <<
'\n';
935 solid_output_stream << 3 <<
' ' ;
938 for(
unsigned l=0; l<3;l++)
941 unsigned inod=(*face_node)[l];
947 solid_output_stream << solid_inner_node_nmbr[inod] <<
' ';
953 solid_output_stream << solid_outer_node_nmbr[inod] <<
' ';
959 solid_output_stream <<inod <<
' ';
963 solid_output_stream <<
'\n'<<
'\n';
970 fluid_output_stream <<
'\n' <<
"# Hole list : " <<
'\n';
971 fluid_output_stream << 0 <<
'\n';
972 fluid_output_stream <<
'\n' <<
"# Region list : " <<
'\n';
973 fluid_output_stream << 0 <<
'\n';
975 solid_output_stream <<
'\n' <<
"# Hole list : " <<
'\n';
976 solid_output_stream << 0 <<
'\n';
977 solid_output_stream <<
'\n' <<
"# Region list : " <<
'\n';
978 solid_output_stream << 0 <<
'\n';
986 filename=input_filename+
"_boundary_enumeration.dat";
987 std::ofstream boundary_enumeration(
filename.c_str());
990 fluid_output_stream <<
'\n'<<
'\n'<<
'\n'
991 <<
"# Old (vmtk) enumeration of fluid boundaries:\n"
992 <<
"# 1: FSI surface\n"
996 <<
"# The new boundary ids are as follow:"<<
'\n' <<
'\n';
1000 for(
unsigned i=0;
i<4;
i++)
1002 fluid_output_stream <<
"# Boundary "<<
i+1
1003 <<
" : from boundary id " ;
1005 for(
unsigned j=0;
j<
i;
j++)
1010 fluid_output_stream <<
id <<
" until boundary id "
1011 <<
id+nfluid_face[
i]-1 <<
'\n';
1012 boundary_enumeration <<
id <<
" "
1013 <<
id+nfluid_face[
i]-1 <<
" "
1014 <<
"# (fluid boundary" <<
i+1 <<
") \n";
1016 fluid_output_stream.close();
1020 solid_output_stream <<
'\n'<<
'\n'<<
'\n'
1021 <<
"# The new boundary ids are as follow:"<<
'\n' <<
'\n';
1023 solid_output_stream <<
"# the inner surface : from boundary id "
1024 << 0 <<
" until boundary id ";
1025 unsigned id=nfluid_face[0]-1;
1026 solid_output_stream <<
id <<
"\n";
1027 boundary_enumeration << 0 <<
" " <<
id <<
" # (solid fsi boundary)\n";
1030 solid_output_stream <<
"# the front inflow face : from boundary id "
1031 <<
id+1 <<
" until boundary id " ;
1032 boundary_enumeration <<
id+1 <<
" ";
1033 id+=nsolid_linking_faces[0];
1034 solid_output_stream <<
id<<
"\n";
1035 boundary_enumeration <<
id <<
" # (solid inflow boundary)\n";
1038 solid_output_stream <<
"# the left bifurcation face : from boundary id "
1039 <<
id+1 <<
" until boundary id " ;
1040 boundary_enumeration <<
id+1 <<
" ";
1041 id+=nsolid_linking_faces[1];
1042 solid_output_stream <<
id<<
"\n" ;
1043 boundary_enumeration <<
id <<
" # (solid left outflow boundary)\n";
1045 solid_output_stream <<
"# the right bifurcation : from boundary id "
1046 <<
id+1 <<
" until boundary id " ;
1047 boundary_enumeration <<
id+1 <<
" ";
1048 id+=nsolid_linking_faces[2];
1049 solid_output_stream <<
id <<
"\n";
1050 boundary_enumeration <<
id <<
" # (solid right outflow boundary)\n";
1052 solid_output_stream <<
"# the outer surface : from boundary id "
1053 <<
id+1 <<
" until boundary id " ;
1054 boundary_enumeration <<
id+1 <<
" ";
1056 solid_output_stream <<
id <<
"\n";
1057 boundary_enumeration <<
id <<
" # (solid outer boundary)\n";
1058 solid_output_stream.close();
1059 boundary_enumeration.close();
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
int i
Definition: BiCGSTAB_step_by_step.cpp:9
EIGEN_DEVICE_FUNC const GlobalUnaryPowReturnType< Derived, ScalarExponent > pow(const Eigen::ArrayBase< Derived > &x, const ScalarExponent &exponent)
Definition: GlobalFunctions.h:137
Definition: oomph_definitions.h:222
static constexpr lastp1_t end
Definition: IndexedViewHelper.h:79
char char char int int * k
Definition: level2_impl.h:374
Vector< double > x1(const Vector< double > &coord)
Cartesian coordinates centered at the point (0.5,1)
Definition: poisson/poisson_with_singularity/two_d_poisson.cc:86
Vector< double > x2(const Vector< double > &coord)
Cartesian coordinates centered at the point (1.5,1)
Definition: poisson/poisson_with_singularity/two_d_poisson.cc:102
string filename
Definition: MergeRestartFiles.py:39
void normal(const Vector< double > &x, Vector< double > &normal)
Definition: free_surface_rotation.cc:65
default
Definition: calibrate.py:45
line
Definition: calibrate.py:103
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286
OomphInfo oomph_info
Definition: oomph_definitions.cc:319
#define OOMPH_EXCEPTION_LOCATION
Definition: oomph_definitions.h:61
#define OOMPH_CURRENT_FUNCTION
Definition: oomph_definitions.h:86
std::ofstream out("Result.txt")
std::ptrdiff_t j
Definition: tut_arithmetic_redux_minmax.cpp:2