13 #if !defined(KRATOS_TRIGEN_DROPLET_MODELER_H_INCLUDED )
14 #define KRATOS_TRIGEN_DROPLET_MODELER_H_INCLUDED
33 void triangulate(
char *,
struct triangulateio *,
struct triangulateio *,
struct triangulateio *);
107 Element const& rReferenceElement,
108 Condition const& rReferenceBoundaryCondition,
110 double my_alpha = 1.4,
double h_factor=0.5)
114 if (ThisModelPart.
NodesBegin()->SolutionStepsDataHas(IS_FREE_SURFACE)==
false )
115 KRATOS_THROW_ERROR(std::logic_error,
"Add ----IS_FREE_SURFACE---- variable!!!!!! ERROR",
"");
116 if (ThisModelPart.
NodesBegin()->SolutionStepsDataHas(IS_STRUCTURE)==
false )
117 KRATOS_THROW_ERROR(std::logic_error,
"Add ----IS_STRUCTURE---- variable!!!!!! ERROR",
"");
118 if (ThisModelPart.
NodesBegin()->SolutionStepsDataHas(IS_BOUNDARY)==
false )
119 KRATOS_THROW_ERROR(std::logic_error,
"Add ----IS_BOUNDARY---- variable!!!!!! ERROR",
"");
120 if (ThisModelPart.
NodesBegin()->SolutionStepsDataHas(IS_FLUID)==
false )
124 const auto inital_time = std::chrono::steady_clock::now();
135 int id = (ThisModelPart.
Nodes().end() - 1)->Id() + 1;
136 for(ModelPart::ConditionsContainerType::iterator ic = ThisModelPart.
ConditionsBegin() ;
139 if (ic->GetGeometry().size()==2)
143 unsigned int n_flag=ic->GetGeometry()[0].FastGetSolutionStepValue(IS_FREE_SURFACE);
144 n_flag+=ic->GetGeometry()[1].FastGetSolutionStepValue(IS_FREE_SURFACE);
148 unsigned int n_trip=ic->GetGeometry()[0].FastGetSolutionStepValue(TRIPLE_POINT);
149 n_trip+=ic->GetGeometry()[1].FastGetSolutionStepValue(TRIPLE_POINT);
151 unsigned int n_struct=ic->GetGeometry()[0].FastGetSolutionStepValue(IS_STRUCTURE);
152 n_struct+=ic->GetGeometry()[1].FastGetSolutionStepValue(IS_STRUCTURE);
153 unsigned int n_sum =
n_flag + n_trip;
156 if (
n_flag==ic->GetGeometry().size() || n_struct==ic->GetGeometry().size() || n_sum==ic->GetGeometry().size())
159 double x0=ic->GetGeometry()[0].X();
160 double y0=ic->GetGeometry()[0].Y();
161 double x1=ic->GetGeometry()[1].X();
162 double y1=ic->GetGeometry()[1].Y();
163 double edge01=sqrt((x0-
x1)*(x0-
x1)+(y0-y1)*(y0-y1));
220 double nodal_h=ic->GetGeometry()[0].FastGetSolutionStepValue(NODAL_H);
221 nodal_h+=ic->GetGeometry()[1].FastGetSolutionStepValue(NODAL_H);
229 if (edge01>
factor*nodal_h)
232 double x = 0.5*(x0+
x1);
233 double y = 0.5*(y0+y1);;
242 for(Node::DofsContainerType::iterator iii = reference_dofs.begin(); iii != reference_dofs.end(); iii++)
246 (p_new_dof)->FreeDof();
250 InterpolateOnEdge(geom, 0, 1, step_data_size, pnode);
252 pnode->X0() = pnode->X() - disp[0];
253 pnode->Y0() = pnode->Y() - disp[1];
274 unsigned int bucket_size = 20;
277 unsigned int max_results = 100;
282 Node work_point(0,0.0,0.0,0.0);
288 list_of_nodes.reserve(ThisModelPart.
Nodes().size());
289 for(ModelPart::NodesContainerType::iterator i_node = ThisModelPart.
NodesBegin() ; i_node != ThisModelPart.
NodesEnd() ; i_node++)
291 (list_of_nodes).push_back(*(i_node.base()));
294 KdtreeType nodes_tree1(list_of_nodes.begin(),list_of_nodes.end(), bucket_size);
296 RemoveCloseNodes(ThisModelPart, nodes_tree1, node_erase, h_factor);
304 struct triangulateio in_mid;
305 struct triangulateio out_mid;
306 struct triangulateio vorout_mid;
308 initialize_triangulateio(in_mid);
309 initialize_triangulateio(out_mid);
310 initialize_triangulateio(vorout_mid);
314 in_mid.numberofpoints = ThisModelPart.
Nodes().size();
315 in_mid.pointlist = (
REAL *) malloc(in_mid.numberofpoints * 2 *
sizeof(
REAL));
318 ModelPart::NodesContainerType::iterator nodes_begin = ThisModelPart.
NodesBegin();
319 for(
unsigned int i = 0;
i<ThisModelPart.
Nodes().size();
i++)
325 (nodes_begin +
i)->SetId(
i+1);
328 in_mid.pointlist[base] = (nodes_begin +
i)->
X();
329 in_mid.pointlist[base+1] = (nodes_begin +
i)->
Y();
331 auto& node_dofs = (nodes_begin +
i)->GetDofs();
332 for(
auto iii = node_dofs.begin(); iii != node_dofs.end(); iii++)
334 (**iii).SetEquationId(
i+1);
345 char options1[] =
"Pne";
346 triangulate(options1, &in_mid, &out_mid, &vorout_mid);
350 unsigned int el_number=out_mid.numberoftriangles;
353 std::vector<int> preserved_list1(el_number);
354 preserved_list1.resize(el_number);
356 int number_of_preserved_elems= PassAlphaShape(ThisModelPart, preserved_list1, el_number, my_alpha, out_mid);
360 clean_triangulateio(in_mid);
361 clean_triangulateio(vorout_mid);
365 struct triangulateio in2;
366 struct triangulateio out2;
367 struct triangulateio vorout2;
369 initialize_triangulateio(in2);
370 initialize_triangulateio(out2);
371 initialize_triangulateio(vorout2);
374 in2.numberofpoints = ThisModelPart.
Nodes().size();
375 in2.pointlist = (
REAL *) malloc(in2.numberofpoints * 2 *
sizeof(
REAL));
378 for(
unsigned int i = 0;
i<ThisModelPart.
Nodes().size();
i++)
381 in2.pointlist[base] = (nodes_begin +
i)->
X();
382 in2.pointlist[base+1] = (nodes_begin +
i)->
Y();
384 in2.numberoftriangles=number_of_preserved_elems;
386 in2.trianglelist = (
int *) malloc(in2.numberoftriangles * 3 *
sizeof(
int));
387 in2.trianglearealist = (
REAL *) malloc(in2.numberoftriangles *
sizeof(
REAL));
394 for(ModelPart::NodesContainerType::iterator i_node = ThisModelPart.
NodesBegin() ; i_node != ThisModelPart.
NodesEnd() ; i_node++)
396 if (i_node->FastGetSolutionStepValue(IS_FREE_SURFACE)!=0)
399 double& val=i_node->FastGetSolutionStepValue(NODAL_H);
407 for (
unsigned int el=0;
el<el_number;
el++)
409 if(
static_cast<bool>(preserved_list1[
el]) ==
true )
415 in2.trianglelist[new_base] = out_mid.trianglelist[old_base];
416 in2.trianglelist[new_base+1] = out_mid.trianglelist[old_base+1];
417 in2.trianglelist[new_base+2] = out_mid.trianglelist[old_base+2];
420 double prescribed_h = (nodes_begin + out_mid.trianglelist[old_base]-1)->FastGetSolutionStepValue(NODAL_H);
421 prescribed_h += (nodes_begin + out_mid.trianglelist[old_base+1]-1)->FastGetSolutionStepValue(NODAL_H);
422 prescribed_h += (nodes_begin + out_mid.trianglelist[old_base+2]-1)->FastGetSolutionStepValue(NODAL_H);
423 prescribed_h *= 0.3333;
425 in2.trianglearealist[
counter] = 0.5*(1.5*prescribed_h*1.5*prescribed_h);
431 for(ModelPart::NodesContainerType::iterator i_node = ThisModelPart.
NodesBegin() ; i_node != ThisModelPart.
NodesEnd() ; i_node++)
433 if (i_node->FastGetSolutionStepValue(IS_FREE_SURFACE)!=0)
435 double& nodal_h=i_node->FastGetSolutionStepValue(NODAL_H);
441 clean_triangulateio(out_mid);
450 char mesh_regen_opts[] =
"YJq1.4arn";
451 triangulate(mesh_regen_opts, &in2, &out2, &vorout2);
456 char mesh_regen_opts[] =
"YJrn";
457 triangulate(mesh_regen_opts, &in2, &out2, &vorout2);
465 typedef std::vector<PointType::Pointer>
PointVector;
485 int n_points_before_refinement = in2.numberofpoints;
487 if (out2.numberofpoints > n_points_before_refinement )
489 for(
int i = n_points_before_refinement;
i<out2.numberofpoints;
i++)
493 double&
x= out2.pointlist[base];
494 double&
y= out2.pointlist[base+1];
498 pnode->SetBufferSize(ThisModelPart.
NodesBegin()->GetBufferSize() );
500 list_of_new_nodes.push_back( pnode );
504 for(Node::DofsContainerType::iterator iii = reference_dofs.begin(); iii != reference_dofs.end(); iii++)
509 (p_new_dof)->FreeDof();
517 std::cout <<
"During refinement we added " << out2.numberofpoints-n_points_before_refinement<<
" nodes " <<std::endl;
532 unsigned int MaximumNumberOfResults = list_of_new_nodes.size();
538 if(out2.numberofpoints-n_points_before_refinement > 0)
541 kd_tree nodes_tree2(list_of_new_nodes.begin(),list_of_new_nodes.end(),bucket_size);
544 for(
int el = 0;
el< in2.numberoftriangles;
el++)
548 point_base = (in2.trianglelist[base] - 1)*2;
549 x1[0] = in2.pointlist[point_base];
550 x1[1] = in2.pointlist[point_base+1];
552 point_base = (in2.trianglelist[base+1] - 1)*2;
553 x2[0] = in2.pointlist[point_base];
554 x2[1] = in2.pointlist[point_base+1];
556 point_base = (in2.trianglelist[base+2] - 1)*2;
557 x3[0] = in2.pointlist[point_base];
558 x3[1] = in2.pointlist[point_base+1];
563 CalculateCenterAndSearchRadius(
x1[0],
x1[1],
569 int number_of_points_in_radius;
572 work_point.
Z() = 0.0;
574 number_of_points_in_radius = nodes_tree2.SearchInRadius(work_point,
radius*1.01, Results.begin(),
575 ResultsDistances.begin(), MaximumNumberOfResults);
578 *( (nodes_begin + in2.trianglelist[base]-1).base() ),
579 *( (nodes_begin + in2.trianglelist[base+1]-1).base() ),
580 *( (nodes_begin + in2.trianglelist[base+2]-1).base() )
584 for(
PointIterator it_found = Results.begin(); it_found != Results.begin() + number_of_points_in_radius; it_found++)
586 bool is_inside =
false;
590 (*it_found)->X(),(*it_found)->Y(),
N);
593 if(is_inside ==
true)
605 for( PointVector::iterator it = list_of_new_nodes.begin(); it!=list_of_new_nodes.end(); it++)
608 (*it)->X0() = (*it)->X() - disp[0];
609 (*it)->Y0() = (*it)->Y() - disp[1];
620 (ThisModelPart.
Elements()).reserve(out2.numberoftriangles);
622 for(
int iii = 0; iii< out2.numberoftriangles; iii++)
627 *( (nodes_begin + out2.trianglelist[base]-1).base() ),
628 *( (nodes_begin + out2.trianglelist[base+1]-1).base() ),
629 *( (nodes_begin + out2.trianglelist[base+2]-1).base() )
635 if( *(ModelNodes).find( out2.trianglelist[base]).base() == *(ThisModelPart.
Nodes().end()).base() )
637 if( *(ModelNodes).find( out2.trianglelist[base+1]).base() == *(ThisModelPart.
Nodes().end()).base() )
639 if( *(ModelNodes).find( out2.trianglelist[base+2]).base() == *(ThisModelPart.
Nodes().end()).base() )
644 Element::Pointer p_element = rReferenceElement.
Create(
id, geom, properties);
645 (ThisModelPart.
Elements()).push_back(p_element);
651 ModelPart::ElementsContainerType::const_iterator el_begin = ThisModelPart.
ElementsBegin();
652 for(ModelPart::ElementsContainerType::const_iterator iii = ThisModelPart.
ElementsBegin();
656 int base = ( iii->Id() - 1 )*3;
658 (iii->GetValue(NEIGHBOUR_ELEMENTS)).resize(3);
660 for(
int i = 0;
i<3;
i++)
662 int index = out2.neighborlist[base+
i];
666 neighb(
i) = Element::WeakPointer();
670 IdentifyBoundary(ThisModelPart, rReferenceBoundaryCondition, properties, out2);
674 clean_triangulateio(in2);
676 clean_triangulateio(out2);
678 clean_triangulateio(vorout2);
679 KRATOS_WATCH(
"Finished remeshing with Trigen_Droplet_Refine")
700 virtual std::string
Info()
const
764 boost::numeric::ublas::bounded_matrix<double,2,2> mJ;
765 boost::numeric::ublas::bounded_matrix<double,2,2> mJinv;
779 unsigned int max_results = 100;
784 Node work_point(0,0.0,0.0,0.0);
786 unsigned int n_points_in_radius;
790 for(ModelPart::NodesContainerType::const_iterator in = ThisModelPart.
NodesBegin(); in != ThisModelPart.
NodesEnd(); in++)
792 radius=h_factor*in->FastGetSolutionStepValue(NODAL_H);
794 work_point[0]=in->X();
795 work_point[1]=in->Y();
796 work_point[2]=in->Z();
798 n_points_in_radius = nodes_tree1.SearchInRadius(work_point,
radius,
res.begin(),res_distances.begin(), max_results);
799 if (n_points_in_radius>1)
801 if (in->FastGetSolutionStepValue(IS_BOUNDARY)==0.0 && in->FastGetSolutionStepValue(IS_STRUCTURE)==0.0)
804 double erased_nodes = 0;
806 erased_nodes += in->Is(TO_ERASE);
808 if( erased_nodes < 1)
809 in->Set(TO_ERASE,
true);
812 else if ( (in)->FastGetSolutionStepValue(IS_STRUCTURE)!=1.0)
820 if ( (*i)->FastGetSolutionStepValue(IS_BOUNDARY,1)==1.0 && res_distances[
k] < 0.2*
radius && res_distances[
k] > 0.0 )
828 in->Set(TO_ERASE,
true);
842 int PassAlphaShape(
ModelPart& ThisModelPart,
std::vector<
int>& preserved_list1,
unsigned int & el_number,
double& my_alpha, struct triangulateio& out_mid)
850 array_1d<double,3>
x1,
x2,x3,
xc;
853 int number_of_preserved_elems=0;
856 for(
unsigned int el = 0;
el< el_number;
el++)
861 point_base = (out_mid.trianglelist[base] - 1)*2;
862 x1[0] = out_mid.pointlist[point_base];
863 x1[1] = out_mid.pointlist[point_base+1];
865 point_base = (out_mid.trianglelist[base+1] - 1)*2;
866 x2[0] = out_mid.pointlist[point_base];
867 x2[1] = out_mid.pointlist[point_base+1];
869 point_base = (out_mid.trianglelist[base+2] - 1)*2;
870 x3[0] = out_mid.pointlist[point_base];
871 x3[1] = out_mid.pointlist[point_base+1];
874 Geometry<Node >
temp;
876 temp.push_back( *((ThisModelPart.Nodes()).find( out_mid.trianglelist[base]).base() ) );
877 temp.push_back( *((ThisModelPart.Nodes()).find( out_mid.trianglelist[base+1]).base() ) );
878 temp.push_back( *((ThisModelPart.Nodes()).find( out_mid.trianglelist[base+2]).base() ) );
880 int number_of_structure_nodes =
int(
temp[0].FastGetSolutionStepValue(IS_STRUCTURE) );
881 number_of_structure_nodes +=
int(
temp[1].FastGetSolutionStepValue(IS_STRUCTURE) );
882 number_of_structure_nodes +=
int(
temp[2].FastGetSolutionStepValue(IS_STRUCTURE) );
885 int nfs =
int(
temp[0].FastGetSolutionStepValue(IS_FREE_SURFACE) );
886 nfs +=
int(
temp[1].FastGetSolutionStepValue(IS_FREE_SURFACE) );
887 nfs +=
int(
temp[2].FastGetSolutionStepValue(IS_FREE_SURFACE) );
890 int nfluid =
int(
temp[0].FastGetSolutionStepValue(IS_FLUID) );
891 nfluid +=
int(
temp[1].FastGetSolutionStepValue(IS_FLUID) );
892 nfluid +=
int(
temp[2].FastGetSolutionStepValue(IS_FLUID) );
904 if(number_of_structure_nodes!=3)
907 if (nfs != 0 || nfluid != 3)
910 if( (AlphaShape(my_alpha,
temp) && number_of_structure_nodes!=3))
918 preserved_list1[
el] =
true;
919 number_of_preserved_elems += 1;
930 double bigger_alpha = my_alpha*10.0;
931 if( AlphaShape(bigger_alpha,
temp) && number_of_structure_nodes!=3)
939 preserved_list1[
el] =
true;
940 number_of_preserved_elems += 1;
946 preserved_list1[
el] =
false;
949 return number_of_preserved_elems;
956 void IdentifyBoundary(
ModelPart& ThisModelPart, Condition
const& rReferenceBoundaryCondition, Properties::Pointer& properties,
struct triangulateio& out2)
960 for(ModelPart::NodesContainerType::const_iterator in = ThisModelPart.NodesBegin(); in!=ThisModelPart.NodesEnd(); in++)
962 in->FastGetSolutionStepValue(IS_BOUNDARY) = 0;
965 ModelPart::ElementsContainerType::iterator elements_end = ThisModelPart.Elements().end();
967 ThisModelPart.Elements().Unique();
970 for(ModelPart::ElementsContainerType::iterator iii = ThisModelPart.ElementsBegin(); iii != ThisModelPart.ElementsEnd(); iii++)
972 int base = ( iii->Id() - 1 )*3;
974 ModelPart::ElementsContainerType::iterator el_neighb;
985 el_neighb = (ThisModelPart.Elements()).find( out2.neighborlist[base] );
986 if( el_neighb == elements_end )
990 iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) = 1;
991 iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) = 1;
996 temp1.push_back(iii->GetGeometry()(1));
997 temp1.push_back(iii->GetGeometry()(2));
999 Geometry< Node >::Pointer cond = Geometry< Node >::Pointer(
new Geometry< Node >(temp1) );
1000 int id = (iii->Id()-1)*3;
1001 Condition::Pointer p_cond = rReferenceBoundaryCondition.Create(
id, temp1, properties);
1002 ThisModelPart.Conditions().push_back(p_cond);
1008 el_neighb = (ThisModelPart.Elements()).find( out2.neighborlist[base+1] );
1010 if( el_neighb == elements_end )
1013 iii->GetGeometry()[2].FastGetSolutionStepValue(IS_BOUNDARY) = 1;
1014 iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) = 1;
1019 temp1.push_back(iii->GetGeometry()(2));
1020 temp1.push_back(iii->GetGeometry()(0));
1022 Geometry< Node >::Pointer cond = Geometry< Node >::Pointer(
new Geometry< Node >(temp1) );
1023 int id = (iii->Id()-1)*3+1;
1024 Condition::Pointer p_cond = rReferenceBoundaryCondition.Create(
id, temp1, properties);
1025 ThisModelPart.Conditions().push_back(p_cond);
1032 el_neighb = (ThisModelPart.Elements()).find( out2.neighborlist[base+2] );
1033 if( el_neighb == elements_end )
1036 iii->GetGeometry()[0].FastGetSolutionStepValue(IS_BOUNDARY) = 1;
1037 iii->GetGeometry()[1].FastGetSolutionStepValue(IS_BOUNDARY) = 1;
1042 temp1.push_back(iii->GetGeometry()(0));
1043 temp1.push_back(iii->GetGeometry()(1));
1045 Geometry< Node >::Pointer cond = Geometry< Node >::Pointer(
new Geometry< Node >(temp1) );
1046 int id = (iii->Id()-1)*3+2;
1047 Condition::Pointer p_cond = rReferenceBoundaryCondition.Create(
id, temp1, properties);
1048 ThisModelPart.Conditions().push_back(p_cond);
1058 bool AlphaShape(
double alpha_param, Geometry<Node >& pgeom)
1064 double x0 = pgeom[0].X();
1065 double x1 = pgeom[1].X();
1066 double x2 = pgeom[2].X();
1068 double y0 = pgeom[0].Y();
1069 double y1 = pgeom[1].Y();
1070 double y2 = pgeom[2].Y();
1072 mJ(0,0)=2.0*(
x1-x0);
1073 mJ(0,1)=2.0*(y1-y0);
1074 mJ(1,0)=2.0*(
x2-x0);
1075 mJ(1,1)=2.0*(y2-y0);
1078 double detJ = mJ(0,0)*mJ(1,1)-mJ(0,1)*mJ(1,0);
1080 mJinv(0,0) = mJ(1,1);
1081 mJinv(0,1) = -mJ(0,1);
1082 mJinv(1,0) = -mJ(1,0);
1083 mJinv(1,1) = mJ(0,0);
1085 bounded_matrix<double,2,2> check;
1089 h = pgeom[0].FastGetSolutionStepValue(NODAL_H);
1090 h += pgeom[1].FastGetSolutionStepValue(NODAL_H);
1091 h += pgeom[2].FastGetSolutionStepValue(NODAL_H);
1099 pgeom[0].GetSolutionStepValue(IS_BOUNDARY) = 1;
1100 pgeom[1].GetSolutionStepValue(IS_BOUNDARY) = 1;
1101 pgeom[2].GetSolutionStepValue(IS_BOUNDARY) = 1;
1108 double x0_2 = x0*x0 + y0*y0;
1109 double x1_2 =
x1*
x1 + y1*y1;
1110 double x2_2 =
x2*
x2 + y2*y2;
1116 mRhs[0] = (x1_2 - x0_2);
1117 mRhs[1] = (x2_2 - x0_2);
1122 double radius = sqrt(pow(mC[0]-x0,2)+pow(mC[1]-y0,2));
1139 inline void CalculateCenterAndSearchRadius(
const double x0,
const double y0,
1140 const double x1,
const double y1,
1141 const double x2,
const double y2,
1142 double&
xc,
double&
yc,
double&
R
1145 xc = 0.3333333333333333333*(x0+
x1+
x2);
1146 yc = 0.3333333333333333333*(y0+y1+y2);
1148 double R1 = (
xc-x0)*(
xc-x0) + (
yc-y0)*(
yc-y0);
1159 inline double CalculateVol(
const double x0,
const double y0,
1160 const double x1,
const double y1,
1161 const double x2,
const double y2
1164 return 0.5*( (
x1-x0)*(y2-y0)- (y1-y0)*(
x2-x0) );
1168 const double x1,
const double y1,
1169 const double x2,
const double y2,
1170 const double xc,
const double yc,
1171 array_1d<double,3>&
N
1176 if(area < 0.000000000000001)
1191 double upper_limit = 1.0+
tol;
1192 double lower_limit = -
tol;
1194 if(
N[0] >= lower_limit &&
N[1] >= lower_limit &&
N[2] >= lower_limit &&
N[0] <= upper_limit &&
N[1] <= upper_limit &&
N[2] <= upper_limit)
1201 void Interpolate( Triangle2D3<Node >& geom,
const array_1d<double,3>&
N,
1202 unsigned int step_data_size,
1203 Node::Pointer pnode)
1205 unsigned int buffer_size = pnode->GetBufferSize();
1213 double* step_data = (pnode)->SolutionStepData().Data(
step);
1216 double* node0_data = geom[0].SolutionStepData().Data(
step);
1217 double* node1_data = geom[1].SolutionStepData().Data(
step);
1218 double* node2_data = geom[2].SolutionStepData().Data(
step);
1221 for(
unsigned int j= 0;
j<step_data_size;
j++)
1224 step_data[
j] =
N[0]*node0_data[
j] +
N[1]*node1_data[
j] +
N[2]*node2_data[
j];
1230 pnode->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET) = 0.0;
1231 pnode->FastGetSolutionStepValue(TRIPLE_POINT) = 0.0;
1241 if (
N[0]==0.0 &&
N[1]==0.0 &&
N[2]==0.0)
1242 KRATOS_THROW_ERROR(std::logic_error,
"SOMETHING's wrong with the added nodes!!!!!! ERROR",
"");
1253 pnode->FastGetSolutionStepValue(IS_BOUNDARY)=0.0;
1254 pnode->FastGetSolutionStepValue(IS_STRUCTURE)=0.0;
1255 pnode->FastGetSolutionStepValue(IS_INTERFACE)=0.0;
1256 pnode->Set(TO_ERASE,
false);
1257 pnode->FastGetSolutionStepValue(IS_FREE_SURFACE)=0.0;
1258 pnode->FastGetSolutionStepValue(IS_FLUID)=1.0;
1261 void initialize_triangulateio( triangulateio& tr )
1263 tr.pointlist = (
REAL*) NULL;
1264 tr.pointattributelist = (
REAL*) NULL;
1265 tr.pointmarkerlist = (
int*) NULL;
1266 tr.numberofpoints = 0;
1267 tr.numberofpointattributes = 0;
1268 tr.trianglelist = (
int*) NULL;
1269 tr.triangleattributelist = (
REAL*) NULL;
1270 tr.trianglearealist = (
REAL*) NULL;
1271 tr.neighborlist = (
int*) NULL;
1272 tr.numberoftriangles = 0;
1273 tr.numberofcorners = 3;
1274 tr.numberoftriangleattributes = 0;
1275 tr.segmentlist = (
int*) NULL;
1276 tr.segmentmarkerlist = (
int*) NULL;
1277 tr.numberofsegments = 0;
1278 tr.holelist = (
REAL*) NULL;
1279 tr.numberofholes = 0;
1280 tr.regionlist = (
REAL*) NULL;
1281 tr.numberofregions = 0;
1282 tr.edgelist = (
int*) NULL;
1283 tr.edgemarkerlist = (
int*) NULL;
1284 tr.normlist = (
REAL*) NULL;
1285 tr.numberofedges = 0;
1288 void clean_triangulateio( triangulateio& tr )
1290 if(tr.pointlist != NULL) free(tr.pointlist );
1291 if(tr.pointattributelist != NULL) free(tr.pointattributelist );
1292 if(tr.pointmarkerlist != NULL) free(tr.pointmarkerlist );
1293 if(tr.trianglelist != NULL) free(tr.trianglelist );
1294 if(tr.triangleattributelist != NULL) free(tr.triangleattributelist );
1295 if(tr.trianglearealist != NULL) free(tr.trianglearealist );
1296 if(tr.neighborlist != NULL) free(tr.neighborlist );
1297 if(tr.segmentlist != NULL) free(tr.segmentlist );
1298 if(tr.segmentmarkerlist != NULL) free(tr.segmentmarkerlist );
1299 if(tr.holelist != NULL) free(tr.holelist );
1300 if(tr.regionlist != NULL) free(tr.regionlist );
1301 if(tr.edgelist != NULL) free(tr.edgelist );
1302 if(tr.edgemarkerlist != NULL) free(tr.edgemarkerlist );
1303 if(tr.normlist != NULL) free(tr.normlist );
1306 void InterpolateOnEdge( Geometry<Node >& geom,
int point1,
int point2,
unsigned int step_data_size, Node::Pointer pnode)
1308 unsigned int buffer_size = pnode->GetBufferSize();
1309 KRATOS_INFO(
"TriGenDropletModeler") <<
"buffer_size: " << buffer_size << std::endl;
1313 double* step_data = (pnode)->SolutionStepData().Data(
step);
1315 if (point1>2 || point1<0 || point2>2 || point2<0 || (point1==point2)) {
1316 KRATOS_INFO(
"TriGenDropletModeler") <<
"point1: " << point1 << std::endl;
1317 KRATOS_INFO(
"TriGenDropletModeler") <<
"point2: " << point2 << std::endl;
1318 KRATOS_ERROR <<
"THE EDGE POINTS ARE INVALID " << std::endl;
1321 double* node0_data = geom[point1].SolutionStepData().Data(
step);
1322 double* node1_data = geom[point2].SolutionStepData().Data(
step);
1325 for(
unsigned int j= 0;
j<step_data_size;
j++) {
1326 step_data[
j] = 0.5*(node0_data[
j] + node1_data[
j]);
1337 pnode->FastGetSolutionStepValue(IS_LAGRANGIAN_INLET)=0.0;
1338 pnode->FastGetSolutionStepValue(IS_BOUNDARY)=1.0;
1339 pnode->FastGetSolutionStepValue(IS_FLUID)=1.0;
1340 pnode->FastGetSolutionStepValue(TRIPLE_POINT)=0.0;
1341 pnode->FastGetSolutionStepValue(CONTACT_ANGLE)=0.0;
1344 pnode->Set(TO_ERASE,
false);
1346 if (pnode->FastGetSolutionStepValue(IS_INTERFACE)>0.9)
1347 pnode->FastGetSolutionStepValue(IS_INTERFACE)=1.0;
1349 pnode->FastGetSolutionStepValue(IS_INTERFACE)=0.0;
1350 if (pnode->FastGetSolutionStepValue(IS_FREE_SURFACE)>0.9)
1351 pnode->FastGetSolutionStepValue(IS_FREE_SURFACE)=1.0;
1353 pnode->FastGetSolutionStepValue(IS_FREE_SURFACE)=0.0;
1354 if (pnode->FastGetSolutionStepValue(FLAG_VARIABLE)>0.9)
1355 pnode->FastGetSolutionStepValue(FLAG_VARIABLE)=1.0;
1357 pnode->FastGetSolutionStepValue(FLAG_VARIABLE)=0.0;
1358 if (pnode->FastGetSolutionStepValue(IS_STRUCTURE)>0.9)
1360 pnode->FastGetSolutionStepValue(IS_STRUCTURE)=1.0;
1361 pnode->FastGetSolutionStepValue(IS_INTERFACE)=0.0;
1362 pnode->FastGetSolutionStepValue(IS_FREE_SURFACE)=0.0;
1365 pnode->FastGetSolutionStepValue(IS_STRUCTURE)=0.0;
1421 rOStream << std::endl;
PeriodicInterfaceProcess & operator=(const PeriodicInterfaceProcess &)=delete
Short class definition.
Definition: bucket.h:57
Base class for all Conditions.
Definition: condition.h:59
Geometry< NodeType >::PointsArrayType NodesArrayType
definition of nodes container type, redefined from GeometryType
Definition: condition.h:86
Dof represents a degree of freedom (DoF).
Definition: dof.h:86
Base class for all Elements.
Definition: element.h:60
virtual Pointer Create(IndexType NewId, NodesArrayType const &ThisNodes, PropertiesType::Pointer pProperties) const
It creates a new element pointer.
Definition: element.h:202
This process removes the entities from a model part with the flag TO_ERASE.
Definition: entity_erase_process.h:70
void Execute() override
Execute method is used to execute the Process algorithms.
Geometry base class.
Definition: geometry.h:71
This class is a wrapper for a pointer to a data that is located in a different rank.
Definition: global_pointer.h:44
Definition: amatrix_interface.h:497
Definition: amatrix_interface.h:530
PropertiesType::Pointer pGetProperties(IndexType PropertiesId)
Definition: mesh.h:394
This class aims to manage meshes for multi-physics simulations.
Definition: model_part.h:77
ElementIterator ElementsBegin(IndexType ThisIndex=0)
Definition: model_part.h:1169
NodeType::Pointer CreateNewNode(int Id, double x, double y, double z, VariablesList::Pointer pNewVariablesList, IndexType ThisIndex=0)
Definition: model_part.cpp:270
ConditionIterator ConditionsBegin(IndexType ThisIndex=0)
Definition: model_part.h:1361
SizeType GetNodalSolutionStepDataSize()
Definition: model_part.h:571
NodeIterator NodesBegin(IndexType ThisIndex=0)
Definition: model_part.h:487
ConditionsContainerType & Conditions(IndexType ThisIndex=0)
Definition: model_part.h:1381
ElementsContainerType & Elements(IndexType ThisIndex=0)
Definition: model_part.h:1189
MeshType::NodesContainerType NodesContainerType
Nodes container. Which is a vector set of nodes with their Id's as key.
Definition: model_part.h:128
ElementIterator ElementsEnd(IndexType ThisIndex=0)
Definition: model_part.h:1179
NodeIterator NodesEnd(IndexType ThisIndex=0)
Definition: model_part.h:497
MeshType & GetMesh(IndexType ThisIndex=0)
Definition: model_part.h:1791
NodesContainerType & Nodes(IndexType ThisIndex=0)
Definition: model_part.h:507
ConditionIterator ConditionsEnd(IndexType ThisIndex=0)
Definition: model_part.h:1371
This class defines the node.
Definition: node.h:65
std::vector< std::unique_ptr< Dof< double > >> DofsContainerType
The DoF container type definition.
Definition: node.h:92
double Y() const
Definition: point.h:187
double Z() const
Definition: point.h:193
double X() const
Definition: point.h:181
void reserve(size_type dim)
Definition: pointer_vector.h:319
static double ElapsedSeconds(const std::chrono::steady_clock::time_point StartTime)
This method returns the resulting time.
Definition: timer.h:179
A generic tree data structure for spatial partitioning.
Definition: tree.h:190
Short class definition.
Definition: trigen_droplet_refine.h:61
Node::Pointer PointPointerType
Definition: trigen_droplet_refine.h:69
Tree< KDTreePartition< BucketType > > KdtreeType
Definition: trigen_droplet_refine.h:75
Bucket< 3, PointType, PointVector, PointPointerType, PointIterator, DistanceIterator > BucketType
Definition: trigen_droplet_refine.h:74
virtual void PrintData(std::ostream &rOStream) const
Print object's data.
Definition: trigen_droplet_refine.h:709
virtual void PrintInfo(std::ostream &rOStream) const
Print information about this object.
Definition: trigen_droplet_refine.h:706
Node PointType
Definition: trigen_droplet_refine.h:68
virtual std::string Info() const
Turn back information as a string.
Definition: trigen_droplet_refine.h:700
virtual ~TriGenDropletModeler()
Destructor.
Definition: trigen_droplet_refine.h:90
std::vector< double >::iterator DistanceIterator
Definition: trigen_droplet_refine.h:73
TriGenDropletModeler()
Default constructor.
Definition: trigen_droplet_refine.h:82
KRATOS_CLASS_POINTER_DEFINITION(TriGenDropletModeler)
Pointer definition of TriGenModeler.
std::vector< PointType::Pointer > PointVector
Definition: trigen_droplet_refine.h:70
void ReGenerateMeshDroplet(ModelPart &ThisModelPart, Element const &rReferenceElement, Condition const &rReferenceBoundaryCondition, EntitiesEraseProcess< Node > &node_erase, bool rem_nodes=true, bool add_nodes=true, double my_alpha=1.4, double h_factor=0.5)
Definition: trigen_droplet_refine.h:105
PointVector::iterator PointIterator
Definition: trigen_droplet_refine.h:71
std::vector< double > DistanceVector
Definition: trigen_droplet_refine.h:72
Short class definition.
Definition: trigen_pfem_refine.h:64
A three node 2D triangle geometry with linear shape functions.
Definition: triangle_2d_3.h:74
#define KRATOS_THROW_ERROR(ExceptionType, ErrorMessage, MoreInfo)
Definition: define.h:77
#define KRATOS_CATCH(MoreInfo)
Definition: define.h:110
#define KRATOS_WATCH(variable)
Definition: define.h:806
#define KRATOS_TRY
Definition: define.h:109
#define REAL
Definition: delaunator_utilities.cpp:16
#define KRATOS_ERROR
Definition: exception.h:161
#define KRATOS_INFO(label)
Definition: logger.h:250
Kratos::ModelPart ModelPart
Definition: kratos_wrapper.h:31
z
Definition: GenerateWind.py:163
REF: G. R. Cowper, GAUSSIAN QUADRATURE FORMULAS FOR TRIANGLES.
Definition: mesh_condition.cpp:21
bool CalculatePosition(Geometry< Node > &geom, const double xc, const double yc, const double zc, array_1d< double, 3 > &N)
Definition: transfer_utility.h:343
double CalculateVol(const double x0, const double y0, const double x1, const double y1, const double x2, const double y2)
Definition: transfer_utility.h:424
AMatrix::MatrixProductExpression< TExpression1Type, TExpression2Type > prod(AMatrix::MatrixExpression< TExpression1Type, TCategory1 > const &First, AMatrix::MatrixExpression< TExpression2Type, TCategory2 > const &Second)
Definition: amatrix_interface.h:568
std::istream & operator>>(std::istream &rIStream, LinearMasterSlaveConstraint &rThis)
input stream function
std::vector< PointTypePointer > PointVector
Definition: internal_variables_interpolation_process.h:53
T & noalias(T &TheMatrix)
Definition: amatrix_interface.h:484
void triangulate(char *, struct triangulateio *, struct triangulateio *, struct triangulateio *)
REACTION_CHECK_STIFFNESS_FACTOR int
Definition: contact_structural_mechanics_application_variables.h:75
PointVector::iterator PointIterator
Definition: internal_variables_interpolation_process.h:54
std::ostream & operator<<(std::ostream &rOStream, const LinearMasterSlaveConstraint &rThis)
output stream function
Definition: linear_master_slave_constraint.h:432
std::vector< double > DistanceVector
Definition: internal_variables_interpolation_process.h:55
int step
Definition: face_heat.py:88
y
Other simbols definition.
Definition: generate_axisymmetric_navier_stokes_element.py:54
res
Definition: generate_convection_diffusion_explicit_element.py:211
h
Definition: generate_droplet_dynamics.py:91
x2
Definition: generate_frictional_mortar_condition.py:122
x1
Definition: generate_frictional_mortar_condition.py:121
int tol
Definition: hinsberg_optimization.py:138
R
Definition: isotropic_damage_automatic_differentiation.py:172
float radius
Definition: mesh_to_mdpa_converter.py:18
def Interpolate(variable, entity, sf_values, historical_value)
Definition: point_output_process.py:231
int k
Definition: quadrature.py:595
int j
Definition: quadrature.py:648
el
Definition: read_stl.py:25
float temp
Definition: rotating_cone.py:85
float xc
Definition: rotating_cone.py:77
float yc
Definition: rotating_cone.py:78
int counter
Definition: script_THERMAL_CORRECT.py:218
int n_flag
check to ensure that no node has zero density or pressure
Definition: script_THERMAL_CORRECT.py:113
add_nodes
Definition: script.py:96
N
Definition: sensitivityMatrix.py:29
x
Definition: sensitivityMatrix.py:49
namespace
Definition: array_1d.h:793
integer i
Definition: TensorModule.f:17
e
Definition: run_cpp_mpi_tests.py:31
float factor
for node in (self.combined_model_part).Nodes: pold = node.GetSolutionStepValue(PRESSURE,...
Definition: ulf_PGLASS.py:254