101 MESH_TIMER_START(totalTime,
" Total Time for Mesh Refinement of this Step ");
104 if(meshP1->FEType_ !=
"P1" && meshP1->FEType_ !=
"P2"){
105 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"Mesh Refinement only works for Triangular Elements");
108 currentIter_ = iteration;
110 refinementMode_ = refinementMode;
111 if(refinementMode_ ==
"Bisection")
112 this->refinementRestriction_ =
"Bisection";
114 this->dim_ = meshP1->getDimension();
115 this->FEType_ =meshP1->FEType_;
116 this->volumeID_ = meshP1->volumeID_;
117 this->rankRange_=meshP1->rankRange_;
120 SurfaceElementsPtr_Type surfaceTriangleElements = meshP1->getSurfaceTriangleElements();
121 ElementsPtr_Type elementsTmp = meshP1->getElementsC();
123 EdgeElementsPtr_Type edgeElements =meshP1->getEdgeElements();
126 ElementsPtr_Type elements =Teuchos::rcp(
new Elements(*elementsTmp));
128 vec2D_dbl_ptr_Type points = meshP1->getPointsRepeated();
129 this->elementMap_ = meshP1->elementMap_;
130 this->mapUnique_ = meshP1->mapUnique_;
131 this->mapRepeated_=meshP1->mapRepeated_;
132 this->edgeMap_ = meshP1->edgeMap_;
138 this->elementsC_.reset(
new Elements(*elementsTmp));
139 this->pointsRep_.reset(
new std::vector<std::vector<double> >(meshP1->pointsRep_->size(),std::vector<double>(this->dim_,-1.)));
140 *this->pointsRep_ = *meshP1->pointsRep_;
141 this->pointsUni_.reset(
new std::vector<std::vector<double> >( this->mapUnique_->getNodeNumElements(), std::vector<double>(this->dim_,-1. ) ) );
142 *this->pointsUni_ = *meshP1->pointsUni_;
143 this->bcFlagUni_.reset(
new std::vector<int> ( this->mapUnique_->getNodeNumElements(), 0 ) );
144 *this->bcFlagUni_ = *meshP1->bcFlagUni_;
146 this->bcFlagRep_.reset(
new std::vector<int>(meshP1->bcFlagRep_->size()));
147 *this->bcFlagRep_ = *meshP1->bcFlagRep_;
150 this->edgesElementOrder_=meshP1->getEdgeElementOrder();
152 this->numElementsGlob_ = meshP1->numElementsGlob_;
157 meshP1->assignEdgeFlags();
161 if (this->dim_ == 2 || this->dim_ == 3){
164 if(this->comm_->getRank() == 0){
165 std::cout <<
" \t-- Mesh Refinement -- " << std::endl;
166 std::cout <<
"\t__________________________________________________________________________________________________________ " << std::endl;
167 std::cout <<
" " << std::endl;
168 std::cout <<
" \tStart Iteration " << iteration+1 <<
" of "<< this->dim_ <<
"D Mesh Refinement " << std::endl;
169 std::cout <<
" \tNumber of Elements:\t" << this->elementMap_->getGlobalNumElements() << std::endl;
170 std::cout <<
" \tNumber of Nodes:\t" << this->mapUnique_->getGlobalNumElements() << std::endl;
171 std::cout <<
" \tNumber of Edges:\t" << this->edgeMap_->getGlobalNumElements() << std::endl;
172 std::cout <<
"\t__________________________________________________________________________________________________________ " << std::endl;
181 MESH_TIMER_START(preprocessingTimer,
" Step 0:\t Preprocessing");
182 const int myRank = this->comm_->getRank();
184 edgeElements->matchEdgesToElements(this->elementMap_);
187 vec2D_GO_Type elementsOfEdgeGlobal = edgeElements->getElementsOfEdgeGlobal();
188 vec2D_LO_Type elementsOfEdgeLocal = edgeElements->getElementsOfEdgeLocal();
195 vec_GO_Type globalInterfaceIDs;
197 globalInterfaceIDs = edgeElements->determineInterfaceEdges(this->edgeMap_);
198 for(
int i=0; i< elements->numberElements(); i++){
199 this->elementsC_->getElement(i).setPredecessorElement(i);
204 for(
int i=0; i< edgeElements->numberElements(); i++){
205 if(edgeElements->getElement(i).isInterfaceElement()){
206 globalInterfaceIDs.push_back(this->edgeMap_->getGlobalElement(i));
209 sort(globalInterfaceIDs.begin(), globalInterfaceIDs.end());
211 globalInterfaceIDs_ = globalInterfaceIDs;
215 if(surfaceTriangleElements.is_null()){
220 else if(surfaceTriangleElements->numberElements() ==0){
223 surfaceTriangleElements->matchSurfacesToElements(this->elementMap_);
228 int newPointsRepeated= 0;
233 int newEdgesUnique=0;
234 int newEdgesRepeated =0;
238 MESH_TIMER_STOP(preprocessingTimer);
240 MESH_TIMER_START(regularRefinementTimer,
" Step 1:\t Tagging Edges for Refinement");
243 for(
int i=0; i<elements->numberElements();i++){
244 if(elements->getElement(i).isTaggedForRefinement()){
245 numPoints= this->pointsRep_->size();
246 this->
bisectEdges( edgeElements, elements, i, surfaceTriangleElements);
247 newPoints=newPoints + this->pointsRep_->size()-numPoints;
251 MESH_TIMER_STOP(regularRefinementTimer);
262 MESH_TIMER_START(commEdgesTimer,
" Step 2:\t Communicating tagged edges");
263 MapConstPtr_Type edgeMap = this->
getEdgeMap();
267 vec_GO_Type globalInterfaceIDsTagged(0);
269 for(
int i=0; i<globalInterfaceIDs.size(); i++){
270 indE = edgeMap->getLocalElement(globalInterfaceIDs[i]);
271 if(edgeElements->getElement(indE).isTaggedForRefinement()){
272 globalInterfaceIDsTagged.push_back(globalInterfaceIDs[i]);
278 Teuchos::ArrayView<GO> globalEdgesInterfaceArray = Teuchos::arrayViewFromVector( globalInterfaceIDs);
279 Teuchos::ArrayView<GO> globalEdgesInterfaceTaggedArray = Teuchos::arrayViewFromVector( globalInterfaceIDsTagged);
281 MapPtr_Type mapInterfaceEdges =
282 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), globalEdgesInterfaceArray, 0, this->comm_) );
283 MapPtr_Type mapInterfaceEdgesTagged =
284 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), globalEdgesInterfaceTaggedArray, 0, this->comm_) );
287 MultiVectorGOPtr_Type taggedEdgesGlobal = Teuchos::rcp(
new MultiVectorGO_Type(mapInterfaceEdges, 1 ) );
288 taggedEdgesGlobal->putScalar(0);
291 MultiVectorGOPtr_Type isActiveEdge = Teuchos::rcp(
new MultiVectorGO_Type( mapInterfaceEdgesTagged, 1 ) );
292 isActiveEdge->putScalar( (LO) 1);
294 taggedEdgesGlobal->importFromVector(isActiveEdge,
true,
"Insert");
295 Teuchos::ArrayRCP< const GO > tags = taggedEdgesGlobal->getData( 0 );
300 for (
int i=0; i<tags.size(); i++) {
302 ind = edgeMap->getLocalElement(globalInterfaceIDs[i]);
303 newPointsRepeated ++;
304 if(!edgeElements->getElement(ind).isTaggedForRefinement()){
305 edgeElements->getElement(ind).tagForRefinement();
308 globalInterfaceIDsTagged.push_back(globalInterfaceIDs[i]);
313 MESH_TIMER_STOP(commEdgesTimer);
322 MESH_TIMER_START(checkTimer,
" Step 3:\t Checking Restrictions");
323 this->
refinementRestrictions(meshP1, elements ,edgeElements, surfaceTriangleElements, newPoints, newPointsRepeated, globalInterfaceIDsTagged, mapInterfaceEdges, newElements);
325 sort(globalInterfaceIDsTagged.begin(), globalInterfaceIDsTagged.end());
327 MESH_TIMER_STOP(checkTimer);
336 MESH_TIMER_START(nodeTimer,
" Step 4:\t Updating Node Map");
338 int maxRank = std::get<1>(this->rankRange_);
343 vec_GO_Type globalProcs(0);
344 for (
int i=0; i<= maxRank; i++)
345 globalProcs.push_back(i);
347 Teuchos::ArrayView<GO> globalProcArray = Teuchos::arrayViewFromVector( globalProcs);
349 vec_GO_Type localProc(0);
350 localProc.push_back(this->comm_->getRank());
351 Teuchos::ArrayView<GO> localProcArray = Teuchos::arrayViewFromVector( localProc);
353 MapPtr_Type mapGlobalProc =
354 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), globalProcArray, 0, this->comm_) );
356 MapPtr_Type mapProc =
357 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), localProcArray, 0, this->comm_) );
359 this->
buildNodeMap(edgeElements, mapGlobalProc, mapProc, newPoints, newPointsRepeated);
361 MESH_TIMER_STOP(nodeTimer);
371 MESH_TIMER_START(irregRefTimer,
" Step 5:\t Irregular Refinement");
372 this->
refineMeshRegIreg(elements, edgeElements, newElements,edgeMap, surfaceTriangleElements);
373 MESH_TIMER_STOP(irregRefTimer);
382 MESH_TIMER_START(elementMapTimer,
" Step 6:\t Updating Element Map");
383 MapConstPtr_Type elementMap = meshP1->getElementMap();
385 MultiVectorLOPtr_Type exportLocalEntry = Teuchos::rcp(
new MultiVectorLO_Type( mapProc, 1 ) );
386 exportLocalEntry->putScalar( (LO) newElements );
389 MultiVectorLOPtr_Type isActiveElement= Teuchos::rcp(
new MultiVectorLO_Type( mapGlobalProc, 1 ) );
390 isActiveElement->putScalar( (LO) 0 );
391 isActiveElement->importFromVector( exportLocalEntry,
false,
"Insert");
394 Teuchos::ArrayRCP< const LO > elementsRank = isActiveElement->getData(0);
396 Teuchos::ArrayView<const GO> elementList = elementMap->getNodeElementList();
397 std::vector<GO> vecGlobalIDsElements = Teuchos::createVector( elementList );
400 int offsetElements = elementMap->getGlobalNumElements();
403 GO procOffsetElements=0;
404 for(
int i=0; i< myRank; i++)
405 procOffsetElements = procOffsetElements + elementsRank[i];
407 for (
int i=0; i<newElements; i++){
408 vecGlobalIDsElements.push_back( i + offsetElements + procOffsetElements);
411 Teuchos::RCP<std::vector<GO> > elementsGlobMapping = Teuchos::rcp(
new std::vector<GO>( vecGlobalIDsElements ) );
412 Teuchos::ArrayView<GO> elementsGlobMappingArray = Teuchos::arrayViewFromVector( *elementsGlobMapping);
414 this->elementMap_.reset(
new Map<LO,GO,NO>( Teuchos::OrdinalTraits<GO>::invalid(), elementsGlobMappingArray, 0, this->comm_) );
417 this->numElementsGlob_ = this->elementMap_->getMaxAllGlobalIndex()+1;
418 MESH_TIMER_STOP(elementMapTimer);
428 MESH_TIMER_START(uniqueEdgesTimer,
" Step 7:\t Making Edges Unique");
429 vec2D_GO_Type combinedEdgeElements;
430 this->edgeElements_->sortUniqueAndSetGlobalIDsParallel(this->elementMap_,combinedEdgeElements);
431 MESH_TIMER_STOP(uniqueEdgesTimer);
443 MESH_TIMER_START(edgeMapTimer,
" Step 8:\t Creating EdgeMap");
445 MESH_TIMER_STOP(edgeMapTimer);
453 MESH_TIMER_START(elementsOfEdgeTimer,
" Step 9:\t Updating ElementsOfEdgeLocal/Global");
454 this->edgeElements_->setElementsEdges( combinedEdgeElements );
456 this->edgeElements_->setUpElementsOfEdge( this->elementMap_, this->edgeMap_);
460 MESH_TIMER_STOP(elementsOfEdgeTimer);
462 MESH_TIMER_START(elementsOfSurfaceTimer,
" Step 10: Updating ElementsOfSurfaceLocal/Global");
464 vec2D_GO_Type combinedSurfaceElements;
466 this->surfaceTriangleElements_->sortUniqueAndSetGlobalIDsParallel(this->elementMap_,combinedSurfaceElements);
468 this->surfaceTriangleElements_->setElementsSurface( combinedSurfaceElements );
470 this->surfaceTriangleElements_->setUpElementsOfSurface( this->elementMap_, this->edgeMap_, this->edgeElements_);
472 MESH_TIMER_STOP(elementsOfSurfaceTimer);
474 vec2D_GO_Type elementsOfSurfaceGlobal = this->surfaceTriangleElements_->getElementsOfSurfaceGlobal();
476 vec2D_LO_Type elementsOfSurfaceLocal = this->surfaceTriangleElements_->getElementsOfSurfaceLocal();
479 MESH_TIMER_STOP(totalTime);
482 if(this->comm_->getRank() == 0){
483 std::cout <<
"\t__________________________________________________________________________________________________________ " << std::endl;
484 std::cout <<
" " << std::endl;
485 std::cout <<
" \t... finished Iteration " << iteration+1 <<
" of " << this->dim_ <<
"D Mesh Refinement " << std::endl;
486 std::cout <<
" \tNumber of new Elements:\t" << this->elementMap_->getGlobalNumElements() - meshP1->elementMap_-> getGlobalNumElements() << std::endl;
487 std::cout <<
" \tNumber of new Nodes:\t" << this->mapUnique_->getGlobalNumElements()- meshP1->mapUnique_-> getGlobalNumElements() << std::endl;
488 std::cout <<
" \tNumber of new Edges:\t" << this->edgeMap_->getGlobalNumElements()- meshP1->edgeMap_-> getGlobalNumElements() << std::endl;
489 std::cout <<
"\t__________________________________________________________________________________________________________ " << std::endl;
490 std::cout <<
" " << std::endl;
493 if(writeRefinementTime_ )
494 Teuchos::TimeMonitor::report(std::cout,
"Mesh Refinement");
499 outputMesh->dim_ = this->dim_ ;
500 outputMesh->FEType_ = this->FEType_ ;
501 outputMesh->rankRange_ = this->rankRange_;
503 outputMesh->elementMap_ = this->elementMap_ ;
504 outputMesh->mapUnique_ = this->mapUnique_ ;
505 outputMesh->mapRepeated_ = this->mapRepeated_;
506 outputMesh->edgeMap_ = this->edgeMap_ ;
508 outputMesh->elementsC_ = this->elementsC_;
509 outputMesh->edgeElements_ = this->edgeElements_;
510 outputMesh->surfaceTriangleElements_ = this->surfaceTriangleElements_;
512 outputMesh->pointsRep_ = this->pointsRep_ ;
513 outputMesh->pointsUni_ = this->pointsUni_;
515 outputMesh->bcFlagUni_ = this->bcFlagUni_ ;
516 outputMesh->bcFlagRep_ = this->bcFlagRep_ ;
519 outputMesh->edgesElementOrder_ = this->edgesElementOrder_;
520 outputMesh->numElementsGlob_ = this->numElementsGlob_ ;
2542 if(this->dim_ == 3){
2547 vec_int_Type midPointInd( 0 );
2548 vec_int_Type edgeNumbers = edgeElements->getEdgesOfElement(indexElement);
2549 vec_int_Type edgeNumbersUntagged(0);
2553 vec_int_Type nodeInd1(0);
2554 vec_int_Type nodeInd2(0);
2555 bool firstEdge =
true;
2556 for(
int i=0; i<6; i++){
2558 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement() && firstEdge ==
false){
2559 nodeInd2.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(0));
2560 nodeInd2.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(1));
2563 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement() && firstEdge ==
true){
2564 nodeInd1.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(0));
2565 nodeInd1.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(1));
2570 sort( nodeInd1.begin(), nodeInd1.end() );
2571 sort( nodeInd2.begin(), nodeInd2.end() );
2573 vec_int_Type nodeInd = {nodeInd1[0],nodeInd1[1],nodeInd2[0],nodeInd2[1]};
2585 vec_int_Type edgeNumbersTmp = edgeNumbers;
2586 for(
int i=0; i<6; i++){
2587 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[0] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[0]){
2588 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1])
2589 edgeNumbers[0] = edgeNumbersTmp[i];
2590 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
2591 edgeNumbers[1] = edgeNumbersTmp[i];
2592 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
2593 edgeNumbers[2] = edgeNumbersTmp[i];
2595 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1]){
2596 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
2597 edgeNumbers[3] = edgeNumbersTmp[i];
2598 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
2599 edgeNumbers[4] = edgeNumbersTmp[i];
2601 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2]){
2602 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
2603 edgeNumbers[5] = edgeNumbersTmp[i];
2618 vec_int_Type surfaceElementsIDs = surfaceTriangleElements->getSurfacesOfElement(indexElement);
2619 vec2D_int_Type originTriangles(4,vec_int_Type(3));
2621 originTriangles[0] = {nodeInd[0], nodeInd[1], nodeInd[2] };
2622 originTriangles[1] = {nodeInd[0], nodeInd[1], nodeInd[3] };
2623 originTriangles[2] = {nodeInd[0], nodeInd[2], nodeInd[3] };
2624 originTriangles[3] = {nodeInd[1], nodeInd[2], nodeInd[3] };
2626 vec_int_Type originFlag(4,this->volumeID_);
2628 vec_bool_Type interfaceSurface(4);
2629 vec_LO_Type triTmp(3);
2630 vec_int_Type originTriangleTmp(3);
2632 for(
int i=0; i< 4 ; i++){
2633 originTriangleTmp = originTriangles[i];
2634 sort(originTriangleTmp.begin(),originTriangleTmp.end());
2635 for(
int j=0; j<4 ; j++){
2636 FiniteElement surfaceTmp = surfaceTriangleElements->getElement(surfaceElementsIDs[j]);
2637 triTmp = surfaceTmp.getVectorNodeList();
2638 sort(triTmp.begin(),triTmp.end());
2639 if(triTmp[0] == originTriangleTmp[0] && triTmp[1] == originTriangleTmp[1] && triTmp[2] == originTriangleTmp[2] ) {
2640 originFlag[i] = surfaceTmp.getFlag();
2641 interfaceSurface[i] = surfaceTmp.isInterfaceElement();
2654 for(
int i=0; i<6; i++){
2655 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement()){
2656 midPointInd.push_back(edgeElements->getMidpoint(edgeNumbers[i]));
2664 vec2D_int_Type newElements(4, vec_int_Type( 0 ));
2665 vec2D_int_Type newEdges(24,vec_int_Type(0));
2666 vec2D_int_Type newTriangles(16,vec_int_Type(0));
2667 vec_int_Type newTrianglesFlag(16) ;
2668 vec_bool_Type isInterfaceSurface(16);
2669 vec_int_Type edgeFlags(24);
2670 vec_bool_Type isInterfaceEdge(24);
2671 vec_GO_Type predecessorElement(24);
2673 vec2D_LO_Type newTriangleEdgeIDs(4,vec_LO_Type(12));
2682 (newElements)[0]={nodeInd[0],nodeInd[2], midPointInd[0],midPointInd[1]};
2684 (newEdges)[0] = {nodeInd[0] ,nodeInd[2]};
2685 (newEdges)[1] = {nodeInd[0] ,midPointInd[0]};
2686 (newEdges)[2] = {nodeInd[0] ,midPointInd[1]};
2687 (newEdges)[3] = {nodeInd[2] ,midPointInd[0]};
2688 (newEdges)[4] = {nodeInd[2] ,midPointInd[1]};
2689 (newEdges)[5] = {midPointInd[0] ,midPointInd[1]};
2691 edgeFlags[0]=edgeElements->getElement(edgeNumbers[1]).getFlag();
2692 edgeFlags[1]=this->bcFlagRep_->at(midPointInd[0]);
2693 edgeFlags[2]=originFlag[2];
2694 edgeFlags[3]=originFlag[0];
2695 edgeFlags[4]=this->bcFlagRep_->at(midPointInd[1]);
2696 edgeFlags[5]=this->volumeID_;
2698 isInterfaceEdge[0] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
2699 isInterfaceEdge[1] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
2700 isInterfaceEdge[2] = interfaceSurface[2];
2701 isInterfaceEdge[3] = interfaceSurface[0];
2702 isInterfaceEdge[4] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
2703 isInterfaceEdge[5] =
false;
2705 predecessorElement[0] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
2706 predecessorElement[1] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
2707 predecessorElement[2] = -1;
2708 predecessorElement[3] = -1;
2709 predecessorElement[4] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
2710 predecessorElement[5] = -1;
2713 newTriangles[0]= {nodeInd[0],nodeInd[2],midPointInd[0]};
2714 newTriangles[1]= {nodeInd[0],nodeInd[2],midPointInd[1]};
2715 newTriangles[2]= {nodeInd[0],midPointInd[0],midPointInd[1]};
2716 newTriangles[3]= {nodeInd[2],midPointInd[0],midPointInd[1]};
2718 newTrianglesFlag[0]= originFlag[0];
2719 newTrianglesFlag[1]= originFlag[2];
2720 newTrianglesFlag[2]= this->volumeID_;
2721 newTrianglesFlag[3]= this->volumeID_;
2723 isInterfaceSurface[0]= interfaceSurface[0];
2724 isInterfaceSurface[1]= interfaceSurface[2];
2725 isInterfaceSurface[2]=
false;
2726 isInterfaceSurface[3]=
false;
2728 newTriangleEdgeIDs[0]={0,1,3,0,2,4,1,2,5,3,4,5};
2731 (newElements)[1]={nodeInd[1],nodeInd[2],midPointInd[0],midPointInd[1]};
2733 (newEdges)[6] = {nodeInd[1] ,nodeInd[2]};
2734 (newEdges)[7] = {nodeInd[1] ,midPointInd[0]};
2735 (newEdges)[8] = {nodeInd[1] ,midPointInd[1]};
2736 (newEdges)[9] = {nodeInd[2] ,midPointInd[0]};
2737 (newEdges)[10] = {nodeInd[2] ,midPointInd[1]};
2738 (newEdges)[11] = {midPointInd[0] ,midPointInd[1]};
2740 edgeFlags[6]=edgeElements->getElement(edgeNumbers[3]).getFlag();
2741 edgeFlags[7]=edgeElements->getElement(edgeNumbers[0]).getFlag();
2742 edgeFlags[8]=originFlag[3];
2743 edgeFlags[9]=originFlag[0];
2744 edgeFlags[10]=this->bcFlagRep_->at(midPointInd[1]);
2745 edgeFlags[11]=this->volumeID_;
2747 isInterfaceEdge[6] = edgeElements->getElement(edgeNumbers[3]).isInterfaceElement();
2748 isInterfaceEdge[7] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
2749 isInterfaceEdge[8] = interfaceSurface[3];
2750 isInterfaceEdge[9] = interfaceSurface[0];
2751 isInterfaceEdge[10] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
2752 isInterfaceEdge[11] =
false;
2754 predecessorElement[6] = this->edgeMap_->getGlobalElement(edgeNumbers[3]);
2755 predecessorElement[7] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
2756 predecessorElement[8] = -1;
2757 predecessorElement[9] = -1;
2758 predecessorElement[10] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
2759 predecessorElement[11] = -1;
2762 newTriangles[4]= {nodeInd[1],nodeInd[2],midPointInd[0]};
2763 newTriangles[5]= {nodeInd[1],nodeInd[2],midPointInd[1]};
2764 newTriangles[6]= {nodeInd[1],midPointInd[0],midPointInd[1]};
2765 newTriangles[7]= {nodeInd[2],midPointInd[0],midPointInd[1]};
2767 newTrianglesFlag[4]= originFlag[0];
2768 newTrianglesFlag[5]= originFlag[3];
2769 newTrianglesFlag[6]= this->volumeID_;
2770 newTrianglesFlag[7]= this->volumeID_;
2772 isInterfaceSurface[4]= interfaceSurface[0];
2773 isInterfaceSurface[5]= interfaceSurface[3];
2774 isInterfaceSurface[6]=
false;
2775 isInterfaceSurface[7]=
false;
2777 newTriangleEdgeIDs[1]={6,7,9,6,8,10,7,8,11,9,10,11};
2780 (newElements)[2]={nodeInd[0],nodeInd[3],midPointInd[0],midPointInd[1]};
2782 (newEdges)[12] = {nodeInd[0] ,nodeInd[3]};
2783 (newEdges)[13] = {nodeInd[0] ,midPointInd[0]};
2784 (newEdges)[14] = {nodeInd[0] ,midPointInd[1]};
2785 (newEdges)[15] = {nodeInd[3] ,midPointInd[0]};
2786 (newEdges)[16] = {nodeInd[3] ,midPointInd[1]};
2787 (newEdges)[17] = {midPointInd[0] ,midPointInd[1]};
2789 edgeFlags[12]=edgeElements->getElement(edgeNumbers[2]).getFlag();
2790 edgeFlags[13]=edgeElements->getElement(edgeNumbers[0]).getFlag();
2791 edgeFlags[14]=originFlag[2];
2792 edgeFlags[15]=originFlag[1];
2793 edgeFlags[16]=edgeElements->getElement(edgeNumbers[5]).getFlag();;
2794 edgeFlags[17]=this->volumeID_;
2796 isInterfaceEdge[12] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
2797 isInterfaceEdge[13] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
2798 isInterfaceEdge[14] = interfaceSurface[2];
2799 isInterfaceEdge[15] = interfaceSurface[1];
2800 isInterfaceEdge[16] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
2801 isInterfaceEdge[17] =
false;
2803 predecessorElement[12] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
2804 predecessorElement[13] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
2805 predecessorElement[14] = -1;
2806 predecessorElement[15] = -1;
2807 predecessorElement[16] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
2808 predecessorElement[17] = -1;
2811 newTriangles[8]= {nodeInd[0],nodeInd[3],midPointInd[0]};
2812 newTriangles[9]= {nodeInd[0],nodeInd[3],midPointInd[1]};
2813 newTriangles[10]= {nodeInd[0],midPointInd[0],midPointInd[1]};
2814 newTriangles[11]= {nodeInd[3],midPointInd[0],midPointInd[1]};
2816 newTrianglesFlag[8]= originFlag[1];
2817 newTrianglesFlag[9]= originFlag[2];
2818 newTrianglesFlag[10]= this->volumeID_;
2819 newTrianglesFlag[11]= this->volumeID_;
2821 isInterfaceSurface[8]= interfaceSurface[1];
2822 isInterfaceSurface[9]= interfaceSurface[2];
2823 isInterfaceSurface[10]=
false;
2824 isInterfaceSurface[11]=
false;
2826 newTriangleEdgeIDs[2]={8,9,11,8,10,12,9,10,13,11,12,13};
2830 (newElements)[3]={nodeInd[1],nodeInd[3],midPointInd[0],midPointInd[1]};
2832 (newEdges)[18] = {nodeInd[1] ,nodeInd[3]};
2833 (newEdges)[19] = {nodeInd[1] ,midPointInd[0]};
2834 (newEdges)[20] = {nodeInd[1] ,midPointInd[1]};
2835 (newEdges)[21] = {nodeInd[3] ,midPointInd[0]};
2836 (newEdges)[22] = {nodeInd[3] ,midPointInd[1]};
2837 (newEdges)[23] = {midPointInd[0] ,midPointInd[1]};
2839 edgeFlags[18]=edgeElements->getElement(edgeNumbers[4]).getFlag();
2840 edgeFlags[19]=edgeElements->getElement(edgeNumbers[0]).getFlag();
2841 edgeFlags[20]=originFlag[3];
2842 edgeFlags[21]=originFlag[1];
2843 edgeFlags[22]=edgeElements->getElement(edgeNumbers[5]).getFlag();;
2844 edgeFlags[23]=this->volumeID_;
2846 isInterfaceEdge[18] = edgeElements->getElement(edgeNumbers[4]).isInterfaceElement();
2847 isInterfaceEdge[19] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
2848 isInterfaceEdge[20] = interfaceSurface[3];
2849 isInterfaceEdge[21] = interfaceSurface[1];
2850 isInterfaceEdge[22] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
2851 isInterfaceEdge[23] =
false;
2853 predecessorElement[18] = this->edgeMap_->getGlobalElement(edgeNumbers[4]);
2854 predecessorElement[19] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
2855 predecessorElement[20] = -1;
2856 predecessorElement[21] = -1;
2857 predecessorElement[22] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
2858 predecessorElement[23] = -1;
2861 newTriangles[12]= {nodeInd[1],nodeInd[3],midPointInd[0]};
2862 newTriangles[13]= {nodeInd[1],nodeInd[3],midPointInd[1]};
2863 newTriangles[14]= {nodeInd[1],midPointInd[0],midPointInd[1]};
2864 newTriangles[15]= {nodeInd[3],midPointInd[0],midPointInd[1]};
2866 newTrianglesFlag[12]= originFlag[1];
2867 newTrianglesFlag[13]= originFlag[3];
2868 newTrianglesFlag[14]= this->volumeID_;
2869 newTrianglesFlag[15]= this->volumeID_;
2871 isInterfaceSurface[12]= interfaceSurface[1];
2872 isInterfaceSurface[13]= interfaceSurface[3];
2873 isInterfaceSurface[14]=
false;
2874 isInterfaceSurface[15]=
false;
2876 newTriangleEdgeIDs[3]={18,19,21,18,20,22,19,20,23,21,22,23};
2881 int offsetElements = this->elementsC_->numberElements();
2882 int offsetEdges = this->edgeElements_->numberElements();
2883 for(
int i=0;i<4; i++){
2884 sort( newElements.at(i).begin(), newElements.at(i).end() );
2886 feNew.setFiniteElementRefinementType(
"irregular");
2887 feNew.setPredecessorElement(indexElement);
2889 this->elementsC_->addElement(feNew);
2891 this->elementsC_->switchElement(indexElement,feNew);
2895 for(
int i=0;i<24; i++){
2896 sort( newEdges.at(i).begin(), newEdges.at(i).end() );
2898 feNew.setInterfaceElement(isInterfaceEdge[i]);
2899 feNew.setPredecessorElement(predecessorElement[i]);
2901 this->edgeElements_->addEdge(feNew,i/6+offsetElements);
2904 this->edgeElements_->addEdge(feNew,indexElement);
2908 int offsetSurface=0;
2909 for(
int i=0;i<16; i++){
2910 sort( newTriangles.at(i).begin(), newTriangles.at(i).end() );
2912 feNew.setInterfaceElement(isInterfaceSurface[i]);
2914 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
2915 if ( !this->elementsC_->getElement(i/4+offsetElements).subElementsInitialized() )
2916 this->elementsC_->getElement(i/4+offsetElements).initializeSubElements( this->FEType_, this->dim_ -1) ;
2917 this->elementsC_->getElement(i/4+offsetElements).addSubElement(feNew);
2919 this->surfaceTriangleElements_->addSurface(feNew, i/4+offsetElements);
2922 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
2923 if ( !this->elementsC_->getElement(indexElement).subElementsInitialized() )
2924 this->elementsC_->getElement(indexElement).initializeSubElements( this->FEType_, this->dim_ -1) ;
2925 this->elementsC_->getElement(indexElement).addSubElement(feNew);
2927 this->surfaceTriangleElements_->addSurface(feNew, indexElement);
2932 for(
int i=0;i<4; i++){
2934 element = this->elementsC_->getElement(i+offsetElements);
2936 element = this->elementsC_->getElement(indexElement);
2938 for(
int j=0; j<24 ; j++){
2939 FiniteElement feEdge = this->edgeElements_->getElement(j+offsetEdges);
2940 if(feEdge.getFlag() != this->volumeID_){
2942 element.addSubElement( feEdge );
2943 else if ( !element.subElementsInitialized() ){
2944 element.initializeSubElements(
"P1", 1 );
2945 element.addSubElement( feEdge );
2949 ElementsPtr_Type surfaces = element.getSubElements();
2951 surfaces->setToCorrectElement( feEdge );
2959 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"The Type 4 irregular Refinement Method you requested is only applicable to a 3 dimensional Mesh. Please reconsider.");
2980 if(this->dim_ == 3){
2985 vec_int_Type midPointInd(0);
2986 vec_int_Type edgeNumbers = edgeElements->getEdgesOfElement(indexElement);
2987 vec_int_Type edgeNumbersUntagged(0);
2989 vec_int_Type nodeInd(0);
2990 for(
int i=0; i<6; i++){
2991 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement()){
2992 nodeInd.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(0));
2993 nodeInd.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(1));
2996 edgeNumbersUntagged.push_back(edgeNumbers[i]);
2998 sort( nodeInd.begin(), nodeInd.end() );
2999 vec_int_Type nodeIndTmp = nodeInd;
3000 nodeInd.erase( unique( nodeInd.begin(), nodeInd.end() ), nodeInd.end() );
3004 int entryCommonNode;
3005 vec_int_Type leftOverNodes(0);
3006 for(
int i=0; i<3; i++){
3007 if(nodeIndTmp[i] == nodeIndTmp[i+1]){
3008 commonNode=nodeIndTmp[i];
3013 for(
int i=0; i<3; i++){
3014 if(nodeInd[i] != commonNode){
3015 leftOverNodes.push_back(nodeInd[i]);
3021 vec_dbl_Type length(2);
3022 vec_dbl_Type P1(3),P2(3);
3023 double maxLength=0.0;
3027 for(
int i=0;i<2;i++){
3029 p2ID =leftOverNodes[i];
3030 P1 = this->pointsRep_->at(p1ID);
3031 P2 = this->pointsRep_->at(p2ID);
3032 length[i] = std::sqrt(std::pow(P1[0]-P2[0],2)+std::pow(P1[1]-P2[1],2)+std::pow(P1[2]-P2[2],2));
3033 if(length[i] > maxLength){
3034 maxLength = length[i];
3040 nodeInd[0] = commonNode;
3041 nodeInd[1] = leftOverNodes[minEntry];
3042 nodeInd[2] = leftOverNodes[maxEntry];
3046 for(
int i=0; i<4; i++){
3047 if(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(0) == nodeInd[0])
3048 nodeInd.push_back(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(1));
3049 else if(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(1) == nodeInd[0])
3050 nodeInd.push_back(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(0));
3063 vec_int_Type edgeNumbersTmp = edgeNumbers;
3064 for(
int i=0; i<6; i++){
3065 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[0] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[0]){
3066 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1])
3067 edgeNumbers[0] = edgeNumbersTmp[i];
3068 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
3069 edgeNumbers[1] = edgeNumbersTmp[i];
3070 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3071 edgeNumbers[2] = edgeNumbersTmp[i];
3073 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1]){
3074 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
3075 edgeNumbers[3] = edgeNumbersTmp[i];
3076 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3077 edgeNumbers[4] = edgeNumbersTmp[i];
3079 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2]){
3080 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3081 edgeNumbers[5] = edgeNumbersTmp[i];
3096 vec_int_Type surfaceElementsIDs = surfaceTriangleElements->getSurfacesOfElement(indexElement);
3097 vec2D_int_Type originTriangles(4,vec_int_Type(3));
3099 originTriangles[0] = {nodeInd[0], nodeInd[1], nodeInd[2] };
3100 originTriangles[1] = {nodeInd[0], nodeInd[1], nodeInd[3] };
3101 originTriangles[2] = {nodeInd[0], nodeInd[2], nodeInd[3] };
3102 originTriangles[3] = {nodeInd[1], nodeInd[2], nodeInd[3] };
3106 vec_int_Type originFlag(4,this->volumeID_);
3108 vec_bool_Type interfaceSurface(4);
3109 vec_LO_Type triTmp(3);
3110 vec_int_Type originTriangleTmp(3);
3112 for(
int i=0; i< 4 ; i++){
3113 originTriangleTmp = originTriangles[i];
3114 sort(originTriangleTmp.begin(),originTriangleTmp.end());
3115 for(
int j=0; j<4 ; j++){
3116 FiniteElement surfaceTmp = surfaceTriangleElements->getElement(surfaceElementsIDs[j]);
3117 triTmp = surfaceTmp.getVectorNodeList();
3118 sort(triTmp.begin(),triTmp.end());
3119 if(triTmp[0] == originTriangleTmp[0] && triTmp[1] == originTriangleTmp[1] && triTmp[2] == originTriangleTmp[2] ) {
3120 originFlag[i] = surfaceTmp.getFlag();
3121 interfaceSurface[i] = surfaceTmp.isInterfaceElement();
3134 for(
int i=0; i<6; i++){
3135 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement()){
3136 midPointInd.push_back(edgeElements->getMidpoint(edgeNumbers[i]));
3143 vec2D_int_Type newElements(3, vec_int_Type( 0 ));
3144 vec2D_int_Type newEdges(18,vec_int_Type(0));
3145 vec2D_int_Type newTriangles(12,vec_int_Type(0));
3146 vec_int_Type newTrianglesFlag(12) ;
3147 vec_int_Type isInterfaceSurface(12);
3148 vec_int_Type edgeFlags(18);
3149 vec_bool_Type isInterfaceEdge(18);
3150 vec_GO_Type predecessorElement(18);
3152 vec2D_LO_Type newTriangleEdgeIDs(3,vec_LO_Type(12));
3161 (newElements)[0]={nodeInd[0],nodeInd[3], midPointInd[0],midPointInd[1]};
3163 (newEdges)[0] = {nodeInd[0] ,nodeInd[3]};
3164 (newEdges)[1] = {nodeInd[0] ,midPointInd[0]};
3165 (newEdges)[2] = {nodeInd[0] ,midPointInd[1]};
3166 (newEdges)[3] = {nodeInd[3] ,midPointInd[0]};
3167 (newEdges)[4] = {nodeInd[3] ,midPointInd[1]};
3168 (newEdges)[5] = {midPointInd[0] ,midPointInd[1]};
3170 edgeFlags[0]=edgeElements->getElement(edgeNumbers[2]).getFlag();
3171 edgeFlags[1]=this->bcFlagRep_->at(midPointInd[0]);
3172 edgeFlags[2]=this->bcFlagRep_->at(midPointInd[1]);
3173 edgeFlags[3]=originFlag[1];
3174 edgeFlags[4]=originFlag[2];
3175 edgeFlags[5]=originFlag[0];
3177 isInterfaceEdge[0] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
3178 isInterfaceEdge[1] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
3179 isInterfaceEdge[2] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
3180 isInterfaceEdge[3] = interfaceSurface[1];
3181 isInterfaceEdge[4] = interfaceSurface[2];
3182 isInterfaceEdge[5] = interfaceSurface[0];
3184 predecessorElement[0] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
3185 predecessorElement[1] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
3186 predecessorElement[2] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
3187 predecessorElement[3] = -1;
3188 predecessorElement[4] = -1;
3189 predecessorElement[5] = -1;
3192 newTriangles[0]= {nodeInd[0],nodeInd[3],midPointInd[0]};
3193 newTriangles[1]= {nodeInd[0],nodeInd[3],midPointInd[1]};
3194 newTriangles[2]= {nodeInd[0],midPointInd[0],midPointInd[1]};
3195 newTriangles[3]= {nodeInd[3],midPointInd[0],midPointInd[1]};
3197 newTrianglesFlag[0]= originFlag[1];
3198 newTrianglesFlag[1]= originFlag[2];
3199 newTrianglesFlag[2]= originFlag[0];
3200 newTrianglesFlag[3]= this->volumeID_;
3202 isInterfaceSurface[0]= interfaceSurface[1];
3203 isInterfaceSurface[1]= interfaceSurface[2];
3204 isInterfaceSurface[2]= interfaceSurface[0];
3205 isInterfaceSurface[3]=
false;
3207 newTriangleEdgeIDs[0]={0,1,3,0,2,4,1,2,5,3,4,5};
3210 (newElements)[1]={nodeInd[1],nodeInd[2],nodeInd[3],midPointInd[0]};
3212 (newEdges)[6] = {nodeInd[1] ,nodeInd[2]};
3213 (newEdges)[7] = {nodeInd[1] ,nodeInd[3]};
3214 (newEdges)[8] = {nodeInd[1] ,midPointInd[0]};
3215 (newEdges)[9] = {nodeInd[2] ,nodeInd[3]};
3216 (newEdges)[10] = {nodeInd[2] ,midPointInd[0]};
3217 (newEdges)[11] = {nodeInd[3] ,midPointInd[0]};
3219 edgeFlags[6]=edgeElements->getElement(edgeNumbers[3]).getFlag();
3220 edgeFlags[7]=edgeElements->getElement(edgeNumbers[4]).getFlag();
3221 edgeFlags[8]=edgeElements->getElement(edgeNumbers[0]).getFlag();
3222 edgeFlags[9]=edgeElements->getElement(edgeNumbers[5]).getFlag();
3223 edgeFlags[10]=originFlag[0];
3224 edgeFlags[11]=originFlag[1];
3226 isInterfaceEdge[6] = edgeElements->getElement(edgeNumbers[3]).isInterfaceElement();
3227 isInterfaceEdge[7] = edgeElements->getElement(edgeNumbers[4]).isInterfaceElement();
3228 isInterfaceEdge[8] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
3229 isInterfaceEdge[9] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
3230 isInterfaceEdge[10] = interfaceSurface[0];
3231 isInterfaceEdge[11] = interfaceSurface[1];
3233 predecessorElement[6] = this->edgeMap_->getGlobalElement(edgeNumbers[3]);
3234 predecessorElement[7] = this->edgeMap_->getGlobalElement(edgeNumbers[4]);
3235 predecessorElement[8] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
3236 predecessorElement[9] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
3237 predecessorElement[10] = -1;
3238 predecessorElement[11] = -1;
3241 newTriangles[4]= {nodeInd[1],nodeInd[2],nodeInd[3]};
3242 newTriangles[5]= {nodeInd[1],nodeInd[2],midPointInd[0]};
3243 newTriangles[6]= {nodeInd[1],nodeInd[3],midPointInd[0]};
3244 newTriangles[7]= {nodeInd[2],nodeInd[3],midPointInd[0]};
3246 newTrianglesFlag[4]= originFlag[3];
3247 newTrianglesFlag[5]= originFlag[0];
3248 newTrianglesFlag[6]= originFlag[1];
3249 newTrianglesFlag[7]= this->volumeID_;
3251 isInterfaceSurface[4]= interfaceSurface[3];
3252 isInterfaceSurface[5]= interfaceSurface[0];
3253 isInterfaceSurface[6]= interfaceSurface[1];
3254 isInterfaceSurface[7]=
false;
3256 newTriangleEdgeIDs[1]={6,7,9,6,8,10,7,8,11,9,10,11};
3258 (newElements)[2]={nodeInd[2],nodeInd[3],midPointInd[0],midPointInd[1]};
3260 (newEdges)[12] = {nodeInd[2] ,nodeInd[3]};
3261 (newEdges)[13] = {nodeInd[2] ,midPointInd[0]};
3262 (newEdges)[14] = {nodeInd[2] ,midPointInd[1]};
3263 (newEdges)[15] = {nodeInd[3] ,midPointInd[0]};
3264 (newEdges)[16] = {nodeInd[3] ,midPointInd[1]};
3265 (newEdges)[17] = {midPointInd[0] ,midPointInd[1]};
3267 edgeFlags[12]=edgeElements->getElement(edgeNumbers[5]).getFlag();
3268 edgeFlags[13]=originFlag[0];
3269 edgeFlags[14]=edgeElements->getElement(edgeNumbers[1]).getFlag();
3270 edgeFlags[15]=originFlag[1];
3271 edgeFlags[16]=originFlag[2];
3272 edgeFlags[17]=originFlag[0];
3274 isInterfaceEdge[12] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
3275 isInterfaceEdge[13] = interfaceSurface[0];
3276 isInterfaceEdge[14] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
3277 isInterfaceEdge[15] = interfaceSurface[1];
3278 isInterfaceEdge[16] = interfaceSurface[2];
3279 isInterfaceEdge[17] = interfaceSurface[0];
3281 predecessorElement[12] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
3282 predecessorElement[13] = -1;
3283 predecessorElement[14] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
3284 predecessorElement[15] = -1;
3285 predecessorElement[16] = -1;
3286 predecessorElement[17] = -1;
3289 newTriangles[8]= {nodeInd[2],nodeInd[3],midPointInd[0]};
3290 newTriangles[9]= {nodeInd[2],nodeInd[3],midPointInd[1]};
3291 newTriangles[10]= {nodeInd[2],midPointInd[0],midPointInd[1]};
3292 newTriangles[11]= {nodeInd[3],midPointInd[0],midPointInd[1]};
3294 newTrianglesFlag[8]=this->volumeID_;
3295 newTrianglesFlag[9]= originFlag[2];
3296 newTrianglesFlag[10]= originFlag[0];
3297 newTrianglesFlag[11]= this->volumeID_;
3299 isInterfaceSurface[8]=
false;
3300 isInterfaceSurface[9]= interfaceSurface[2];
3301 isInterfaceSurface[10]= interfaceSurface[0];
3302 isInterfaceSurface[11]=
false;
3304 newTriangleEdgeIDs[2]={8,9,11,8,10,12,9,10,13,11,12,13};
3311 int offsetElements = this->elementsC_->numberElements();
3312 int offsetEdges = this->edgeElements_->numberElements();
3313 for(
int i=0;i<3; i++){
3314 sort( newElements.at(i).begin(), newElements.at(i).end() );
3316 feNew.setFiniteElementRefinementType(
"irregular");
3317 feNew.setPredecessorElement(indexElement);
3319 this->elementsC_->addElement(feNew);
3321 this->elementsC_->switchElement(indexElement,feNew);
3325 for(
int i=0;i<18; i++){
3326 sort( newEdges.at(i).begin(), newEdges.at(i).end() );
3328 feNew.setInterfaceElement(isInterfaceEdge[i]);
3329 feNew.setPredecessorElement(predecessorElement[i]);
3331 this->edgeElements_->addEdge(feNew,i/6+offsetElements);
3334 this->edgeElements_->addEdge(feNew,indexElement);
3338 int offsetSurface =0;
3339 for(
int i=0;i<12; i++){
3340 sort( newTriangles.at(i).begin(), newTriangles.at(i).end() );
3342 feNew.setInterfaceElement(isInterfaceSurface[i]);
3344 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
3345 if ( !this->elementsC_->getElement(i/4+offsetElements).subElementsInitialized() )
3346 this->elementsC_->getElement(i/4+offsetElements).initializeSubElements( this->FEType_, this->dim_ -1) ;
3347 this->elementsC_->getElement(i/4+offsetElements).addSubElement(feNew);
3349 this->surfaceTriangleElements_->addSurface(feNew, i/4+offsetElements);
3352 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
3353 if ( !this->elementsC_->getElement(indexElement).subElementsInitialized() )
3354 this->elementsC_->getElement(indexElement).initializeSubElements( this->FEType_, this->dim_ -1) ;
3355 this->elementsC_->getElement(indexElement).addSubElement(feNew);
3357 this->surfaceTriangleElements_->addSurface(feNew, indexElement);
3362 for(
int i=0;i<3; i++){
3364 element = this->elementsC_->getElement(i+offsetElements);
3366 element = this->elementsC_->getElement(indexElement);
3368 for(
int j=0; j<18 ; j++){
3369 FiniteElement feEdge = this->edgeElements_->getElement(j+offsetEdges);
3370 if(feEdge.getFlag() != this->volumeID_){
3372 element.addSubElement( feEdge );
3373 else if ( !element.subElementsInitialized() ){
3374 element.initializeSubElements(
"P1", 1 );
3375 element.addSubElement( feEdge );
3379 ElementsPtr_Type surfaces = element.getSubElements();
3381 surfaces->setToCorrectElement( feEdge );
3389 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"The Type 1 irregular Refinement Method you requested is only applicable to a 3 dimensional Mesh. Please reconsider.");
3411 if(this->dim_ == 3){
3418 vec_int_Type midPointInd( 1 );
3419 vec_int_Type edgeNumbers = edgeElements->getEdgesOfElement(indexElement);
3420 vec_int_Type edgeNumbersUntagged(0);
3422 vec_int_Type nodeInd(0);
3423 for(
int i=0; i<6; i++){
3424 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement()){
3425 nodeInd.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(0));
3426 nodeInd.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(1));
3429 edgeNumbersUntagged.push_back(edgeNumbers[i]);
3431 sort( nodeInd.begin(), nodeInd.end() );
3432 nodeInd.erase( unique( nodeInd.begin(), nodeInd.end() ), nodeInd.end() );
3436 vec_int_Type nodeIndTmp(0);
3437 for(
int i=0; i<5; i++){
3438 if(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(0) == nodeInd[0])
3439 nodeIndTmp.push_back(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(1));
3440 else if(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(1) == nodeInd[0])
3441 nodeIndTmp.push_back(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(0));
3442 else if(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(0) == nodeInd[1])
3443 nodeIndTmp.push_back(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(1));
3444 else if(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(1) == nodeInd[1])
3445 nodeIndTmp.push_back(edgeElements->getElement(edgeNumbersUntagged[i]).getNode(0));
3448 sort( nodeIndTmp.begin(), nodeIndTmp.end() );
3449 nodeIndTmp.erase( unique( nodeIndTmp.begin(), nodeIndTmp.end() ), nodeIndTmp.end() );
3452 nodeInd.push_back(nodeIndTmp[0]);
3453 nodeInd.push_back(nodeIndTmp[1]);
3465 vec_int_Type edgeNumbersTmp = edgeNumbers;
3466 for(
int i=0; i<6; i++){
3467 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[0] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[0]){
3468 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1])
3469 edgeNumbers[0] = edgeNumbersTmp[i];
3470 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
3471 edgeNumbers[1] = edgeNumbersTmp[i];
3472 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3473 edgeNumbers[2] = edgeNumbersTmp[i];
3475 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1]){
3476 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
3477 edgeNumbers[3] = edgeNumbersTmp[i];
3478 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3479 edgeNumbers[4] = edgeNumbersTmp[i];
3481 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2]){
3482 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3483 edgeNumbers[5] = edgeNumbersTmp[i];
3498 vec_int_Type surfaceElementsIDs = surfaceTriangleElements->getSurfacesOfElement(indexElement);
3499 vec2D_int_Type originTriangles(4,vec_int_Type(3));
3501 originTriangles[0] = {nodeInd[0], nodeInd[1], nodeInd[2] };
3502 originTriangles[1] = {nodeInd[0], nodeInd[1], nodeInd[3] };
3503 originTriangles[2] = {nodeInd[0], nodeInd[2], nodeInd[3] };
3504 originTriangles[3] = {nodeInd[1], nodeInd[2], nodeInd[3] };
3508 vec_int_Type originFlag(4,this->volumeID_);
3510 vec_bool_Type interfaceSurface(4);
3511 vec_LO_Type triTmp(3);
3512 vec_int_Type originTriangleTmp(3);
3514 for(
int i=0; i< 4 ; i++){
3515 originTriangleTmp = originTriangles[i];
3516 sort(originTriangleTmp.begin(),originTriangleTmp.end());
3517 for(
int j=0; j<4 ; j++){
3518 FiniteElement surfaceTmp = surfaceTriangleElements->getElement(surfaceElementsIDs[j]);
3519 triTmp = surfaceTmp.getVectorNodeList();
3520 sort(triTmp.begin(),triTmp.end());
3521 if(triTmp[0] == originTriangleTmp[0] && triTmp[1] == originTriangleTmp[1] && triTmp[2] == originTriangleTmp[2] ) {
3522 originFlag[i] = surfaceTmp.getFlag();
3523 interfaceSurface[i] = surfaceTmp.isInterfaceElement();
3536 for(
int i=0; i<6; i++){
3537 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement()){
3538 midPointInd[0] = edgeElements->getMidpoint(edgeNumbers[i]);
3545 vec2D_int_Type newElements(2, vec_int_Type( 0 ));
3546 vec2D_int_Type newEdges(12,vec_int_Type(0));
3547 vec2D_int_Type newTriangles(8,vec_int_Type(0));
3548 vec_int_Type newTrianglesFlag(8) ;
3549 vec_bool_Type isInterfaceSurface(8);
3550 vec_int_Type edgeFlags(12);
3551 vec_bool_Type isInterfaceEdge(12);
3552 vec_GO_Type predecessorElement(12);
3554 vec2D_LO_Type newTriangleEdgeIDs(2,vec_LO_Type(12));
3563 (newElements)[0]={nodeInd[0],nodeInd[2],nodeInd[3],midPointInd[0]};
3565 (newEdges)[0] = {nodeInd[0] ,nodeInd[2]};
3566 (newEdges)[1] = {nodeInd[0] ,nodeInd[3]};
3567 (newEdges)[2] = {nodeInd[0] ,midPointInd[0]};
3568 (newEdges)[3] = {nodeInd[2] ,nodeInd[3]};
3569 (newEdges)[4] = {nodeInd[2] ,midPointInd[0]};
3570 (newEdges)[5] = {nodeInd[3] ,midPointInd[0]};
3572 edgeFlags[0]=edgeElements->getElement(edgeNumbers[1]).getFlag();
3573 edgeFlags[1]=edgeElements->getElement(edgeNumbers[2]).getFlag();
3574 edgeFlags[2]=this->bcFlagRep_->at(midPointInd[0]);
3575 edgeFlags[3]=edgeElements->getElement(edgeNumbers[5]).getFlag();
3576 edgeFlags[4]=originFlag[0];
3577 edgeFlags[5]=originFlag[1];
3579 isInterfaceEdge[0] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
3580 isInterfaceEdge[1] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
3581 isInterfaceEdge[2] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
3582 isInterfaceEdge[3] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();;
3583 isInterfaceEdge[4] = interfaceSurface[0];
3584 isInterfaceEdge[5] = interfaceSurface[1];
3586 predecessorElement[0] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
3587 predecessorElement[1] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
3588 predecessorElement[2] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
3589 predecessorElement[3] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
3590 predecessorElement[4] = -1;
3591 predecessorElement[5] = -1;
3594 newTriangles[0]= {nodeInd[0],nodeInd[2],nodeInd[3]};
3595 newTriangles[1]= {nodeInd[0],nodeInd[2],midPointInd[0]};
3596 newTriangles[2]= {nodeInd[0],nodeInd[3],midPointInd[0]};
3597 newTriangles[3]= {nodeInd[2],nodeInd[3],midPointInd[0]};
3599 newTrianglesFlag[0]= originFlag[2];
3600 newTrianglesFlag[1]= originFlag[0];
3601 newTrianglesFlag[2]= originFlag[1];
3602 newTrianglesFlag[3]= this->volumeID_;
3604 isInterfaceSurface[0] = interfaceSurface[2];
3605 isInterfaceSurface[1] = interfaceSurface[0];
3606 isInterfaceSurface[2] = interfaceSurface[1];
3607 isInterfaceSurface[3] =
false;
3609 newTriangleEdgeIDs[0]={0,1,3,0,2,4,1,2,5,3,4,5};
3612 (newElements)[1]={nodeInd[1],nodeInd[2],nodeInd[3],midPointInd[0]};
3614 (newEdges)[6] = {nodeInd[1] ,nodeInd[2]};
3615 (newEdges)[7] = {nodeInd[1] ,nodeInd[3]};
3616 (newEdges)[8] = {nodeInd[1] ,midPointInd[0]};
3617 (newEdges)[9] = {nodeInd[2] ,nodeInd[3]};
3618 (newEdges)[10] = {nodeInd[2] ,midPointInd[0]};
3619 (newEdges)[11] = {nodeInd[3] ,midPointInd[0]};
3621 edgeFlags[6]=edgeElements->getElement(edgeNumbers[3]).getFlag();
3622 edgeFlags[7]=edgeElements->getElement(edgeNumbers[4]).getFlag();
3623 edgeFlags[8]=edgeElements->getElement(edgeNumbers[0]).getFlag();
3624 edgeFlags[9]=edgeElements->getElement(edgeNumbers[5]).getFlag();
3625 edgeFlags[10]=originFlag[0];
3626 edgeFlags[11]=originFlag[1];
3628 isInterfaceEdge[6] = edgeElements->getElement(edgeNumbers[3]).isInterfaceElement();
3629 isInterfaceEdge[7] = edgeElements->getElement(edgeNumbers[4]).isInterfaceElement();
3630 isInterfaceEdge[8] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
3631 isInterfaceEdge[9] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
3632 isInterfaceEdge[10] = interfaceSurface[0];
3633 isInterfaceEdge[11] = interfaceSurface[1];
3635 predecessorElement[6] = this->edgeMap_->getGlobalElement(edgeNumbers[3]);
3636 predecessorElement[7] = this->edgeMap_->getGlobalElement(edgeNumbers[4]);
3637 predecessorElement[8] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
3638 predecessorElement[9] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
3639 predecessorElement[10] = -1;
3640 predecessorElement[11] = -1;
3643 newTriangles[4]= {nodeInd[1],nodeInd[2],nodeInd[3]};
3644 newTriangles[5]= {nodeInd[1],nodeInd[2],midPointInd[0]};
3645 newTriangles[6]= {nodeInd[1],nodeInd[3],midPointInd[0]};
3646 newTriangles[7]= {nodeInd[2],nodeInd[3],midPointInd[0]};
3648 newTrianglesFlag[4]= originFlag[3];
3649 newTrianglesFlag[5]= originFlag[0];
3650 newTrianglesFlag[6]= originFlag[1];
3651 newTrianglesFlag[7]= this->volumeID_;
3653 isInterfaceSurface[4] = interfaceSurface[3];
3654 isInterfaceSurface[5] = interfaceSurface[0];
3655 isInterfaceSurface[6] = interfaceSurface[1];
3656 isInterfaceSurface[7] =
false;
3658 newTriangleEdgeIDs[1]={6,7,9,6,8,10,7,8,11,9,10,11};
3663 int offsetElements = this->elementsC_->numberElements();
3664 int offsetEdges = this->edgeElements_->numberElements();
3665 for(
int i=0;i<2; i++){
3666 sort( newElements.at(i).begin(), newElements.at(i).end() );
3668 feNew.setFiniteElementRefinementType(
"irregular");
3669 if(refinementMode_ ==
"Bisection")
3670 feNew.setFiniteElementRefinementType(
"regular");
3671 feNew.setPredecessorElement(indexElement);
3673 this->elementsC_->addElement(feNew);
3675 this->elementsC_->switchElement(indexElement,feNew);
3679 for(
int i=0;i<12; i++){
3680 sort( newEdges.at(i).begin(), newEdges.at(i).end() );
3682 feNew.setInterfaceElement(isInterfaceEdge[i]);
3683 feNew.setPredecessorElement(predecessorElement[i]);
3685 this->edgeElements_->addEdge(feNew,i/6+offsetElements);
3688 this->edgeElements_->addEdge(feNew,indexElement);
3692 int offsetSurface =0;
3693 for(
int i=0;i<8; i++){
3694 sort( newTriangles.at(i).begin(), newTriangles.at(i).end() );
3696 feNew.setInterfaceElement(isInterfaceSurface[i]);
3698 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
3699 if ( !this->elementsC_->getElement(i/4+offsetElements).subElementsInitialized() )
3700 this->elementsC_->getElement(i/4+offsetElements).initializeSubElements( this->FEType_, this->dim_ -1) ;
3701 this->elementsC_->getElement(i/4+offsetElements).addSubElement(feNew);
3703 this->surfaceTriangleElements_->addSurface(feNew, i/4+offsetElements);
3706 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
3707 if ( !this->elementsC_->getElement(indexElement).subElementsInitialized() )
3708 this->elementsC_->getElement(indexElement).initializeSubElements( this->FEType_, this->dim_ -1) ;
3709 this->elementsC_->getElement(indexElement).addSubElement(feNew);
3711 this->surfaceTriangleElements_->addSurface(feNew, indexElement);
3717 for(
int i=0;i<2; i++){
3719 element = this->elementsC_->getElement(i+offsetElements);
3721 element = this->elementsC_->getElement(indexElement);
3723 for(
int j=0; j<12 ; j++){
3724 FiniteElement feEdge = this->edgeElements_->getElement(j+offsetEdges);
3725 if(feEdge.getFlag() != this->volumeID_){
3727 element.addSubElement( feEdge );
3728 else if ( !element.subElementsInitialized() ){
3729 element.initializeSubElements(
"P1", 1 );
3730 element.addSubElement( feEdge );
3734 ElementsPtr_Type surfaces = element.getSubElements();
3736 surfaces->setToCorrectElement( feEdge );
3743 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"The Type 1 irregular Refinement Method you requested is only applicable to a 3 dimensional Mesh. Please reconsider.");
3764 if(this->dim_ == 3){
3771 vec_int_Type midPointInd(0);
3772 vec_int_Type edgeNumbers = edgeElements->getEdgesOfElement(indexElement);
3773 vec_int_Type edgeNumbersUntagged(0);
3775 vec_int_Type nodeInd(0);
3777 for(
int i=0; i<6; i++){
3778 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement()){
3779 nodeInd.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(0));
3780 nodeInd.push_back(edgeElements->getElement(edgeNumbers[i]).getNode(1));
3783 edgeNumbersUntagged.push_back(edgeNumbers[i]);
3785 sort( nodeInd.begin(), nodeInd.end() );
3786 nodeInd.erase( unique( nodeInd.begin(), nodeInd.end() ), nodeInd.end() );
3790 for(
int i=0; i<3; i++){
3791 if(edgeElements->getElement(edgeNumbersUntagged[0]).getNode(0) == nodeInd[i])
3792 nodeInd.push_back(edgeElements->getElement(edgeNumbersUntagged[0]).getNode(1));
3793 if(edgeElements->getElement(edgeNumbersUntagged[0]).getNode(1) == nodeInd[i])
3794 nodeInd.push_back(edgeElements->getElement(edgeNumbersUntagged[0]).getNode(0));
3807 vec_int_Type edgeNumbersTmp = edgeNumbers;
3808 for(
int i=0; i<6; i++){
3809 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[0] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[0]){
3810 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1])
3811 edgeNumbers[0] = edgeNumbersTmp[i];
3812 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
3813 edgeNumbers[1] = edgeNumbersTmp[i];
3814 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3815 edgeNumbers[2] = edgeNumbersTmp[i];
3817 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1]){
3818 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
3819 edgeNumbers[3] = edgeNumbersTmp[i];
3820 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3821 edgeNumbers[4] = edgeNumbersTmp[i];
3823 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2]){
3824 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
3825 edgeNumbers[5] = edgeNumbersTmp[i];
3841 vec_int_Type surfaceElementsIDs = surfaceTriangleElements->getSurfacesOfElement(indexElement);
3842 vec2D_int_Type originTriangles(4,vec_int_Type(3));
3844 originTriangles[0] = {nodeInd[0], nodeInd[1], nodeInd[2] };
3845 originTriangles[1] = {nodeInd[0], nodeInd[1], nodeInd[3] };
3846 originTriangles[2] = {nodeInd[0], nodeInd[2], nodeInd[3] };
3847 originTriangles[3] = {nodeInd[1], nodeInd[2], nodeInd[3] };
3849 vec_int_Type originFlag(4,this->volumeID_);
3851 vec_bool_Type interfaceSurface(4);
3852 vec_LO_Type triTmp(3);
3853 vec_int_Type originTriangleTmp(3);
3855 for(
int i=0; i< 4 ; i++){
3856 originTriangleTmp = originTriangles[i];
3857 sort(originTriangleTmp.begin(),originTriangleTmp.end());
3858 for(
int j=0; j<4 ; j++){
3859 FiniteElement surfaceTmp = surfaceTriangleElements->getElement(surfaceElementsIDs[j]);
3860 triTmp = surfaceTmp.getVectorNodeList();
3861 sort(triTmp.begin(),triTmp.end());
3862 if(triTmp[0] == originTriangleTmp[0] && triTmp[1] == originTriangleTmp[1] && triTmp[2] == originTriangleTmp[2] ) {
3863 originFlag[i] = surfaceTmp.getFlag();
3864 interfaceSurface[i] = surfaceTmp.isInterfaceElement();
3876 for(
int i=0; i<6; i++){
3877 if(edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement())
3878 midPointInd.push_back(edgeElements->getMidpoint(edgeNumbers[i]));
3883 vec2D_int_Type newElements(4, vec_int_Type( 0 ));
3884 vec2D_int_Type newEdges(24,vec_int_Type(0));
3885 vec2D_int_Type newTriangles(16,vec_int_Type(0));
3886 vec_int_Type newTrianglesFlag(16) ;
3887 vec_bool_Type isInterfaceSurface(16);
3888 vec_int_Type edgeFlags(24);
3889 vec_bool_Type isInterfaceEdge(24);
3890 vec_GO_Type predecessorElement(24);
3892 vec2D_LO_Type newTriangleEdgeIDs(4,vec_LO_Type(12));
3901 (newElements)[0]={nodeInd[0],midPointInd[0],midPointInd[1],nodeInd[3]};
3903 (newEdges)[0] = {nodeInd[0] ,midPointInd[0]};
3904 (newEdges)[1] = {nodeInd[0] ,midPointInd[1]};
3905 (newEdges)[2] = {nodeInd[0] ,nodeInd[3]};
3906 (newEdges)[3] = {midPointInd[0] ,midPointInd[1]};
3907 (newEdges)[4] = {midPointInd[0] ,nodeInd[3]};
3908 (newEdges)[5] = {midPointInd[1] ,nodeInd[3]};
3910 edgeFlags[0]=this->bcFlagRep_->at(midPointInd[0]);
3911 edgeFlags[1]=this->bcFlagRep_->at(midPointInd[1]);
3912 edgeFlags[2]=edgeElements->getElement(edgeNumbers[2]).getFlag();
3913 edgeFlags[3]=originFlag[0];
3914 edgeFlags[4]=originFlag[1];
3915 edgeFlags[5]=originFlag[2];
3917 isInterfaceEdge[0] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
3918 isInterfaceEdge[1] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
3919 isInterfaceEdge[2] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
3920 isInterfaceEdge[3] = interfaceSurface[0];
3921 isInterfaceEdge[4] = interfaceSurface[1];
3922 isInterfaceEdge[5] = interfaceSurface[2];
3924 predecessorElement[0] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
3925 predecessorElement[1] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
3926 predecessorElement[2] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
3927 predecessorElement[3] = -1;
3928 predecessorElement[4] = -1;
3929 predecessorElement[5] = -1;
3933 newTriangles[0]= {nodeInd[0],midPointInd[0],midPointInd[1]};
3934 newTriangles[1]= {nodeInd[0],midPointInd[0],nodeInd[3]};
3935 newTriangles[2]= {nodeInd[0],midPointInd[1],nodeInd[3]};
3936 newTriangles[3]= {midPointInd[0],midPointInd[1],nodeInd[3]};
3938 newTrianglesFlag[0]= originFlag[0];
3939 newTrianglesFlag[1]= originFlag[1];
3940 newTrianglesFlag[2]= originFlag[2];
3941 newTrianglesFlag[3]= this->volumeID_;
3943 isInterfaceSurface[0] = interfaceSurface[0];
3944 isInterfaceSurface[1] = interfaceSurface[1];
3945 isInterfaceSurface[2] = interfaceSurface[2];
3946 isInterfaceSurface[3] =
false;
3948 newTriangleEdgeIDs[0]={0,1,3,0,2,4,1,2,5,3,4,5};
3951 (newElements)[1]={nodeInd[1],midPointInd[0],midPointInd[2],nodeInd[3]};
3953 (newEdges)[6] = {nodeInd[1] ,midPointInd[0]};
3954 (newEdges)[7] = {nodeInd[1] ,midPointInd[2]};
3955 (newEdges)[8] = {nodeInd[1] ,nodeInd[3]};
3956 (newEdges)[9] = {midPointInd[0] ,midPointInd[2]};
3957 (newEdges)[10] = {midPointInd[0] ,nodeInd[3]};
3958 (newEdges)[11] = {midPointInd[2] ,nodeInd[3]};
3960 edgeFlags[6]=this->bcFlagRep_->at(midPointInd[0]);
3961 edgeFlags[7]=this->bcFlagRep_->at(midPointInd[2]);
3962 edgeFlags[8]=edgeElements->getElement(edgeNumbers[4]).getFlag();
3963 edgeFlags[9]=originFlag[0];
3964 edgeFlags[10]=originFlag[1];
3965 edgeFlags[11]=originFlag[3];
3967 isInterfaceEdge[6] =edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
3968 isInterfaceEdge[7] =edgeElements->getElement(edgeNumbers[3]).isInterfaceElement();
3969 isInterfaceEdge[8] =edgeElements->getElement(edgeNumbers[4]).isInterfaceElement();
3970 isInterfaceEdge[9] = interfaceSurface[0];
3971 isInterfaceEdge[10] = interfaceSurface[1];
3972 isInterfaceEdge[11] = interfaceSurface[3];
3974 predecessorElement[6] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
3975 predecessorElement[7] = this->edgeMap_->getGlobalElement(edgeNumbers[3]);
3976 predecessorElement[8] = this->edgeMap_->getGlobalElement(edgeNumbers[4]);
3977 predecessorElement[9] = -1;
3978 predecessorElement[10] = -1;
3979 predecessorElement[11] = -1;
3982 newTriangles[4]= {nodeInd[1],midPointInd[0],midPointInd[2]};
3983 newTriangles[5]= {nodeInd[1],midPointInd[0],nodeInd[3]};
3984 newTriangles[6]= {nodeInd[1],midPointInd[2],nodeInd[3]};
3985 newTriangles[7]= {midPointInd[0],midPointInd[2],nodeInd[3]};
3987 newTrianglesFlag[4]= originFlag[0];
3988 newTrianglesFlag[5]= originFlag[1];
3989 newTrianglesFlag[6]= originFlag[3];
3990 newTrianglesFlag[7]= this->volumeID_;
3992 isInterfaceSurface[4] = interfaceSurface[0];
3993 isInterfaceSurface[5] = interfaceSurface[1];
3994 isInterfaceSurface[6] = interfaceSurface[3];
3995 isInterfaceSurface[7] =
false;
3997 newTriangleEdgeIDs[1]={6,7,9,6,8,10,7,8,11,9,10,11};
4001 (newElements)[2]={nodeInd[2],midPointInd[1],midPointInd[2],nodeInd[3]};
4003 (newEdges)[12] = {nodeInd[2] ,midPointInd[1]};
4004 (newEdges)[13] = {nodeInd[2] ,midPointInd[2]};
4005 (newEdges)[14] = {nodeInd[2] ,nodeInd[3]};
4006 (newEdges)[15] = {midPointInd[1] ,midPointInd[2]};
4007 (newEdges)[16] = {midPointInd[1] ,nodeInd[3]};
4008 (newEdges)[17] = {midPointInd[2] ,nodeInd[3]};
4010 edgeFlags[12]=this->bcFlagRep_->at(midPointInd[1]);
4011 edgeFlags[13]=this->bcFlagRep_->at(midPointInd[2]);
4012 edgeFlags[14]=edgeElements->getElement(edgeNumbers[5]).getFlag();
4013 edgeFlags[15]=originFlag[0];
4014 edgeFlags[16]=originFlag[2];
4015 edgeFlags[17]=originFlag[3];
4017 isInterfaceEdge[12] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
4018 isInterfaceEdge[13] = edgeElements->getElement(edgeNumbers[3]).isInterfaceElement();
4019 isInterfaceEdge[14] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
4020 isInterfaceEdge[15] = interfaceSurface[0];
4021 isInterfaceEdge[16] = interfaceSurface[2];
4022 isInterfaceEdge[17] = interfaceSurface[3];
4024 predecessorElement[12] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
4025 predecessorElement[13] = this->edgeMap_->getGlobalElement(edgeNumbers[3]);
4026 predecessorElement[14] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
4027 predecessorElement[15] = -1;
4028 predecessorElement[16] = -1;
4029 predecessorElement[17] = -1;
4032 newTriangles[8]= {nodeInd[2],midPointInd[1],midPointInd[2]};
4033 newTriangles[9]= {nodeInd[2],midPointInd[1],nodeInd[3]};
4034 newTriangles[10]= {nodeInd[2],midPointInd[2],nodeInd[3]};
4035 newTriangles[11]= {midPointInd[1],midPointInd[2],nodeInd[3]};
4037 newTrianglesFlag[8]= originFlag[0];
4038 newTrianglesFlag[9]= originFlag[2];
4039 newTrianglesFlag[10]= originFlag[3];
4040 newTrianglesFlag[11]= this->volumeID_;
4042 isInterfaceSurface[8] = interfaceSurface[0];
4043 isInterfaceSurface[9] = interfaceSurface[2];
4044 isInterfaceSurface[10] = interfaceSurface[3];
4045 isInterfaceSurface[11] =
false;
4047 newTriangleEdgeIDs[2]={12,13,15,12,14,16,13,14,17,15,16,17};
4051 (newElements)[3]={nodeInd[3],midPointInd[0],midPointInd[1],midPointInd[2]};
4053 (newEdges)[18] = {nodeInd[3] ,midPointInd[0]};
4054 (newEdges)[19] = {nodeInd[3] ,midPointInd[1]};
4055 (newEdges)[20] = {nodeInd[3] ,midPointInd[2]};
4056 (newEdges)[21] = {midPointInd[0] ,midPointInd[1]};
4057 (newEdges)[22] = {midPointInd[0] ,midPointInd[2]};
4058 (newEdges)[23] = {midPointInd[1] ,midPointInd[2]};
4060 edgeFlags[18]=originFlag[1];
4061 edgeFlags[19]=originFlag[2];
4062 edgeFlags[20]=originFlag[3];
4063 edgeFlags[21]=originFlag[0];
4064 edgeFlags[22]=originFlag[0];
4065 edgeFlags[23]=originFlag[0];
4067 isInterfaceEdge[18] = interfaceSurface[1];
4068 isInterfaceEdge[19] = interfaceSurface[2];
4069 isInterfaceEdge[20] = interfaceSurface[3];
4070 isInterfaceEdge[21] = interfaceSurface[0];
4071 isInterfaceEdge[22] = interfaceSurface[0];
4072 isInterfaceEdge[23] = interfaceSurface[0];
4074 predecessorElement[18] = -1;
4075 predecessorElement[19] = -1;
4076 predecessorElement[20] = -1;
4077 predecessorElement[21] = -1;
4078 predecessorElement[22] = -1;
4079 predecessorElement[23] = -1;
4083 newTriangles[12]= {nodeInd[3],midPointInd[0],midPointInd[1]};
4084 newTriangles[13]= {nodeInd[3],midPointInd[0],midPointInd[2]};
4085 newTriangles[14]= {nodeInd[3],midPointInd[1],midPointInd[2]};
4086 newTriangles[15]= {midPointInd[0],midPointInd[1],midPointInd[2]};
4088 newTrianglesFlag[12]= this->volumeID_;
4089 newTrianglesFlag[13]= this->volumeID_;
4090 newTrianglesFlag[14]= this->volumeID_;
4091 newTrianglesFlag[15]= originFlag[0];
4093 isInterfaceSurface[12] =
false;
4094 isInterfaceSurface[13] =
false;
4095 isInterfaceSurface[14] =
false;
4096 isInterfaceSurface[15] = interfaceSurface[0];
4099 newTriangleEdgeIDs[3]={18,19,21,18,20,22,19,20,23,21,22,23};
4103 int offsetElements = this->elementsC_->numberElements();
4104 int offsetEdges = this->edgeElements_->numberElements();
4105 for(
int i=0;i<4; i++){
4106 sort( newElements.at(i).begin(), newElements.at(i).end() );
4108 feNew.setFiniteElementRefinementType(
"irregular");
4109 feNew.setPredecessorElement(indexElement);
4111 this->elementsC_->addElement(feNew);
4113 this->elementsC_->switchElement(indexElement,feNew);
4117 for(
int i=0;i<24; i++){
4118 sort( newEdges.at(i).begin(), newEdges.at(i).end() );
4120 feNew.setInterfaceElement(isInterfaceEdge[i]);
4121 feNew.setPredecessorElement(predecessorElement[i]);
4123 this->edgeElements_->addEdge(feNew,i/6+offsetElements);
4126 this->edgeElements_->addEdge(feNew,indexElement);
4130 int offsetSurface=0;
4131 for(
int i=0;i<16; i++){
4132 sort( newTriangles.at(i).begin(), newTriangles.at(i).end() );
4134 feNew.setInterfaceElement(isInterfaceSurface[i]);
4136 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
4137 if ( !this->elementsC_->getElement(i/4+offsetElements).subElementsInitialized() )
4138 this->elementsC_->getElement(i/4+offsetElements).initializeSubElements( this->FEType_, this->dim_ -1) ;
4139 this->elementsC_->getElement(i/4+offsetElements).addSubElement(feNew);
4141 this->surfaceTriangleElements_->addSurface(feNew, i/4+offsetElements);
4144 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
4145 if ( !this->elementsC_->getElement(indexElement).subElementsInitialized() )
4146 this->elementsC_->getElement(indexElement).initializeSubElements( this->FEType_, this->dim_ -1) ;
4147 this->elementsC_->getElement(indexElement).addSubElement(feNew);
4149 this->surfaceTriangleElements_->addSurface(feNew, indexElement);
4155 for(
int i=0;i<4; i++){
4157 element = this->elementsC_->getElement(i+offsetElements);
4159 element = this->elementsC_->getElement(indexElement);
4161 for(
int j=0; j<24 ; j++){
4162 FiniteElement feEdge = this->edgeElements_->getElement(j+offsetEdges);
4163 if(feEdge.getFlag() != this->volumeID_){
4165 element.addSubElement( feEdge );
4166 else if ( !element.subElementsInitialized() ){
4167 element.initializeSubElements(
"P1", 1 );
4168 element.addSubElement( feEdge );
4172 ElementsPtr_Type surfaces = element.getSubElements();
4174 surfaces->setToCorrectElement( feEdge );
4182 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"The Type 1 irregular Refinement Method you requested is only applicable to a 3 dimensional Mesh. Please reconsider.");
4201 if(this->dim_ == 2){
4202 vec_int_Type midPointInd( 3 );
4204 vec_int_Type edgeNumbers = edgeElements->getEdgesOfElement(indexElement);
4206 for(
int i=0; i<3; i++) {
4207 midPointInd[i] = edgeElements->getMidpoint(edgeNumbers[i]);
4211 vec_int_Type mutualNode(3);
4213 for(
int i=0;i<2; i++){
4214 for(
int j=1;j+i<3;j++){
4215 if(edgeElements->getElement(edgeNumbers[i]).getNode(0) == edgeElements->getElement(edgeNumbers[j+i]).getNode(0))
4216 mutualNode[ind]= edgeElements->getElement(edgeNumbers[j+i]).getNode(0);
4218 if(edgeElements->getElement(edgeNumbers[i]).getNode(1) == edgeElements->getElement(edgeNumbers[j+i]).getNode(1))
4219 mutualNode[ind]= edgeElements->getElement(edgeNumbers[j+i]).getNode(1);
4221 if(edgeElements->getElement(edgeNumbers[i]).getNode(0) == edgeElements->getElement(edgeNumbers[j+i]).getNode(1))
4222 mutualNode[ind]= edgeElements->getElement(edgeNumbers[j+i]).getNode(1);
4224 if(edgeElements->getElement(edgeNumbers[i]).getNode(1) == edgeElements->getElement(edgeNumbers[j+i]).getNode(0))
4225 mutualNode[ind]= edgeElements->getElement(edgeNumbers[j+i]).getNode(0);
4232 vec2D_int_Type newElements(4, vec_int_Type( 0 ));
4233 vec2D_int_Type newEdges(12,vec_int_Type(0));
4234 vec_int_Type edgeFlags(12);
4236 vec_bool_Type isInterfaceEdge(12);
4237 vec_GO_Type predecessorElement(12);
4241 (newElements)[0]={mutualNode[0],midPointInd[0],midPointInd[1]};
4243 (newEdges)[0] = {mutualNode[0] ,midPointInd[0]};
4244 (newEdges)[1] = {mutualNode[0] ,midPointInd[1]};
4245 (newEdges)[2] = {midPointInd[0] ,midPointInd[1]};
4247 edgeFlags[0]=this->bcFlagRep_->at(midPointInd[0]);
4248 edgeFlags[1]=this->bcFlagRep_->at(midPointInd[1]);
4249 edgeFlags[2]=this->volumeID_;
4251 isInterfaceEdge[0] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
4252 isInterfaceEdge[1] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
4253 isInterfaceEdge[2] =
false;
4255 predecessorElement[0] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
4256 predecessorElement[1] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
4257 predecessorElement[2] = -1;
4261 newElements[1]={mutualNode[1],midPointInd[0],midPointInd[2]};
4263 (newEdges)[3] = {mutualNode[1] ,midPointInd[0]};
4264 (newEdges)[4] = {mutualNode[1] ,midPointInd[2]};
4265 (newEdges)[5] = {midPointInd[0] ,midPointInd[2]};
4267 edgeFlags[3]=this->bcFlagRep_->at(midPointInd[0]);
4268 edgeFlags[4]=this->bcFlagRep_->at(midPointInd[2]);
4269 edgeFlags[5]=this->volumeID_;
4271 isInterfaceEdge[3] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
4272 isInterfaceEdge[4] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
4273 isInterfaceEdge[5] =
false;
4275 predecessorElement[3] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
4276 predecessorElement[4] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
4277 predecessorElement[5] = -1;
4280 (newElements)[2]={mutualNode[2] , midPointInd[1] ,midPointInd[2]};
4282 (newEdges)[6] = {mutualNode[2] ,midPointInd[1]};
4283 (newEdges)[7] = {mutualNode[2] ,midPointInd[2]};
4284 (newEdges)[8] = {midPointInd[1] ,midPointInd[2]};
4286 edgeFlags[6]=this->bcFlagRep_->at(midPointInd[1]);
4287 edgeFlags[7]=this->bcFlagRep_->at(midPointInd[2]);
4288 edgeFlags[8]=this->volumeID_;
4290 isInterfaceEdge[6] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
4291 isInterfaceEdge[7] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
4292 isInterfaceEdge[8] =
false;
4294 predecessorElement[6] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
4295 predecessorElement[7] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
4296 predecessorElement[8] = -1;
4300 (newElements)[3]={midPointInd[0],midPointInd[1],midPointInd[2]};
4302 (newEdges)[9] = {midPointInd[0] ,midPointInd[1]};
4303 (newEdges)[10] = {midPointInd[1] ,midPointInd[2]};
4304 (newEdges)[11] = {midPointInd[2] ,midPointInd[0]};
4306 edgeFlags[9]=this->volumeID_;
4307 edgeFlags[10]=this->volumeID_;
4308 edgeFlags[11]=this->volumeID_;
4310 isInterfaceEdge[9] =
false;
4311 isInterfaceEdge[10] =
false;
4312 isInterfaceEdge[11] =
false;
4314 predecessorElement[9] = -1;
4315 predecessorElement[10] = -1;
4316 predecessorElement[11] = -1;
4319 int offsetElements = this->elementsC_->numberElements();
4320 int offsetEdges = this->edgeElements_->numberElements();
4321 for(
int i=0;i<4; i++){
4322 sort( newElements.at(i).begin(), newElements.at(i).end() );
4324 feNew.setFiniteElementRefinementType(
"regular");
4325 feNew.setPredecessorElement(indexElement);
4327 this->elementsC_->addElement(feNew);
4329 this->elementsC_->switchElement(indexElement,feNew);
4332 for(
int i=0;i<12; i++){
4333 sort( newEdges.at(i).begin(), newEdges.at(i).end() );
4335 feNew.setInterfaceElement(isInterfaceEdge[i]);
4336 feNew.setPredecessorElement(predecessorElement[i]);
4338 this->edgeElements_->addEdge(feNew,i/3+offsetElements);
4339 if(edgeFlags[i]!=0 && edgeFlags[i]!=this->volumeID_){
4340 if ( !this->elementsC_->getElement(i/3+offsetElements).subElementsInitialized() )
4341 this->elementsC_->getElement(i/3+offsetElements).initializeSubElements( this->FEType_, this->dim_ -1) ;
4342 this->elementsC_->getElement(i/3+offsetElements).addSubElement(feNew);
4347 this->edgeElements_->addEdge(feNew,indexElement);
4355 else if(this->dim_ == 3){
4361 vec_int_Type midPointInd( 6 );
4362 vec_int_Type edgeNumbers = edgeElements->getEdgesOfElement(indexElement);
4373 vec_int_Type nodeInd = elements->getElement(indexElement).getVectorNodeList();
4375 vec2D_dbl_ptr_Type pointsRep = this->pointsRep_;
4406 vec_int_Type edgeNumbersTmp = edgeNumbers;
4407 for(
int i=0; i<6; i++){
4408 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[0] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[0]){
4409 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1])
4410 edgeNumbers[0] = edgeNumbersTmp[i];
4411 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
4412 edgeNumbers[1] = edgeNumbersTmp[i];
4413 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
4414 edgeNumbers[2] = edgeNumbersTmp[i];
4416 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[1] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[1]){
4417 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2])
4418 edgeNumbers[3] = edgeNumbersTmp[i];
4419 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
4420 edgeNumbers[4] = edgeNumbersTmp[i];
4422 else if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[2] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[2]){
4423 if(edgeElements->getElement(edgeNumbersTmp[i]).getNode(0) == nodeInd[3] || edgeElements->getElement(edgeNumbersTmp[i]).getNode(1) == nodeInd[3])
4424 edgeNumbers[5] = edgeNumbersTmp[i];
4438 vec_int_Type surfaceElementsIDs = surfaceTriangleElements->getSurfacesOfElement(indexElement);
4439 vec2D_int_Type originTriangles(4,vec_int_Type(3));
4441 originTriangles[0] = {nodeInd[0], nodeInd[1], nodeInd[2] };
4442 originTriangles[1] = {nodeInd[0], nodeInd[1], nodeInd[3] };
4443 originTriangles[2] = {nodeInd[0], nodeInd[2], nodeInd[3] };
4444 originTriangles[3] = {nodeInd[1], nodeInd[2], nodeInd[3] };
4448 vec_int_Type originFlag(4,this->volumeID_);
4450 vec_bool_Type interfaceSurface(4);
4451 vec_LO_Type triTmp(3);
4452 vec_int_Type originTriangleTmp(3);
4454 for(
int i=0; i< 4 ; i++){
4455 originTriangleTmp = originTriangles[i];
4456 sort(originTriangleTmp.begin(),originTriangleTmp.end());
4457 for(
int j=0; j<4 ; j++){
4458 FiniteElement surfaceTmp = surfaceTriangleElements->getElement(surfaceElementsIDs[j]);
4459 triTmp = surfaceTmp.getVectorNodeList();
4460 sort(triTmp.begin(),triTmp.end());
4461 if(triTmp[0] == originTriangleTmp[0] && triTmp[1] == originTriangleTmp[1] && triTmp[2] == originTriangleTmp[2] ) {
4462 originFlag[i] = surfaceTmp.getFlag();
4463 interfaceSurface[i] = surfaceTmp.isInterfaceElement();
4486 for(
int i=0; i<6; i++){
4487 if(!edgeElements->getElement(edgeNumbers[i]).isTaggedForRefinement())
4490 midPointInd[i] = edgeElements->getMidpoint(edgeNumbers[i]);
4493 midPointInd[i] = edgeElements->getMidpoint(edgeNumbers[i]);
4502 vec2D_int_Type newElements(8, vec_int_Type( 0 ));
4503 vec2D_int_Type newEdges(48,vec_int_Type(0));
4504 vec2D_int_Type newTriangles(32,vec_int_Type(0));
4505 vec_int_Type newTrianglesFlag(32) ;
4506 vec_int_Type isInterfaceSurface(32);
4507 vec_int_Type edgeFlags(48);
4508 vec_bool_Type isInterfaceEdge(48);
4509 vec_GO_Type predecessorElement(48);
4511 vec2D_LO_Type newTriangleEdgeIDs(8,vec_LO_Type(12));
4520 (newElements)[0]={nodeInd[0],midPointInd[0],midPointInd[1],midPointInd[2]};
4522 (newEdges)[0] = {nodeInd[0] ,midPointInd[0]};
4523 (newEdges)[1] = {nodeInd[0] ,midPointInd[1]};
4524 (newEdges)[2] = {nodeInd[0] ,midPointInd[2]};
4525 (newEdges)[3] = {midPointInd[0] ,midPointInd[1]};
4526 (newEdges)[4] = {midPointInd[0] ,midPointInd[2]};
4527 (newEdges)[5] = {midPointInd[1] ,midPointInd[2]};
4529 edgeFlags[0]=this->bcFlagRep_->at(midPointInd[0]);
4530 edgeFlags[1]=this->bcFlagRep_->at(midPointInd[1]);
4531 edgeFlags[2]=this->bcFlagRep_->at(midPointInd[2]);
4532 edgeFlags[3]=originFlag[0];
4533 edgeFlags[4]=originFlag[1];
4534 edgeFlags[5]=originFlag[2];
4536 isInterfaceEdge[0] = edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
4537 isInterfaceEdge[1] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
4538 isInterfaceEdge[2] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
4539 isInterfaceEdge[3] = interfaceSurface[0];
4540 isInterfaceEdge[4] = interfaceSurface[1];
4541 isInterfaceEdge[5] = interfaceSurface[2];
4543 predecessorElement[0] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
4544 predecessorElement[1] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
4545 predecessorElement[2] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
4546 predecessorElement[3] = -1;
4547 predecessorElement[4] = -1;
4548 predecessorElement[5] = -1;
4551 newTriangles[0]= {nodeInd[0],midPointInd[1],midPointInd[0]};
4552 newTriangles[1]= {nodeInd[0],midPointInd[0],midPointInd[2]};
4553 newTriangles[2]= {nodeInd[0],midPointInd[2],midPointInd[1]};
4554 newTriangles[3]= {midPointInd[0],midPointInd[1],midPointInd[2]};
4556 newTrianglesFlag[0]= originFlag[0];
4557 newTrianglesFlag[1]= originFlag[1];
4558 newTrianglesFlag[2]= originFlag[2];
4559 newTrianglesFlag[3]= this->volumeID_;
4561 isInterfaceSurface[0] = interfaceSurface[0];
4562 isInterfaceSurface[1] = interfaceSurface[1];
4563 isInterfaceSurface[2] = interfaceSurface[2];
4564 isInterfaceSurface[3] =
false;
4566 newTriangleEdgeIDs[0]={0,1,3,0,2,4,1,2,5,3,4,5};
4568 (newElements)[1]={midPointInd[0],nodeInd[1],midPointInd[3],midPointInd[4]};
4570 (newEdges)[6] = {nodeInd[1] ,midPointInd[0]};
4571 (newEdges)[7] = {nodeInd[1] ,midPointInd[3]};
4572 (newEdges)[8] = {nodeInd[1] ,midPointInd[4]};
4573 (newEdges)[9] = {midPointInd[0] ,midPointInd[3]};
4574 (newEdges)[10] = {midPointInd[0] ,midPointInd[4]};
4575 (newEdges)[11] = {midPointInd[3] ,midPointInd[4]};
4577 edgeFlags[6]=this->bcFlagRep_->at(midPointInd[0]);
4578 edgeFlags[7]=this->bcFlagRep_->at(midPointInd[3]);
4579 edgeFlags[8]=this->bcFlagRep_->at(midPointInd[4]);
4580 edgeFlags[9]=originFlag[0];
4581 edgeFlags[10]=originFlag[1];
4582 edgeFlags[11]=originFlag[3];
4584 isInterfaceEdge[6] =edgeElements->getElement(edgeNumbers[0]).isInterfaceElement();
4585 isInterfaceEdge[7] =edgeElements->getElement(edgeNumbers[3]).isInterfaceElement();
4586 isInterfaceEdge[8] =edgeElements->getElement(edgeNumbers[4]).isInterfaceElement();
4587 isInterfaceEdge[9] = interfaceSurface[0];
4588 isInterfaceEdge[10] = interfaceSurface[1];
4589 isInterfaceEdge[11] = interfaceSurface[3];
4591 predecessorElement[6] = this->edgeMap_->getGlobalElement(edgeNumbers[0]);
4592 predecessorElement[7] = this->edgeMap_->getGlobalElement(edgeNumbers[3]);
4593 predecessorElement[8] = this->edgeMap_->getGlobalElement(edgeNumbers[4]);
4594 predecessorElement[9] = -1;
4595 predecessorElement[10] = -1;
4596 predecessorElement[11] = -1;
4599 newTriangles[4]= {nodeInd[1],midPointInd[0],midPointInd[3]};
4600 newTriangles[5]= {nodeInd[1],midPointInd[4],midPointInd[0]};
4601 newTriangles[6]= {nodeInd[1],midPointInd[3],midPointInd[4]};
4602 newTriangles[7]= {midPointInd[0],midPointInd[3],midPointInd[4]};
4604 newTrianglesFlag[4]= originFlag[0];
4605 newTrianglesFlag[5]= originFlag[1];
4606 newTrianglesFlag[6]= originFlag[3];
4607 newTrianglesFlag[7]= this->volumeID_;
4609 isInterfaceSurface[4] = interfaceSurface[0];
4610 isInterfaceSurface[5] = interfaceSurface[1];
4611 isInterfaceSurface[6] = interfaceSurface[3];
4612 isInterfaceSurface[7] =
false;
4614 newTriangleEdgeIDs[1]={6,7,9,6,8,10,7,8,11,9,10,11};
4616 (newElements)[2]={nodeInd[2],midPointInd[1],midPointInd[3],midPointInd[5]};
4618 (newEdges)[12] = {nodeInd[2] ,midPointInd[1]};
4619 (newEdges)[13] = {nodeInd[2] ,midPointInd[3]};
4620 (newEdges)[14] = {nodeInd[2] ,midPointInd[5]};
4621 (newEdges)[15] = {midPointInd[1] ,midPointInd[3]};
4622 (newEdges)[16] = {midPointInd[1] ,midPointInd[5]};
4623 (newEdges)[17] = {midPointInd[3] ,midPointInd[5]};
4625 edgeFlags[12]=this->bcFlagRep_->at(midPointInd[1]);
4626 edgeFlags[13]=this->bcFlagRep_->at(midPointInd[3]);
4627 edgeFlags[14]=this->bcFlagRep_->at(midPointInd[5]);
4628 edgeFlags[15]=originFlag[0];
4629 edgeFlags[16]=originFlag[2];
4630 edgeFlags[17]=originFlag[3];
4632 isInterfaceEdge[12] = edgeElements->getElement(edgeNumbers[1]).isInterfaceElement();
4633 isInterfaceEdge[13] = edgeElements->getElement(edgeNumbers[3]).isInterfaceElement();
4634 isInterfaceEdge[14] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
4635 isInterfaceEdge[15] = interfaceSurface[0];
4636 isInterfaceEdge[16] = interfaceSurface[2];
4637 isInterfaceEdge[17] = interfaceSurface[3];
4639 predecessorElement[12] = this->edgeMap_->getGlobalElement(edgeNumbers[1]);
4640 predecessorElement[13] = this->edgeMap_->getGlobalElement(edgeNumbers[3]);
4641 predecessorElement[14] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
4642 predecessorElement[15] = -1;
4643 predecessorElement[16] = -1;
4644 predecessorElement[17] = -1;
4647 newTriangles[8]= {nodeInd[2],midPointInd[3],midPointInd[1]};
4648 newTriangles[9]= {nodeInd[2],midPointInd[1],midPointInd[5]};
4649 newTriangles[10]= {nodeInd[2],midPointInd[5],midPointInd[3]};
4650 newTriangles[11]= {midPointInd[1],midPointInd[3],midPointInd[5]};
4652 newTrianglesFlag[8]= originFlag[0];
4653 newTrianglesFlag[9]= originFlag[2];
4654 newTrianglesFlag[10]= originFlag[3];
4655 newTrianglesFlag[11]= this->volumeID_;
4657 isInterfaceSurface[8] = interfaceSurface[0];
4658 isInterfaceSurface[9] = interfaceSurface[2];
4659 isInterfaceSurface[10] = interfaceSurface[3];
4660 isInterfaceSurface[11] =
false;
4662 newTriangleEdgeIDs[2]={12,13,15,12,14,16,13,14,17,15,16,17};
4665 (newElements)[3]={midPointInd[2],midPointInd[4],midPointInd[5],nodeInd[3]};
4667 (newEdges)[18] = {nodeInd[3] ,midPointInd[2]};
4668 (newEdges)[19] = {nodeInd[3] ,midPointInd[4]};
4669 (newEdges)[20] = {nodeInd[3] ,midPointInd[5]};
4670 (newEdges)[21] = {midPointInd[2] ,midPointInd[4]};
4671 (newEdges)[22] = {midPointInd[2] ,midPointInd[5]};
4672 (newEdges)[23] = {midPointInd[4] ,midPointInd[5]};
4674 edgeFlags[18]=this->bcFlagRep_->at(midPointInd[2]);
4675 edgeFlags[19]=this->bcFlagRep_->at(midPointInd[4]);
4676 edgeFlags[20]=this->bcFlagRep_->at(midPointInd[5]);
4677 edgeFlags[21]=originFlag[1];
4678 edgeFlags[22]=originFlag[2];
4679 edgeFlags[23]=originFlag[3];
4681 isInterfaceEdge[18] = edgeElements->getElement(edgeNumbers[2]).isInterfaceElement();
4682 isInterfaceEdge[19] = edgeElements->getElement(edgeNumbers[4]).isInterfaceElement();
4683 isInterfaceEdge[20] = edgeElements->getElement(edgeNumbers[5]).isInterfaceElement();
4684 isInterfaceEdge[21] = interfaceSurface[1];
4685 isInterfaceEdge[22] = interfaceSurface[2];
4686 isInterfaceEdge[23] = interfaceSurface[3];
4688 predecessorElement[18] = this->edgeMap_->getGlobalElement(edgeNumbers[2]);
4689 predecessorElement[19] = this->edgeMap_->getGlobalElement(edgeNumbers[4]);
4690 predecessorElement[20] = this->edgeMap_->getGlobalElement(edgeNumbers[5]);
4691 predecessorElement[21] = -1;
4692 predecessorElement[22] = -1;
4693 predecessorElement[23] = -1;
4697 newTriangles[12]= {nodeInd[3],midPointInd[2],midPointInd[4]};
4698 newTriangles[13]= {nodeInd[3],midPointInd[5],midPointInd[2]};
4699 newTriangles[14]= {nodeInd[3],midPointInd[4],midPointInd[5]};
4700 newTriangles[15]= {midPointInd[2],midPointInd[4],midPointInd[5]};
4702 newTrianglesFlag[12]= originFlag[1];
4703 newTrianglesFlag[13]= originFlag[2];
4704 newTrianglesFlag[14]= originFlag[3];
4705 newTrianglesFlag[15]= this->volumeID_;
4707 isInterfaceSurface[12] = interfaceSurface[1];
4708 isInterfaceSurface[13] = interfaceSurface[2];
4709 isInterfaceSurface[14] = interfaceSurface[3];
4710 isInterfaceSurface[15] =
false;
4713 newTriangleEdgeIDs[3]={18,19,20,18,20,22,19,21,23,21,22,23};
4717 vec_dbl_Type lengthDia(3);
4721 lengthDia[0] = std::sqrt(std::pow(pointsRep->at(midPointInd[1]).at(0) - pointsRep->at(midPointInd[4]).at(0),2) + std::pow(pointsRep->at(midPointInd[1]).at(1) - pointsRep->at(midPointInd[4]).at(1),2) +std::pow(pointsRep->at(midPointInd[1]).at(2) - pointsRep->at(midPointInd[4]).at(2),2) );
4723 lengthDia[1] = std::sqrt(std::pow(pointsRep->at(midPointInd[0]).at(0) - pointsRep->at(midPointInd[5]).at(0),2) + std::pow(pointsRep->at(midPointInd[0]).at(1) - pointsRep->at(midPointInd[5]).at(1),2) +std::pow(pointsRep->at(midPointInd[0]).at(2) - pointsRep->at(midPointInd[5]).at(2),2) );
4725 lengthDia[2] = std::sqrt(std::pow(pointsRep->at(midPointInd[2]).at(0) - pointsRep->at(midPointInd[3]).at(0),2) + std::pow(pointsRep->at(midPointInd[2]).at(1) - pointsRep->at(midPointInd[3]).at(1),2) +std::pow(pointsRep->at(midPointInd[2]).at(2) - pointsRep->at(midPointInd[3]).at(2),2) );
4728 vec2D_dbl_Type dia(3,vec_dbl_Type(2));
4729 dia[0] = { lengthDia[0],0.};
4730 dia[1] = { lengthDia[1],1.};
4731 dia[2] = { lengthDia[2],2.};
4732 sort(dia.begin(),dia.end());
4739 if(refinement3DDiagonal_>2 || refinement3DDiagonal_ == 0)
4742 diaInd = (int) dia[refinement3DDiagonal_][1];
4743 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"The Refinement feature to pick a specific internal Diagonal in regular refinement is not yet orientation preserving!");
4750 (newElements)[4]={midPointInd[0],midPointInd[1],midPointInd[2],midPointInd[4]};
4752 (newEdges)[24] = {midPointInd[0] ,midPointInd[1]};
4753 (newEdges)[25] = {midPointInd[0] ,midPointInd[2]};
4754 (newEdges)[26] = {midPointInd[0] ,midPointInd[4]};
4755 (newEdges)[27] = {midPointInd[1] ,midPointInd[2]};
4756 (newEdges)[28] = {midPointInd[1] ,midPointInd[4]};
4757 (newEdges)[29] = {midPointInd[2] ,midPointInd[4]};
4759 edgeFlags[24]=originFlag[0];
4760 edgeFlags[25]=originFlag[1];
4761 edgeFlags[26]=originFlag[1];
4762 edgeFlags[27]=originFlag[2];
4763 edgeFlags[28]=this->volumeID_;
4764 edgeFlags[29]=originFlag[1];
4766 isInterfaceEdge[24] = interfaceSurface[0];
4767 isInterfaceEdge[25] = interfaceSurface[1];
4768 isInterfaceEdge[26] = interfaceSurface[1];
4769 isInterfaceEdge[27] = interfaceSurface[2];
4770 isInterfaceEdge[28] =
false;
4771 isInterfaceEdge[29] = interfaceSurface[1];
4774 predecessorElement[24] = -1;
4775 predecessorElement[25] = -1;
4776 predecessorElement[26] = -1;
4777 predecessorElement[27] = -1;
4778 predecessorElement[28] = -1;
4779 predecessorElement[29] = -1;
4782 newTriangles[16]= {midPointInd[0],midPointInd[1],midPointInd[2]};
4783 newTriangles[17]= {midPointInd[0],midPointInd[1],midPointInd[4]};
4784 newTriangles[18]= {midPointInd[0],midPointInd[4],midPointInd[2]};
4785 newTriangles[19]= {midPointInd[1],midPointInd[2],midPointInd[4]};
4788 newTrianglesFlag[16]= this->volumeID_;
4789 newTrianglesFlag[17]= this->volumeID_;
4790 newTrianglesFlag[18]= originFlag[1];
4791 newTrianglesFlag[19]= this->volumeID_;
4793 isInterfaceSurface[16] =
false;
4794 isInterfaceSurface[17] =
false;
4795 isInterfaceSurface[18] = interfaceSurface[1];
4796 isInterfaceSurface[19] =
false;
4798 newTriangleEdgeIDs[4]={24,25,27,24,26,28,25,26,29,27,28,29};
4801 (newElements)[5]={midPointInd[0],midPointInd[3],midPointInd[1],midPointInd[4]};
4803 (newEdges)[30] = {midPointInd[0],midPointInd[1]};
4804 (newEdges)[31] = {midPointInd[0] ,midPointInd[3]};
4805 (newEdges)[32] = {midPointInd[0],midPointInd[4]};
4806 (newEdges)[33] = {midPointInd[1] ,midPointInd[3]};
4807 (newEdges)[34] = {midPointInd[1] ,midPointInd[4]};
4808 (newEdges)[35] = {midPointInd[3] ,midPointInd[4]};
4810 edgeFlags[30]=originFlag[0];
4811 edgeFlags[31]=originFlag[0];
4812 edgeFlags[32]=originFlag[1];
4813 edgeFlags[33]=originFlag[0];
4814 edgeFlags[34]=this->volumeID_;
4815 edgeFlags[35]=originFlag[3];
4817 isInterfaceEdge[30] = interfaceSurface[0];
4818 isInterfaceEdge[31] = interfaceSurface[0];
4819 isInterfaceEdge[32] = interfaceSurface[1];
4820 isInterfaceEdge[33] = interfaceSurface[0];
4821 isInterfaceEdge[34] =
false;
4822 isInterfaceEdge[35] = interfaceSurface[3];
4824 predecessorElement[30] = -1;
4825 predecessorElement[31] = -1;
4826 predecessorElement[32] = -1;
4827 predecessorElement[33] = -1;
4828 predecessorElement[34] = -1;
4829 predecessorElement[35] = -1;
4833 newTriangles[20]= {midPointInd[0],midPointInd[1],midPointInd[3]};
4834 newTriangles[21]= {midPointInd[0],midPointInd[1],midPointInd[4]};
4835 newTriangles[22]= {midPointInd[0],midPointInd[3],midPointInd[4]};
4836 newTriangles[23]= {midPointInd[1],midPointInd[3],midPointInd[4]};
4838 newTrianglesFlag[20]= originFlag[0];
4839 newTrianglesFlag[21]= this->volumeID_;
4840 newTrianglesFlag[22]= this->volumeID_;
4841 newTrianglesFlag[23]= this->volumeID_;
4843 isInterfaceSurface[20] = interfaceSurface[0];
4844 isInterfaceSurface[21] =
false;
4845 isInterfaceSurface[22] =
false;
4846 isInterfaceSurface[23] =
false;
4848 newTriangleEdgeIDs[5]={30,31,33,30,32,34,31,32,35,33,34,35};
4850 (newElements)[6]={midPointInd[1],midPointInd[2],midPointInd[4],midPointInd[5]};
4852 (newEdges)[36] = {midPointInd[1] ,midPointInd[2]};
4853 (newEdges)[37] = {midPointInd[1] ,midPointInd[4]};
4854 (newEdges)[38] = {midPointInd[1] ,midPointInd[5]};
4855 (newEdges)[39] = {midPointInd[2] ,midPointInd[4]};
4856 (newEdges)[40] = {midPointInd[2] ,midPointInd[5]};
4857 (newEdges)[41] = {midPointInd[4] ,midPointInd[5]};
4859 edgeFlags[36]=originFlag[2];
4860 edgeFlags[37]=this->volumeID_;
4861 edgeFlags[38]=originFlag[2];
4862 edgeFlags[39]=originFlag[1];
4863 edgeFlags[40]=originFlag[2];
4864 edgeFlags[41]=originFlag[3];
4866 isInterfaceEdge[36] = interfaceSurface[2];
4867 isInterfaceEdge[37] =
false;
4868 isInterfaceEdge[38] = interfaceSurface[2];
4869 isInterfaceEdge[39] = interfaceSurface[1];
4870 isInterfaceEdge[40] = interfaceSurface[2];
4871 isInterfaceEdge[41] = interfaceSurface[3];
4873 predecessorElement[36] = -1;
4874 predecessorElement[37] = -1;
4875 predecessorElement[38] = -1;
4876 predecessorElement[39] = -1;
4877 predecessorElement[40] = -1;
4878 predecessorElement[41] = -1;
4881 newTriangles[24]= {midPointInd[1],midPointInd[2],midPointInd[4]};
4882 newTriangles[25]= {midPointInd[1],midPointInd[2],midPointInd[5]};
4883 newTriangles[26]= {midPointInd[1],midPointInd[4],midPointInd[5]};
4884 newTriangles[27]= {midPointInd[2],midPointInd[4],midPointInd[5]};
4886 newTrianglesFlag[24]= this->volumeID_;
4887 newTrianglesFlag[25]= originFlag[2];
4888 newTrianglesFlag[26]= this->volumeID_;
4889 newTrianglesFlag[27]= this->volumeID_;
4891 isInterfaceSurface[24] =
false;
4892 isInterfaceSurface[25] = interfaceSurface[2];
4893 isInterfaceSurface[26] =
false;
4894 isInterfaceSurface[27] =
false;
4896 newTriangleEdgeIDs[6]={36,37,39,36,38,40,37,38,41,39,40,41};
4899 (newElements)[7]={midPointInd[1],midPointInd[3],midPointInd[5],midPointInd[4]};
4901 (newEdges)[42] = {midPointInd[1] ,midPointInd[3]};
4902 (newEdges)[43] = {midPointInd[1] ,midPointInd[4]};
4903 (newEdges)[44] = {midPointInd[1] ,midPointInd[5]};
4904 (newEdges)[45] = {midPointInd[3] ,midPointInd[4]};
4905 (newEdges)[46] = {midPointInd[3] ,midPointInd[5]};
4906 (newEdges)[47] = {midPointInd[4] ,midPointInd[5]};
4908 edgeFlags[42]=originFlag[0];
4909 edgeFlags[43]=this->volumeID_;
4910 edgeFlags[44]=originFlag[2];
4911 edgeFlags[45]=originFlag[3];
4912 edgeFlags[46]=originFlag[3];
4913 edgeFlags[47]=originFlag[3];
4915 isInterfaceEdge[42] = interfaceSurface[0];
4916 isInterfaceEdge[43] =
false;
4917 isInterfaceEdge[44] = interfaceSurface[2];
4918 isInterfaceEdge[45] = interfaceSurface[3];
4919 isInterfaceEdge[46] = interfaceSurface[3];
4920 isInterfaceEdge[47] = interfaceSurface[3];
4922 predecessorElement[42] = -1;
4923 predecessorElement[43] = -1;
4924 predecessorElement[44] = -1;
4925 predecessorElement[45] = -1;
4926 predecessorElement[46] = -1;
4927 predecessorElement[47] = -1;
4930 newTriangles[28]= {midPointInd[1],midPointInd[3],midPointInd[4]};
4931 newTriangles[29]= {midPointInd[1],midPointInd[3],midPointInd[5]};
4932 newTriangles[30]= {midPointInd[1],midPointInd[4],midPointInd[5]};
4933 newTriangles[31]= {midPointInd[3],midPointInd[5],midPointInd[4]};
4935 newTrianglesFlag[28]= this->volumeID_;
4936 newTrianglesFlag[29]= this->volumeID_;
4937 newTrianglesFlag[30]= this->volumeID_;
4938 newTrianglesFlag[31]= originFlag[3];
4940 isInterfaceSurface[28] =
false;
4941 isInterfaceSurface[29] =
false;
4942 isInterfaceSurface[30] =
false;
4943 isInterfaceSurface[31] = interfaceSurface[3];
4945 newTriangleEdgeIDs[7]={42,43,45,42,44,46,43,44,47,45,46,47};
4948 else if(diaInd ==1){
4950 (newElements)[4]={midPointInd[0],midPointInd[1],midPointInd[2],midPointInd[5]};
4952 (newEdges)[24] = {midPointInd[0] ,midPointInd[1]};
4953 (newEdges)[25] = {midPointInd[0] ,midPointInd[2]};
4954 (newEdges)[26] = {midPointInd[0] ,midPointInd[5]};
4955 (newEdges)[27] = {midPointInd[1] ,midPointInd[2]};
4956 (newEdges)[28] = {midPointInd[1] ,midPointInd[5]};
4957 (newEdges)[29] = {midPointInd[2] ,midPointInd[5]};
4959 edgeFlags[24]=originFlag[0];
4960 edgeFlags[25]=originFlag[1];
4961 edgeFlags[26]=this->volumeID_;
4962 edgeFlags[27]=originFlag[2];
4963 edgeFlags[28]=originFlag[2];
4964 edgeFlags[29]=originFlag[2];
4966 isInterfaceEdge[24] = interfaceSurface[0];
4967 isInterfaceEdge[25] = interfaceSurface[1];
4968 isInterfaceEdge[26] =
false;
4969 isInterfaceEdge[27] = interfaceSurface[2];
4970 isInterfaceEdge[28] = interfaceSurface[2];
4971 isInterfaceEdge[29] = interfaceSurface[2];
4974 predecessorElement[24] = -1;
4975 predecessorElement[25] = -1;
4976 predecessorElement[26] = -1;
4977 predecessorElement[27] = -1;
4978 predecessorElement[28] = -1;
4979 predecessorElement[29] = -1;
4982 newTriangles[16]= {midPointInd[0],midPointInd[1],midPointInd[2]};
4983 newTriangles[17]= {midPointInd[0],midPointInd[1],midPointInd[5]};
4984 newTriangles[18]= {midPointInd[0],midPointInd[2],midPointInd[5]};
4985 newTriangles[19]= {midPointInd[1],midPointInd[2],midPointInd[5]};
4988 newTrianglesFlag[16]= this->volumeID_;
4989 newTrianglesFlag[17]= this->volumeID_;
4990 newTrianglesFlag[18]= this->volumeID_;
4991 newTrianglesFlag[19]= originFlag[2];
4993 isInterfaceSurface[16] =
false;
4994 isInterfaceSurface[17] =
false;
4995 isInterfaceSurface[18] =
false;
4996 isInterfaceSurface[19] = interfaceSurface[2];;
4998 newTriangleEdgeIDs[4]={24,25,27,24,26,28,25,26,29,27,28,29};
5001 (newElements)[5]={midPointInd[0],midPointInd[3],midPointInd[4],midPointInd[5]};
5003 (newEdges)[30] = {midPointInd[0],midPointInd[3]};
5004 (newEdges)[31] = {midPointInd[0] ,midPointInd[4]};
5005 (newEdges)[32] = {midPointInd[0],midPointInd[5]};
5006 (newEdges)[33] = {midPointInd[3] ,midPointInd[4]};
5007 (newEdges)[34] = {midPointInd[3] ,midPointInd[5]};
5008 (newEdges)[35] = {midPointInd[4] ,midPointInd[5]};
5010 edgeFlags[30]=originFlag[0];
5011 edgeFlags[31]=originFlag[1];
5012 edgeFlags[32]=this->volumeID_;
5013 edgeFlags[33]=originFlag[3];
5014 edgeFlags[34]=originFlag[3];
5015 edgeFlags[35]=originFlag[3];
5017 isInterfaceEdge[30] = interfaceSurface[0];
5018 isInterfaceEdge[31] = interfaceSurface[1];
5019 isInterfaceEdge[32] =
false;
5020 isInterfaceEdge[33] = interfaceSurface[3];
5021 isInterfaceEdge[34] = interfaceSurface[3];
5022 isInterfaceEdge[35] = interfaceSurface[3];
5024 predecessorElement[30] = -1;
5025 predecessorElement[31] = -1;
5026 predecessorElement[32] = -1;
5027 predecessorElement[33] = -1;
5028 predecessorElement[34] = -1;
5029 predecessorElement[35] = -1;
5033 newTriangles[20]= {midPointInd[0],midPointInd[3],midPointInd[4]};
5034 newTriangles[21]= {midPointInd[0],midPointInd[3],midPointInd[5]};
5035 newTriangles[22]= {midPointInd[0],midPointInd[4],midPointInd[5]};
5036 newTriangles[23]= {midPointInd[3],midPointInd[4],midPointInd[5]};
5038 newTrianglesFlag[20]= this->volumeID_;
5039 newTrianglesFlag[21]= this->volumeID_;
5040 newTrianglesFlag[22]= this->volumeID_;
5041 newTrianglesFlag[23]= originFlag[3];
5043 isInterfaceSurface[20] =
false;
5044 isInterfaceSurface[21] =
false;
5045 isInterfaceSurface[22] =
false;
5046 isInterfaceSurface[23] = interfaceSurface[3];
5048 newTriangleEdgeIDs[5]={30,31,33,30,32,34,31,32,35,33,34,35};
5051 (newElements)[6]={midPointInd[0],midPointInd[1],midPointInd[3],midPointInd[5]};
5053 (newEdges)[36] = {midPointInd[0] ,midPointInd[1]};
5054 (newEdges)[37] = {midPointInd[0] ,midPointInd[3]};
5055 (newEdges)[38] = {midPointInd[0] ,midPointInd[5]};
5056 (newEdges)[39] = {midPointInd[1] ,midPointInd[3]};
5057 (newEdges)[40] = {midPointInd[1] ,midPointInd[5]};
5058 (newEdges)[41] = {midPointInd[3] ,midPointInd[5]};
5060 edgeFlags[36]=originFlag[0];
5061 edgeFlags[37]=originFlag[0];
5062 edgeFlags[38]=this->volumeID_;
5063 edgeFlags[39]=originFlag[0];
5064 edgeFlags[40]=originFlag[2];
5065 edgeFlags[41]=originFlag[3];
5067 isInterfaceEdge[36] = interfaceSurface[0];
5068 isInterfaceEdge[37] = interfaceSurface[0];
5069 isInterfaceEdge[38] =
false;
5070 isInterfaceEdge[39] = interfaceSurface[0];
5071 isInterfaceEdge[40] = interfaceSurface[2];
5072 isInterfaceEdge[41] = interfaceSurface[3];
5074 predecessorElement[36] = -1;
5075 predecessorElement[37] = -1;
5076 predecessorElement[38] = -1;
5077 predecessorElement[39] = -1;
5078 predecessorElement[40] = -1;
5079 predecessorElement[41] = -1;
5082 newTriangles[24]= {midPointInd[0],midPointInd[1],midPointInd[3]};
5083 newTriangles[25]= {midPointInd[0],midPointInd[1],midPointInd[5]};
5084 newTriangles[26]= {midPointInd[0],midPointInd[3],midPointInd[5]};
5085 newTriangles[27]= {midPointInd[1],midPointInd[3],midPointInd[5]};
5087 newTrianglesFlag[24]= originFlag[0];
5088 newTrianglesFlag[25]= this->volumeID_;
5089 newTrianglesFlag[26]= this->volumeID_;
5090 newTrianglesFlag[27]= this->volumeID_;
5092 isInterfaceSurface[24] = interfaceSurface[0];
5093 isInterfaceSurface[25] =
false;
5094 isInterfaceSurface[26] =
false;
5095 isInterfaceSurface[27] =
false;
5097 newTriangleEdgeIDs[6]={36,37,39,36,38,40,37,38,41,39,40,41};
5100 (newElements)[7]={midPointInd[0],midPointInd[4],midPointInd[2],midPointInd[5]};
5102 (newEdges)[42] = {midPointInd[0] ,midPointInd[2]};
5103 (newEdges)[43] = {midPointInd[0] ,midPointInd[4]};
5104 (newEdges)[44] = {midPointInd[0] ,midPointInd[5]};
5105 (newEdges)[45] = {midPointInd[2] ,midPointInd[4]};
5106 (newEdges)[46] = {midPointInd[2] ,midPointInd[5]};
5107 (newEdges)[47] = {midPointInd[4] ,midPointInd[5]};
5109 edgeFlags[42]=originFlag[1];
5110 edgeFlags[43]=originFlag[1];
5111 edgeFlags[44]=this->volumeID_;
5112 edgeFlags[45]=originFlag[1];
5113 edgeFlags[46]=originFlag[2];
5114 edgeFlags[47]=originFlag[3];
5116 isInterfaceEdge[42] = interfaceSurface[1];
5117 isInterfaceEdge[43] = interfaceSurface[1];
5118 isInterfaceEdge[44] =
false;
5119 isInterfaceEdge[45] = interfaceSurface[1];
5120 isInterfaceEdge[46] = interfaceSurface[2];
5121 isInterfaceEdge[47] = interfaceSurface[3];
5123 predecessorElement[42] = -1;
5124 predecessorElement[43] = -1;
5125 predecessorElement[44] = -1;
5126 predecessorElement[45] = -1;
5127 predecessorElement[46] = -1;
5128 predecessorElement[47] = -1;
5131 newTriangles[28]= {midPointInd[0],midPointInd[2],midPointInd[4]};
5132 newTriangles[29]= {midPointInd[0],midPointInd[2],midPointInd[5]};
5133 newTriangles[30]= {midPointInd[0],midPointInd[4],midPointInd[5]};
5134 newTriangles[31]= {midPointInd[2],midPointInd[4],midPointInd[5]};
5136 newTrianglesFlag[28]= originFlag[1];
5137 newTrianglesFlag[29]= this->volumeID_;
5138 newTrianglesFlag[30]= this->volumeID_;
5139 newTrianglesFlag[31]= this->volumeID_;
5141 isInterfaceSurface[28] = interfaceSurface[1];
5142 isInterfaceSurface[29] =
false;
5143 isInterfaceSurface[30] =
false;
5144 isInterfaceSurface[31] =
false;
5146 newTriangleEdgeIDs[7]={42,43,45,42,44,46,43,44,47,45,46,47};
5148 else if(diaInd ==2){
5150 (newElements)[4]={midPointInd[0],midPointInd[1],midPointInd[2],midPointInd[3]};
5152 (newEdges)[24] = {midPointInd[0] ,midPointInd[1]};
5153 (newEdges)[25] = {midPointInd[0] ,midPointInd[2]};
5154 (newEdges)[26] = {midPointInd[0] ,midPointInd[3]};
5155 (newEdges)[27] = {midPointInd[1] ,midPointInd[2]};
5156 (newEdges)[28] = {midPointInd[1] ,midPointInd[3]};
5157 (newEdges)[29] = {midPointInd[2] ,midPointInd[3]};
5159 edgeFlags[24]=originFlag[0];
5160 edgeFlags[25]=originFlag[1];
5161 edgeFlags[26]=originFlag[0];
5162 edgeFlags[27]=originFlag[2];
5163 edgeFlags[28]=originFlag[0];
5164 edgeFlags[29]=this->volumeID_;
5166 isInterfaceEdge[24] = interfaceSurface[0];
5167 isInterfaceEdge[25] = interfaceSurface[1];
5168 isInterfaceEdge[26] = interfaceSurface[0];
5169 isInterfaceEdge[27] = interfaceSurface[2];
5170 isInterfaceEdge[28] = interfaceSurface[0];
5171 isInterfaceEdge[29] =
false;
5174 predecessorElement[24] = -1;
5175 predecessorElement[25] = -1;
5176 predecessorElement[26] = -1;
5177 predecessorElement[27] = -1;
5178 predecessorElement[28] = -1;
5179 predecessorElement[29] = -1;
5182 newTriangles[16]= {midPointInd[0],midPointInd[1],midPointInd[2]};
5183 newTriangles[17]= {midPointInd[0],midPointInd[1],midPointInd[3]};
5184 newTriangles[18]= {midPointInd[0],midPointInd[2],midPointInd[3]};
5185 newTriangles[19]= {midPointInd[1],midPointInd[2],midPointInd[3]};
5188 newTrianglesFlag[16]= this->volumeID_;
5189 newTrianglesFlag[17]= originFlag[0];
5190 newTrianglesFlag[18]= this->volumeID_;
5191 newTrianglesFlag[19]= this->volumeID_;
5193 isInterfaceSurface[16] =
false;
5194 isInterfaceSurface[17] = interfaceSurface[0];
5195 isInterfaceSurface[18] =
false;
5196 isInterfaceSurface[19] =
false;
5198 newTriangleEdgeIDs[4]={24,25,27,24,26,28,25,26,29,27,28,29};
5201 (newElements)[5]={midPointInd[0],midPointInd[2],midPointInd[3],midPointInd[4]};
5203 (newEdges)[30] = {midPointInd[0],midPointInd[2]};
5204 (newEdges)[31] = {midPointInd[0] ,midPointInd[3]};
5205 (newEdges)[32] = {midPointInd[0],midPointInd[4]};
5206 (newEdges)[33] = {midPointInd[2] ,midPointInd[3]};
5207 (newEdges)[34] = {midPointInd[2] ,midPointInd[4]};
5208 (newEdges)[35] = {midPointInd[3] ,midPointInd[4]};
5210 edgeFlags[30]=originFlag[1];
5211 edgeFlags[31]=originFlag[0];
5212 edgeFlags[32]=originFlag[1];
5213 edgeFlags[33]=this->volumeID_;
5214 edgeFlags[34]=originFlag[1];
5215 edgeFlags[35]=originFlag[3];
5217 isInterfaceEdge[30] = interfaceSurface[1];
5218 isInterfaceEdge[31] = interfaceSurface[0];
5219 isInterfaceEdge[32] = interfaceSurface[1];
5220 isInterfaceEdge[33] =
false;
5221 isInterfaceEdge[34] = interfaceSurface[1];
5222 isInterfaceEdge[35] = interfaceSurface[3];
5224 predecessorElement[30] = -1;
5225 predecessorElement[31] = -1;
5226 predecessorElement[32] = -1;
5227 predecessorElement[33] = -1;
5228 predecessorElement[34] = -1;
5229 predecessorElement[35] = -1;
5233 newTriangles[20]= {midPointInd[0],midPointInd[2],midPointInd[3]};
5234 newTriangles[21]= {midPointInd[0],midPointInd[2],midPointInd[4]};
5235 newTriangles[22]= {midPointInd[0],midPointInd[3],midPointInd[4]};
5236 newTriangles[23]= {midPointInd[2],midPointInd[3],midPointInd[4]};
5238 newTrianglesFlag[20]= this->volumeID_;
5239 newTrianglesFlag[21]= originFlag[1];
5240 newTrianglesFlag[22]= this->volumeID_;
5241 newTrianglesFlag[23]= this->volumeID_;
5243 isInterfaceSurface[20] =
false;
5244 isInterfaceSurface[21] = interfaceSurface[1];
5245 isInterfaceSurface[22] =
false;
5246 isInterfaceSurface[23] =
false;
5248 newTriangleEdgeIDs[5]={30,31,33,30,32,34,31,32,35,33,34,35};
5250 (newElements)[6]={midPointInd[1],midPointInd[2],midPointInd[3],midPointInd[5]};
5252 (newEdges)[36] = {midPointInd[1] ,midPointInd[2]};
5253 (newEdges)[37] = {midPointInd[1] ,midPointInd[3]};
5254 (newEdges)[38] = {midPointInd[1] ,midPointInd[5]};
5255 (newEdges)[39] = {midPointInd[2] ,midPointInd[3]};
5256 (newEdges)[40] = {midPointInd[2] ,midPointInd[5]};
5257 (newEdges)[41] = {midPointInd[3] ,midPointInd[5]};
5259 edgeFlags[36]=originFlag[2];
5260 edgeFlags[37]=originFlag[0];
5261 edgeFlags[38]=originFlag[2];
5262 edgeFlags[39]=this->volumeID_;
5263 edgeFlags[40]=originFlag[2];
5264 edgeFlags[41]=originFlag[3];
5266 isInterfaceEdge[36] = interfaceSurface[2];
5267 isInterfaceEdge[37] = interfaceSurface[0];
5268 isInterfaceEdge[38] = interfaceSurface[2];
5269 isInterfaceEdge[39] =
false;
5270 isInterfaceEdge[40] = interfaceSurface[2];
5271 isInterfaceEdge[41] = interfaceSurface[3];
5273 predecessorElement[36] = -1;
5274 predecessorElement[37] = -1;
5275 predecessorElement[38] = -1;
5276 predecessorElement[39] = -1;
5277 predecessorElement[40] = -1;
5278 predecessorElement[41] = -1;
5281 newTriangles[24]= {midPointInd[1],midPointInd[2],midPointInd[3]};
5282 newTriangles[25]= {midPointInd[1],midPointInd[2],midPointInd[5]};
5283 newTriangles[26]= {midPointInd[1],midPointInd[3],midPointInd[5]};
5284 newTriangles[27]= {midPointInd[2],midPointInd[3],midPointInd[5]};
5286 newTrianglesFlag[24]= this->volumeID_;
5287 newTrianglesFlag[25]= originFlag[2];
5288 newTrianglesFlag[26]= this->volumeID_;
5289 newTrianglesFlag[27]= this->volumeID_;
5291 isInterfaceSurface[24] =
false;
5292 isInterfaceSurface[25] = interfaceSurface[2];
5293 isInterfaceSurface[26] =
false;
5294 isInterfaceSurface[27] =
false;
5296 newTriangleEdgeIDs[6]={36,37,39,36,38,40,37,38,41,39,40,41};
5299 (newElements)[7]={midPointInd[2],midPointInd[3],midPointInd[4],midPointInd[5]};
5301 (newEdges)[42] = {midPointInd[2] ,midPointInd[3]};
5302 (newEdges)[43] = {midPointInd[2] ,midPointInd[4]};
5303 (newEdges)[44] = {midPointInd[2] ,midPointInd[5]};
5304 (newEdges)[45] = {midPointInd[3] ,midPointInd[4]};
5305 (newEdges)[46] = {midPointInd[3] ,midPointInd[5]};
5306 (newEdges)[47] = {midPointInd[4] ,midPointInd[5]};
5308 edgeFlags[42]=this->volumeID_;
5309 edgeFlags[43]=originFlag[1];
5310 edgeFlags[44]=originFlag[2];
5311 edgeFlags[45]=originFlag[3];
5312 edgeFlags[46]=originFlag[3];
5313 edgeFlags[47]=originFlag[3];
5315 isInterfaceEdge[42] =
false;
5316 isInterfaceEdge[43] = interfaceSurface[1];
5317 isInterfaceEdge[44] = interfaceSurface[2];
5318 isInterfaceEdge[45] = interfaceSurface[3];
5319 isInterfaceEdge[46] = interfaceSurface[3];
5320 isInterfaceEdge[47] = interfaceSurface[3];
5322 predecessorElement[42] = -1;
5323 predecessorElement[43] = -1;
5324 predecessorElement[44] = -1;
5325 predecessorElement[45] = -1;
5326 predecessorElement[46] = -1;
5327 predecessorElement[47] = -1;
5330 newTriangles[28]= {midPointInd[2],midPointInd[3],midPointInd[4]};
5331 newTriangles[29]= {midPointInd[2],midPointInd[3],midPointInd[5]};
5332 newTriangles[30]= {midPointInd[2],midPointInd[4],midPointInd[5]};
5333 newTriangles[31]= {midPointInd[3],midPointInd[4],midPointInd[5]};
5335 newTrianglesFlag[28]= this->volumeID_;
5336 newTrianglesFlag[29]= this->volumeID_;
5337 newTrianglesFlag[30]= this->volumeID_;
5338 newTrianglesFlag[31]= originFlag[3];
5340 isInterfaceSurface[28] =
false;
5341 isInterfaceSurface[29] =
false;
5342 isInterfaceSurface[30] =
false;
5343 isInterfaceSurface[31] = interfaceSurface[3];
5345 newTriangleEdgeIDs[7]={42,43,45,42,44,46,43,44,47,45,46,47};
5353 int offsetElements = this->elementsC_->numberElements();
5354 int offsetEdges = this->edgeElements_->numberElements();
5355 for(
int i=0;i<8; i++){
5358 feNew.setFiniteElementRefinementType(
"regular");
5359 feNew.setPredecessorElement(indexElement);
5360 if(elements->getElement(indexElement).getFiniteElementRefinementType() ==
"irregular" || elements->getElement(indexElement).getFiniteElementRefinementType() ==
"irregularRegular" )
5361 feNew.setFiniteElementRefinementType(
"irregularRegular");
5363 this->elementsC_->addElement(feNew);
5365 this->elementsC_->switchElement(indexElement,feNew);
5369 for(
int i=0;i<48; i++){
5370 sort( newEdges.at(i).begin(), newEdges.at(i).end() );
5372 feNew.setInterfaceElement(isInterfaceEdge[i]);
5373 feNew.setPredecessorElement(predecessorElement[i]);
5375 this->edgeElements_->addEdge(feNew,i/6+offsetElements);
5378 this->edgeElements_->addEdge(feNew,indexElement);
5383 int offsetSurfaces =this->surfaceTriangleElements_->numberElements();
5384 int offsetSurface =0;
5385 for(
int i=0;i<32; i++){
5388 feNew.setInterfaceElement(isInterfaceSurface[i]);
5390 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
5391 if ( !this->elementsC_->getElement(i/4+offsetElements).subElementsInitialized() )
5392 this->elementsC_->getElement(i/4+offsetElements).initializeSubElements( this->FEType_, this->dim_ -1) ;
5393 this->elementsC_->getElement(i/4+offsetElements).addSubElement(feNew);
5395 this->surfaceTriangleElements_->addSurface(feNew, i/4+offsetElements);
5399 if(newTrianglesFlag[i]!=0 && newTrianglesFlag[i]!=this->volumeID_){
5400 if ( !this->elementsC_->getElement(indexElement).subElementsInitialized() )
5401 this->elementsC_->getElement(indexElement).initializeSubElements( this->FEType_, this->dim_ -1) ;
5402 this->elementsC_->getElement(indexElement).addSubElement(feNew);
5404 this->surfaceTriangleElements_->addSurface(feNew, indexElement);
5417 for(
int i=0;i<8; i++){
5419 element = this->elementsC_->getElement(i+offsetElements);
5422 element = this->elementsC_->getElement(indexElement);
5425 for(
int j=0; j<48 ; j++){
5426 FiniteElement feEdge = this->edgeElements_->getElement(j+offsetEdges);
5427 if(feEdge.getFlag() != this->volumeID_){
5429 element.addSubElement( feEdge );
5430 else if ( !element.subElementsInitialized() ){
5431 element.initializeSubElements(
"P1", 1 );
5432 element.addSubElement( feEdge );
5436 ElementsPtr_Type surfaces = element.getSubElements();
5438 surfaces->setToCorrectElement( feEdge );
5444 for (
int d=0; d<6; d++){
5446 edgeElements->getElement(edgeNumbers[d]).tagForRefinement();
5451 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::runtime_error,
"The Refinement Algorithm for the Dimension at hand is not available");