17 #define MAXELEMENTSPERBLOCK 1
19 #include "../include/computational_domain.h"
53 const unsigned int mapping_degree)
55 mapping_degree(mapping_degree),
59 vector_fe(
FE_Q<dim-1,dim>(fe_degree), dim),
67 if (blocks.size() > 0)
69 for (
unsigned int ii = 0; ii < num_blocks; ii++)
129 singular_quadrature_order = prm.
get_integer(
"Singular quadrature order");
135 free_sur_ID1 = prm.
get_integer(
"Free Surface 1 ID");
136 free_sur_ID2 = prm.
get_integer(
"Free Surface 2 ID");
137 free_sur_ID3 = prm.
get_integer(
"Free Surface 3 ID");
138 wall_sur_ID1 = prm.
get_integer(
"Wall Surface 1 ID");
139 wall_sur_ID2 = prm.
get_integer(
"Wall Surface 2 ID");
140 wall_sur_ID3 = prm.
get_integer(
"Wall Surface 3 ID");
141 inflow_sur_ID1 = prm.
get_integer(
"Inflow Surface 1 ID");
142 inflow_sur_ID2 = prm.
get_integer(
"Inflow Surface 2 ID");
143 inflow_sur_ID3 = prm.
get_integer(
"Inflow Surface 3 ID");
144 pressure_sur_ID = prm.
get_integer(
"Pressure Surface ID");
145 free_sur_edge_on_boat_ID = prm.
get_integer(
"Free Surface Edge On Boat ID");
151 num_octree_levels = prm.
get_integer(
"Number of Octree Levels");
239 min_diameter = 10000;
241 cell = tria.begin_active(), endc = tria.end();
243 for ( ; cell != endc; ++cell)
245 min_diameter = std::min(min_diameter,cell->diameter());
247 std::cout <<
"Min diameter: << " << min_diameter << std::endl;
260 std::cout<<
"Generating double nodes set..."<<std::endl;
267 std::vector<bool> boundary_dofs(vector_dh.n_dofs(),
false);
268 std::vector< bool > comp_sel(dim,
true);
272 double_nodes_set.clear();
273 double_nodes_set.resize(dh.n_dofs());
274 vector_double_nodes_set.clear();
275 vector_double_nodes_set.resize(vector_dh.n_dofs());
277 update_support_points();
279 for (
unsigned int i=0; i<dh.n_dofs(); ++i)
281 double_nodes_set[i].insert(i);
282 for (
unsigned int k=0; k<dim; ++k)
283 vector_double_nodes_set[dim*i+k].insert(dim*i+k);
284 if (boundary_dofs[dim*i] ==
true)
286 for (
unsigned int j=0; j<dh.n_dofs(); ++j)
289 if (support_points[i].distance(support_points[j]) < tol)
292 double_nodes_set[i].insert(j);
294 for (
unsigned int k=0; k<dim; ++k)
296 vector_double_nodes_set[dim*i+k].insert(dim*j+k);
306 std::cout<<
"...done"<<std::endl;
315 std::cout<<
"Generating octree blocking... "<<std::endl;
324 std::vector<Point<dim> > support_points(dh.n_dofs());
328 FEValues<dim-1,dim> fe_v(*mapping,fe, *quadrature,
330 update_cell_normal_vectors |
331 update_quadrature_points |
334 double max_coor_value = 0;
336 for (
unsigned int i=0; i < dh.n_dofs(); i++)
340 for (
unsigned int j=0; j < dim; j++)
342 max_coor_value = std::max(max_coor_value,std::abs(support_points[i](j)));
346 if (blocks.size() > 0)
348 for (
unsigned int ii = 0; ii < num_blocks; ii++)
352 unsigned int maxNumBlocks = num_octree_levels*tria.n_active_cells()*fe_v.n_quadrature_points;
360 blocks.reserve(maxNumBlocks);
361 blocks.resize(maxNumBlocks);
363 unsigned int blocksCount = 0;
364 startLevel.resize(num_octree_levels+1);
365 endLevel.resize(num_octree_levels+1);
370 parentList.resize(num_octree_levels+1);
371 parentList[0].push_back(0);
374 childlessList.clear();
375 unsigned int numChildless = 0;
376 numParent.resize(num_octree_levels+1);
381 dof_to_block.clear();
384 quad_point_to_block.clear();
388 dofs_filled_blocks.clear();
392 quad_points_filled_blocks.clear();
396 quadShapeFunValues.clear();
399 dofs_filled_blocks.resize(num_octree_levels+1);
401 quad_points_filled_blocks.resize(num_octree_levels+1);
405 for (
unsigned int ii = 0; ii < num_octree_levels + 1 ; ii++)
413 for (
int i=0; i<dim; i++)
414 pMin(i) = -1.1*max_coor_value;
417 double delta = 2.2*max_coor_value;
421 std::vector<unsigned int> local_dof_indices(fe.dofs_per_cell);
423 cell = dh.begin_active(),
425 for (cell = dh.begin_active(); cell != endc; ++cell)
428 const unsigned int n_q_points = fe_v.n_quadrature_points;
429 quadPoints[cell] = fe_v.get_quadrature_points();
430 quadNormals[cell] = fe_v.get_normal_vectors();
431 quadJxW[cell].resize(n_q_points);
432 quadShapeFunValues[cell].resize(n_q_points);
433 for (
unsigned int q=0; q<n_q_points; ++q)
435 quadJxW[cell][q] = fe_v.JxW(q);
436 for (
unsigned int j=0; j<fe.dofs_per_cell; ++j)
437 quadShapeFunValues[cell][q].push_back(fe_v.shape_value(j,q));
440 quad_point_to_block[cell].resize(n_q_points);
441 for (
unsigned int j=0; j<n_q_points; ++j)
444 quad_point_to_block[cell][j].push_back(0);
447 cell->get_dof_indices(local_dof_indices);
448 for (
unsigned int j=0; j<fe.dofs_per_cell; ++j)
450 dof_to_elems[local_dof_indices[j]].push_back(cell);
454 for (
unsigned int ii = 0; ii < dh.n_dofs(); ii++)
457 dof_to_block[ii].push_back(0);
484 unsigned int quadPointsInChildless = 0;
485 unsigned int nodesInChildless = 0;
487 for (
unsigned int level = 1; level < num_octree_levels + 1; level++)
490 unsigned int quadPointsCheck = quadPointsInChildless;
491 unsigned int nodesCheck = nodesInChildless;
494 for (
unsigned int kk = 0; kk < numParent[level-1]; kk++)
497 unsigned int jj = parentList[level-1][kk];
505 unsigned int num_children_per_block = int(pow((
double)2,(
double)dim));
506 std::vector<OctreeBlock<dim> *> children(num_children_per_block);
529 std::map <cell_it, std::vector <unsigned int> > blockQuadPointsList =
536 for (
unsigned int i = 0; i < blockNodeList.size(); i++)
538 Point <dim> node = support_points[blockNodeList[i]];
541 if (node(2) <= parent->
GetPMin()(2)+delta)
543 if (node(1) <= parent->
GetPMin()(1)+delta)
545 if (node(0) <= parent->
GetPMin()(0)+delta)
548 children[0]->AddNode(blockNodeList[i]);
553 children[1]->AddNode(blockNodeList[i]);
558 if (node(0) <= parent->
GetPMin()(0)+delta)
561 children[3]->AddNode(blockNodeList[i]);
566 children[2]->AddNode(blockNodeList[i]);
572 if (node(1) <= parent->
GetPMin()(1)+delta)
574 if (node(0) <= parent->
GetPMin()(0)+delta)
577 children[4]->AddNode(blockNodeList[i]);
582 children[5]->AddNode(blockNodeList[i]);
587 if (node(0) <= parent->
GetPMin()(0)+delta)
590 children[7]->AddNode(blockNodeList[i]);
595 children[6]->AddNode(blockNodeList[i]);
602 typename std::map <cell_it, std::vector<unsigned int> >::iterator it;
603 for (it = blockQuadPointsList.begin(); it != blockQuadPointsList.end(); it++)
605 for (
unsigned int pp = 0; pp < (*it).second.size(); pp++)
607 Point<dim> quadPoint = quadPoints[(*it).first][(*it).second[pp]];
609 if (quadPoint(2) <= parent->
GetPMin()(2)+delta)
611 if (quadPoint(1) <= parent->
GetPMin()(1)+delta)
613 if (quadPoint(0) <= parent->
GetPMin()(0)+delta)
616 children[0]->AddQuadPoint((*it).first,(*it).second[pp]);
621 children[1]->AddQuadPoint((*it).first,(*it).second[pp]);
626 if (quadPoint(0) <= parent->
GetPMin()(0)+delta)
629 children[3]->AddQuadPoint((*it).first,(*it).second[pp]);
634 children[2]->AddQuadPoint((*it).first,(*it).second[pp]);
640 if (quadPoint(1) <= parent->
GetPMin()(1)+delta)
642 if (quadPoint(0) <= parent->
GetPMin()(0)+delta)
645 children[4]->AddQuadPoint((*it).first,(*it).second[pp]);
650 children[5]->AddQuadPoint((*it).first,(*it).second[pp]);
655 if (quadPoint(0) <= parent->
GetPMin()(0)+delta)
658 children[7]->AddQuadPoint((*it).first,(*it).second[pp]);
663 children[6]->AddQuadPoint((*it).first,(*it).second[pp]);
670 for (
unsigned int j=0; j < num_children_per_block; j++ )
672 if (children[j]->GetBlockNodeList().size() +
673 children[j]->GetBlockQuadPointsList().size()> 0)
681 std::map <cell_it, std::vector<unsigned int> >
682 blockQuadPointsList = blocks[blocksCount]->GetBlockQuadPointsList();
683 typename std::map <cell_it, std::vector<unsigned int> >::iterator it;
684 for (it = blockQuadPointsList.begin(); it != blockQuadPointsList.end(); it++)
687 for (
unsigned int kk = 0; kk < (*it).second.size(); kk++)
689 quad_point_to_block[(*it).first][(*it).second[kk]].push_back(blocksCount);
692 std::vector<unsigned int> blockNodesList = blocks[jj]->GetBlockNodeList();
693 for (
unsigned int k = 0; k < blockNodesList.size(); k++)
694 dof_to_block[blockNodesList[k]].push_back(jj);
707 for (
unsigned int i = 0; i < blockNodeList.size(); i++)
711 Point <dim> node = support_points[blockNodeList[i]];
713 if (node(1) <= parent->
GetPMin()(1)+delta)
715 if (node(0) <= parent->
GetPMin()(0)+delta)
718 children[0]->AddNode(blockNodeList[i]);
723 children[1]->AddNode(blockNodeList[i]);
728 if (node(0) <= parent->
GetPMin()(0)+delta)
731 children[3]->AddNode(blockNodeList[i]);
736 children[2]->AddNode(blockNodeList[i]);
742 typename std::map <cell_it, std::vector<unsigned int> >::iterator it;
743 for (it = blockQuadPointsList.begin(); it != blockQuadPointsList.end(); it++)
745 for (
unsigned int pp = 0; pp < (*it).second.size(); pp++)
748 Point<dim> quadPoint = quadPoints[(*it).first][(*it).second[pp]];
749 if (quadPoint(1) <= parent->
GetPMin()(1)+delta)
751 if (quadPoint(0) <= parent->
GetPMin()(0)+delta)
754 children[0]->AddQuadPoint((*it).first,(*it).second[pp]);
759 children[1]->AddQuadPoint((*it).first,(*it).second[pp]);
764 if (quadPoint(0) <= parent->
GetPMin()(0)+delta)
767 children[3]->AddQuadPoint((*it).first,(*it).second[pp]);
772 children[2]->AddQuadPoint((*it).first,(*it).second[pp]);
779 for (
unsigned int j=0; j < num_children_per_block; j++ )
781 if (children[j]->GetBlockNodeList().size() +
782 children[j]->GetBlockQuadPointsList().size()> 0)
790 std::map <cell_it, std::vector<unsigned int> >
791 blockQuadPointsList = blocks[blocksCount]->GetBlockQuadPointsList();
792 typename std::map <cell_it, std::vector<unsigned int> >::iterator it;
793 for (it = blockQuadPointsList.begin(); it != blockQuadPointsList.end(); it++)
796 for (
unsigned int kk = 0; kk < (*it).second.size(); kk++)
798 quad_point_to_block[(*it).first][(*it).second[kk]].push_back(blocksCount);
801 std::vector<unsigned int> blockNodesList = blocks[jj]->GetBlockNodeList();
802 for (
unsigned int k = 0; k < blockNodesList.size(); k++)
803 dof_to_block[blockNodesList[k]].push_back(jj);
821 startLevel[level] = endLevel[level-1] + 1;
822 endLevel[level] = blocksCount;
832 for (
unsigned int jj = startLevel[level]; jj < endLevel[level]+1; jj++)
836 std::vector<unsigned int> nodesId = blocks[jj]->GetBlockNodeList();
837 int blockNumNodes = (int) nodesId.size();
840 int numDoubleNodes = 0;
841 for (
unsigned int kk = 0; kk < nodesId.size(); kk++)
843 int a = (int) double_nodes_set[nodesId[kk]].size();
844 numDoubleNodes += a - 1;
848 int blockNumQuadPoints = 0;
849 std::map <cell_it, std::vector<unsigned int> >
850 blockQuadPointsList = blocks[jj]->GetBlockQuadPointsList();
851 typename std::map <cell_it, std::vector<unsigned int> >::iterator it;
852 for (it = blockQuadPointsList.begin(); it != blockQuadPointsList.end(); it++)
853 blockNumQuadPoints += (
int) (*it).second.size();
856 quadPointsCheck += blockNumQuadPoints;
857 nodesCheck += blockNumNodes;
861 if (blockNumNodes - numDoubleNodes < 2)
864 childlessList.push_back(jj);
865 quadPointsInChildless += blockNumQuadPoints;
866 nodesInChildless += blockNumNodes;
872 for (
unsigned int kk = 0; kk < nodesId.size(); kk++)
873 for (
unsigned int j = level+1; j < num_octree_levels+1; j++)
874 dof_to_block[nodesId[kk]].push_back(jj);
876 for (it = blockQuadPointsList.begin(); it != blockQuadPointsList.end(); it++)
877 for (
unsigned int i = 0; i < (*it).second.size(); i++)
878 for (
unsigned int j = level+1; j < num_octree_levels+1; j++)
879 quad_point_to_block[(*it).first][(*it).second[i]].push_back(jj);
884 numParent[level] += 1;
885 parentList[level].push_back(jj);
889 if (blockNumNodes > 0)
890 dofs_filled_blocks[level].push_back(jj);
893 if (blockNumQuadPoints > 0)
894 quad_points_filled_blocks[level].push_back(jj);
899 std::cout<<
" Total nodes at level "<<level<<
" of "<<num_octree_levels<<
" are "<<nodesCheck<<std::endl;
900 std::cout<<
" Total quad points at level "<<level<<
" of "<<num_octree_levels<<
" are "<<quadPointsCheck<<std::endl;
901 std::cout<<
" Blocks at level "<<level<<
" of "<<num_octree_levels<<
" are "<<endLevel[level]-endLevel[level-1]<<std::endl;
902 std::cout<<
" Total blocks at level "<<level<<
" of "<<num_octree_levels<<
" are "<<endLevel[level] + 1<<std::endl;
903 std::cout<<std::endl;
907 childlessList.resize(childlessList.size()+parentList[num_octree_levels].size());
909 for (
unsigned int jj = 0; jj < parentList[num_octree_levels].size(); jj++)
911 childlessList[numChildless + jj] = parentList[num_octree_levels][jj];
917 num_blocks = blocksCount+1;
920 std::cout<<
"...done generating octree blocking"<<std::endl;
922 std::cout<<
"Computing proximity lists for blocks"<<std::endl;
965 for (
unsigned int ii = startLevel[1]; ii < endLevel[1] + 1; ii++)
967 for (
unsigned int jj = startLevel[1]; jj < endLevel[1] + 1; jj++)
969 blocks[ii]->AddNearNeigh(0,jj);
974 for (
unsigned int level = 2; level < num_octree_levels + 1; level++)
977 for (
unsigned int kk = startLevel[level]; kk < endLevel[level]+1; kk++)
986 for (
unsigned int iii = 0; iii < dim; iii++)
987 Center1(iii) = delta1/2.;
992 std::set <unsigned int> parentNNeighs = blocks[parentId]->GetNearNeighs(0);
995 for (std::set <unsigned int>::iterator pos = parentNNeighs.begin(); pos != parentNNeighs.end(); pos++)
998 if (blocks[*pos]->GetBlockChildrenNum() == 0)
1000 unsigned int block2Id = *pos;
1002 double delta2 = block2->
GetDelta();
1005 for (
unsigned int iii = 0; iii < dim; iii++)
1006 Center2(iii) = delta2/2.;
1013 if ((fabs(PMin1(0) - PMax2(0)) <=
TOLL) || (fabs(PMax1(0) - PMin2(0)) <=
TOLL))
1015 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1017 if ((PMin1(2)-
TOLL <= PMax2(2)) && (PMax1(2)+
TOLL >= PMin2(2)))
1025 if ((fabs(PMin1(1) - PMax2(1)) <=
TOLL) || (fabs(PMax1(1) - PMin2(1)) <=
TOLL))
1027 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1029 if ((PMin1(2)-
TOLL <= PMax2(2)) && (PMax1(2)+
TOLL >= PMin2(2)))
1037 if ((fabs(PMin1(2) - PMax2(2)) <=
TOLL) || (fabs(PMax1(2) - PMin2(2)) <=
TOLL))
1039 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1041 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1052 if ((fabs(PMin1(0) - PMax2(0)) <=
TOLL) || (fabs(PMax1(0) - PMin2(0)) <=
TOLL))
1054 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1061 if ((fabs(PMin1(1) - PMax2(1)) <=
TOLL) || (fabs(PMax1(1) - PMin2(1)) <=
TOLL))
1063 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1074 for (
unsigned int ii = 0; ii < blocks[*pos]->GetBlockChildrenNum(); ii++)
1076 unsigned int block2Id = blocks[*pos]->GetChildId(ii);
1078 double delta2 = block2->
GetDelta();
1081 for (
unsigned int iii = 0; iii < dim; iii++)
1082 Center2(iii) = delta2/2.;
1089 if ((fabs(PMin1(0) - PMax2(0)) <=
TOLL) || (fabs(PMax1(0) - PMin2(0)) <=
TOLL))
1091 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1093 if ((PMin1(2)-
TOLL <= PMax2(2)) && (PMax1(2)+
TOLL >= PMin2(2)))
1101 if ((fabs(PMin1(1) - PMax2(1)) <=
TOLL) || (fabs(PMax1(1) - PMin2(1)) <=
TOLL))
1103 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1105 if ((PMin1(2)-
TOLL <= PMax2(2)) && (PMax1(2)+
TOLL >= PMin2(2)))
1113 if ((fabs(PMin1(2) - PMax2(2)) <=
TOLL) || (fabs(PMax1(2) - PMin2(2)) <=
TOLL))
1115 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1117 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1128 if ((fabs(PMin1(0) - PMax2(0)) <=
TOLL) || (fabs(PMax1(0) - PMin2(0)) <=
TOLL))
1130 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1137 if ((fabs(PMin1(1) - PMax2(1)) <=
TOLL) || (fabs(PMax1(1) - PMin2(1)) <=
TOLL))
1139 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1161 for (
unsigned int subLevel = 1; subLevel < num_octree_levels - level + 1; subLevel++)
1165 std::set <unsigned int> upperLevelNNeighs = block1->
GetNearNeighs(subLevel-1);
1166 for (std::set <unsigned int>::iterator pos = upperLevelNNeighs.begin(); pos != upperLevelNNeighs.end(); pos++)
1169 if (blocks[*pos]->GetBlockChildrenNum() == 0)
1172 for (
unsigned int ii = 0; ii < blocks[*pos]->GetBlockChildrenNum(); ii++)
1174 unsigned int block2Id = blocks[*pos]->GetChildId(ii);
1176 double delta2 = block2->
GetDelta();
1179 for (
unsigned int iii = 0; iii < dim; iii++)
1180 Center2(iii) = delta2/2.;
1187 if ((fabs(PMin1(0) - PMax2(0)) <=
TOLL) || (fabs(PMax1(0) - PMin2(0)) <=
TOLL))
1189 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1191 if ((PMin1(2)-
TOLL <= PMax2(2)) && (PMax1(2)+
TOLL >= PMin2(2)))
1199 if ((fabs(PMin1(1) - PMax2(1)) <=
TOLL) || (fabs(PMax1(1) - PMin2(1)) <=
TOLL))
1201 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1203 if ((PMin1(2)-
TOLL <= PMax2(2)) && (PMax1(2)+
TOLL >= PMin2(2)))
1211 if ((fabs(PMin1(2) - PMax2(2)) <=
TOLL) || (fabs(PMax1(2) - PMin2(2)) <=
TOLL))
1213 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1215 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1226 if ((fabs(PMin1(0) - PMax2(0)) <=
TOLL) || (fabs(PMax1(0) - PMin2(0)) <=
TOLL))
1228 if ((PMin1(1)-
TOLL <= PMax2(1)) && (PMax1(1)+
TOLL >= PMin2(1)))
1235 if ((fabs(PMin1(1) - PMax2(1)) <=
TOLL) || (fabs(PMax1(1) - PMin2(1)) <=
TOLL))
1237 if ((PMin1(0)-
TOLL <= PMax2(0)) && (PMax1(0)+
TOLL >= PMin2(0)))
1293 for (
unsigned int ii = startLevel[1]; ii < endLevel[1] + 1; ii++)
1295 for (
unsigned int jj = startLevel[1]; jj < endLevel[1] + 1; jj++)
1297 blocks[ii]->AddBlockToIntList(0,jj);
1302 for (
unsigned int level = 2; level < num_octree_levels + 1; level++)
1305 for (
unsigned int jj = startLevel[level]; jj < endLevel[level] + 1; jj++)
1311 std::set <unsigned int> NNList = block1->
GetNearNeighs(subLevel);
1313 for (std::set <unsigned int>::iterator pos1 = NNList.begin(); pos1 != NNList.end(); pos1++)
1321 for (
unsigned int pp = 0; pp < nodeIds.size(); pp++)
1324 std::set <unsigned int> doubleNodes = double_nodes_set[nodeIds[pp]];
1325 for (std::set<unsigned int>::iterator pos = doubleNodes.begin();
1326 pos != doubleNodes.end(); pos++)
1330 for (
unsigned int k=0; k < dof_to_elems[*pos].size(); k++)
1332 cell_it cell = dof_to_elems[*pos][k];
1334 for (
unsigned int j=0; j < quadPoints[cell].size(); j++)
1336 block1->
AddBlockToIntList(subLevel,quad_point_to_block[cell][j][level+subLevel]);
1342 for (
unsigned int subLevel = 0; subLevel < block1->
GetNearNeighSize(); subLevel++)
1345 std::set <unsigned int> intList = block1->
GetIntList(subLevel);
1346 std::set <unsigned int> parentIntList;
1348 parentIntList = blocks[block1->
GetParentId()]->GetIntList(0);
1350 parentIntList = block1->
GetIntList(subLevel-1);
1352 for (std::set <unsigned int>::iterator pos1 = parentIntList.begin(); pos1 != parentIntList.end(); pos1++)
1357 if (intList.count(*pos1) == 0)
1365 if (intList.count(block2->
GetChildId(kk)) == 0)
1440 integralCheck.clear();
1441 for (
unsigned int i = 0; i < dh.n_dofs(); i++)
1443 for (
cell_it cell = dh.begin_active(); cell != endc; ++cell)
1446 integralCheck[i][cell] = 0;
1452 std::cout<<
"Done computing proximity lists for blocks"<<std::endl;
1461 std::cout<<
"Smoothing inflow surface"<<std::endl;
1463 std::cout<<
"done smoothing inflow surface"<<std::endl;
1470 std::ifstream ifile(fname.c_str());
1473 tria.read_flags(ifile);
1480 dh.distribute_dofs(fe);
1481 vector_dh.distribute_dofs(vector_fe);
1485 map_points.reinit(vector_dh.n_dofs());
1487 if (mapping == NULL)
1489 (mapping_degree, map_points, vector_dh);
1491 generate_double_nodes_set();
1492 compute_min_diameter();
1493 std::cout<<
"Total number of dofs after restore: "<<dh.n_dofs()<<std::endl;
1499 std::ofstream ofile(fname.c_str());
1500 tria.write_flags(ofile);
1509 ref_points.resize(vector_dh.n_dofs());
1511 vector_dh, ref_points);
1513 vector_support_points.resize(vector_dh.n_dofs());
1516 support_points.resize(dh.n_dofs());
1530 normals_sparsity_pattern.
reinit(vector_dh.n_dofs(),
1532 vector_dh.max_couplings_between_dofs());
1534 vector_constraints.
clear();
1536 vector_constraints.
close();
1538 normals_sparsity_pattern.
compress();
1544 vector_normals_matrix.
reinit (normals_sparsity_pattern);
1545 vector_normals_rhs.
reinit(vector_dh.n_dofs());
1546 vector_normals_solution.reinit(vector_dh.n_dofs());
1549 FEValues<dim-1,dim> vector_fe_v(*mapping, vector_fe, *quadrature,
1550 update_values | update_cell_normal_vectors |
1553 const unsigned int vector_n_q_points = vector_fe_v.n_quadrature_points;
1554 const unsigned int vector_dofs_per_cell = vector_fe.dofs_per_cell;
1555 std::vector<unsigned int> vector_local_dof_indices (vector_dofs_per_cell);
1557 FullMatrix<double> local_normals_matrix (vector_dofs_per_cell, vector_dofs_per_cell);
1561 vector_cell = vector_dh.begin_active(),
1562 vector_endc = vector_dh.end();
1564 for (; vector_cell!=vector_endc; ++vector_cell)
1566 vector_fe_v.reinit (vector_cell);
1567 local_normals_matrix = 0;
1568 local_normals_rhs = 0;
1569 const std::vector<Point<dim> > &vector_node_normals = vector_fe_v.get_normal_vectors();
1570 unsigned int comp_i, comp_j;
1572 for (
unsigned int q=0; q<vector_n_q_points; ++q)
1573 for (
unsigned int i=0; i<vector_dofs_per_cell; ++i)
1575 comp_i = vector_fe.system_to_component_index(i).first;
1576 for (
unsigned int j=0; j<vector_dofs_per_cell; ++j)
1578 comp_j = vector_fe.system_to_component_index(j).first;
1579 if (comp_i == comp_j)
1581 local_normals_matrix(i,j) += vector_fe_v.shape_value(i,q)*
1582 vector_fe_v.shape_value(j,q)*
1586 local_normals_rhs(i) += (vector_fe_v.shape_value(i, q)) *
1587 vector_node_normals[q](comp_i) * vector_fe_v.JxW(q);
1590 vector_cell->get_dof_indices (vector_local_dof_indices);
1593 (local_normals_matrix,
1595 vector_local_dof_indices,
1596 vector_normals_matrix,
1597 vector_normals_rhs);
1603 normals_inverse.
initialize(vector_normals_matrix);
1604 normals_inverse.
vmult(vector_normals_solution, vector_normals_rhs);
1605 vector_constraints.
distribute(vector_normals_solution);
1607 nodes_normals.resize(dh.n_dofs());
1609 for (
unsigned int i=0; i<vector_dh.n_dofs()/dim; ++i)
1611 for (
unsigned int d=0; d<dim; d++)
1612 nodes_normals[i](d) = vector_normals_solution(3*i+d);
1613 nodes_normals[i]/= nodes_normals[i].distance(
Point<dim>(0.0,0.0,0.0));
1615 for (
unsigned int d=0; d<dim; d++)
1616 vector_normals_solution(3*i+d) = nodes_normals[i](d);
DoFHandler< dim-1, dim >::active_cell_iterator cell_it
void generate_double_nodes_set()
void AddQuadPoint(cell_it elemPointer, unsigned int quadPointId)
unsigned int GetNearNeighSize() const
unsigned int GetParentId() const
virtual void read_domain()
std::map< cell_it, std::vector< unsigned int > > GetBlockQuadPointsList() const
void dump_tria(std::string fname) const
void distribute(VectorType &vec) const
void compute_min_diameter()
unsigned int NumNearNeighLevels() const
std::string get(const std::string &entry_string) const
void inflow_mesh_smoothing()
std::set< unsigned int > GetNearNeighs(unsigned int sublevel) const
std::set< unsigned int > GetIntList(unsigned int sublevel) const
virtual void declare_parameters(ParameterHandler &prm)
void SetNonIntListSize(unsigned int sublevels)
unsigned int GetChildId(unsigned int idInList) const
void enter_subsection(const std::string &subsection)
void AddChild(unsigned int childId)
void make_hanging_node_constraints(const DoFHandlerType &dof_handler, ConstraintMatrix &constraints)
void distribute_local_to_global(const InVector &local_vector, const std::vector< size_type > &local_dof_indices, OutVector &global_vector) const
std::vector< unsigned int > GetBlockNodeList() const
void generate_octree_blocking()
virtual void parse_parameters(ParameterHandler &prm)
void AddBlockToIntList(unsigned int sublevel, const unsigned int intListBlockId)
ComputationalDomain(const unsigned int fe_degree=1, const unsigned int mapping_degree=1)
virtual ~ComputationalDomain()
bool mesh_check_and_update()
void SetNearNeighSize(unsigned int sublevels)
void AddNode(unsigned int nodeId)
virtual void refine_and_resize()
void reinit(const size_type m, const size_type n, const unsigned int max_per_row)
Point< dim > GetPMin() const
void make_sparsity_pattern(const DoFHandlerType &dof_handler, SparsityPatternType &sparsity_pattern, const ConstraintMatrix &constraints=ConstraintMatrix(), const bool keep_constrained_dofs=true, const types::subdomain_id subdomain_id=numbers::invalid_subdomain_id)
void initialize(const SparsityPattern &sparsity_pattern)
void AddBlockToNonIntList(unsigned int sublevel, const unsigned int intListBlockId)
virtual void reinit(const size_type N, const bool omit_zeroing_entries=false)
void declare_entry(const std::string &entry, const std::string &default_value, const Patterns::PatternBase &pattern=Patterns::Anything(), const std::string &documentation=std::string())
void update_support_points()
unsigned int GetBlockChildrenNum() const
void SetIntListSize(unsigned int sublevels)
void AddNearNeigh(unsigned int sublevel, const unsigned int nnBlockId)
void restore_tria(std::string fname)
void CopyContent(const OctreeBlock *other)
long int get_integer(const std::string &entry_string) const
void vmult(Vector< double > &dst, const Vector< double > &src) const