1 #include "createspecialmapping.h"
5 #include <vtkCharArray.h>
7 #include "smoothingutilities.h"
9 #include "swaptriangles.h"
10 #include "laplacesmoother.h"
11 #include "guimainwindow.h"
16 CreateSpecialMapping::CreateSpecialMapping()
21 int CreateSpecialMapping::Process()
24 for(i_iter
=0;i_iter
<NumberOfIterations
;i_iter
++)//TODO:Optimize this loop
26 cout
<<"===ITERATION NB "<<i_iter
<<"/"<<NumberOfIterations
<<"==="<<endl
;
28 m_total_N_newpoints
=0;
31 getAllSurfaceCells(m_AllCells
,m_grid
);
32 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
33 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
35 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
37 m_SelectedNodes
.clear();
38 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
39 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
43 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
45 //Phase D: edit points
46 cout
<<"===Phase D==="<<endl
;
56 /* if(insert_FP) insert_FP_all();
57 if(insert_EP) insert_EP_all();
58 if(remove_FP) remove_FP_all();
59 if(remove_EP) remove_EP_all();*/
63 UpdateDesiredMeshDensity();
65 if(DoSwap
) SwapFunction();
66 if(DoLaplaceSmoothing
) SmoothFunction();
70 UpdateDesiredMeshDensity();
72 if(DoSwap
) SwapFunction();
73 if(DoLaplaceSmoothing
) SmoothFunction();
77 UpdateDesiredMeshDensity();
79 if(DoSwap
) SwapFunction();
80 if(DoLaplaceSmoothing
) SmoothFunction();
84 UpdateDesiredMeshDensity();
86 if(DoSwap
) SwapFunction();
87 if(DoLaplaceSmoothing
) SmoothFunction();
90 /* if(DoSwap) SwapFunction();
91 if(DoLaplaceSmoothing) SmoothFunction();*/
93 cout
<<"===Summary==="<<endl
;
94 cout
<<"N_inserted_FP="<<N_inserted_FP
<<endl
;
95 cout
<<"N_inserted_EP="<<N_inserted_EP
<<endl
;
96 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
97 cout
<<"N_removed_EP="<<N_removed_EP
<<endl
;
99 cout
<<"N_points="<<N_points
<<endl
;
100 cout
<<"N_cells="<<N_cells
<<endl
;
101 cout
<<"m_total_N_newpoints="<<m_total_N_newpoints
<<endl
;
102 cout
<<"m_total_N_newcells="<<m_total_N_newcells
<<endl
;
103 cout
<<"============"<<endl
;
105 // if(m_total_N_newpoints==0 && m_total_N_newcells==0) break;
106 if(N_inserted_FP
==0 && N_inserted_EP
==0 && N_removed_FP
==0 && N_removed_EP
==0) break;
109 cout
<<"i_iter/NumberOfIterations="<<i_iter
<<"/"<<NumberOfIterations
<<endl
;
110 UpdateDesiredMeshDensity();
112 if(i_iter
<NumberOfIterations
) cout
<<"WARNING: Exited before finishing all iterations."<<endl
;
117 int CreateSpecialMapping::UpdateDesiredMeshDensity()
119 getAllSurfaceCells(m_AllCells
,m_grid
);
120 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
121 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
123 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
125 m_SelectedNodes
.clear();
126 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
127 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
128 getNodesFromCells(m_AllCells
, m_AllNodes
, m_grid
);
131 setCells(m_AllCells
);
133 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
136 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
137 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
138 EG_VTKDCN(vtkIntArray
, node_specified_density
, m_grid
, "node_specified_density");
140 /* //Phase A : Calculate current mesh density
141 cout<<"===Phase A==="<<endl;
143 foreach(vtkIdType node,m_SelectedNodes)
145 VertexMeshDensity nodeVMD = getVMD(node,node_type->GetValue(node));
146 int idx=VMDvector.indexOf(nodeVMD);
147 if(DebugLevel>3) cout<<"idx="<<idx<<endl;
148 if(idx!=-1)//specified
150 node_meshdensity->SetValue(node, VMDvector[idx].density);
154 double L=CurrentVertexAvgDist(node,n2n,m_grid);
156 node_meshdensity->SetValue(node, D);
160 //Phase B : define desired mesh density
161 cout
<<"===Phase B==="<<endl
;
162 double diff
=Convergence_meshdensity
+1;
163 if(DebugLevel
>3) cout
<<"before loop: diff="<<diff
<<endl
;
167 if(DebugLevel
>2) cout
<<"--->diff="<<diff
<<endl
;
169 foreach(vtkIdType node
,m_AllNodes
)
171 if(DebugLevel
>2) cout
<<"======>"<<endl
;
172 VertexMeshDensity nodeVMD
= getVMD(node
,node_type
->GetValue(node
));
173 int idx
=VMDvector
.indexOf(nodeVMD
);
174 node_specified_density
->SetValue(node
, idx
);
175 if(DebugLevel
>2) cout
<<"------>idx="<<idx
<<endl
;
176 if(idx
!=-1)//specified
178 node_meshdensity
->SetValue(node
, VMDvector
[idx
].density
);
182 double D
=DesiredMeshDensity(node
,n2n
,m_grid
);
185 cout
<<"------>FIRST:"<<endl
;
186 cout
<<"------>D="<<D
<<endl
;
187 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
188 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
189 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
191 diff
=abs(D
-node_meshdensity
->GetValue(node
));
196 cout
<<"------>NOT FIRST:"<<endl
;
197 cout
<<"------>D="<<D
<<endl
;
198 cout
<<"------>node_meshdensity->GetValue("<<node
<<")="<<node_meshdensity
->GetValue(node
)<<endl
;
199 cout
<<"------>D-node_meshdensity->GetValue("<<node
<<")="<<D
-node_meshdensity
->GetValue(node
)<<endl
;
200 cout
<<"------>diff=abs(D-node_meshdensity->GetValue("<<node
<<"))="<<abs(D
-node_meshdensity
->GetValue(node
))<<endl
;
201 cout
<<"------>diff="<<diff
<<endl
;
202 cout
<<"------>max(abs(D-node_meshdensity->GetValue("<<node
<<")),diff)="<<max(abs(D
-node_meshdensity
->GetValue(node
)),diff
)<<endl
;
204 diff
=max(abs(D
-node_meshdensity
->GetValue(node
)),diff
);
206 node_meshdensity
->SetValue(node
, D
);
208 if(DebugLevel
>2) cout
<<"======>"<<endl
;
211 } while(diff
>Convergence_meshdensity
&& !first
&& iter
<maxiter_density
);// if first=true, it means no new mesh density has been defined (all densities specified)
212 cout
<<"iter="<<iter
<<endl
;
213 if(iter
>=maxiter_density
) cout
<<"WARNING: Desired convergence factor has not been reached!"<<endl
;
217 int CreateSpecialMapping::SwapFunction()
219 //Phase E : Delaunay swap
220 QSet
<int> bcs_complement
=complementary_bcs(m_bcs
,m_grid
,cells
);
221 cout
<<"m_bcs="<<m_bcs
<<endl
;
222 cout
<<"bcs_complement="<<bcs_complement
<<endl
;
225 swap
.setGrid(m_grid
);
226 swap
.setBoundaryCodes(bcs_complement
);
231 int CreateSpecialMapping::SmoothFunction()
233 //Phase F : translate points to smooth grid
237 //laplacian smoothing with projection
238 //Roland smoothing with projection
240 //laplacian smoothing with projection
242 Lap
.SetInput(m_bcs
,m_grid
);
243 Lap
.SetNumberOfIterations(N_SmoothIterations
);
248 VertexMeshDensity
CreateSpecialMapping::getVMD(vtkIdType node
, char VertexType
)
250 VertexMeshDensity VMD
;
253 VMD
.CurrentNode
=node
;
254 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
255 /* createNodeMapping(nodes, _nodes, m_grid);
256 createNodeToCell(m_AllCells, nodes, _nodes, n2c, m_grid);*/
259 foreach(vtkIdType C
, n2c
[node
])
261 bc
.insert(cell_code
->GetValue(C
));
262 VMD
.BCmap
[cell_code
->GetValue(C
)]=2;
264 VMD
.BClist
.resize(bc
.size());
265 qCopy(bc
.begin(),bc
.end(),VMD
.BClist
.begin());
266 qSort(VMD
.BClist
.begin(),VMD
.BClist
.end());
270 int CreateSpecialMapping::insert_FP_counter()
272 cout
<<"===insert_FP_counter() START==="<<endl
;
273 foreach(vtkIdType id_cell
, m_SelectedCells
)
275 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
277 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
279 marked_cells
[id_cell
]=true;
284 cout
<<"===insert_FP_counter() END==="<<endl
;
288 int CreateSpecialMapping::insert_EP_counter()
290 cout
<<"===insert_EP_counter() START==="<<endl
;
292 //Phase C: Prepare edge_map
293 cout
<<"===Phase C==="<<endl
;
296 foreach(vtkIdType node1
,m_SelectedNodes
)
298 // cout<<"node1="<<node1<<endl;
299 foreach(vtkIdType node2
,n2n
[node1
])
301 if(edge_map
[OrderedPair(node1
,node2
)]==0) { //this edge hasn't been numbered yet
302 edge_map
[OrderedPair(node1
,node2
)]=edgeId
;edgeId
++;
306 cout
<<"edge_map.size()="<<edge_map
.size()<<endl
;
308 StencilVector
.clear();
309 QMapIterator
< pair
<vtkIdType
,vtkIdType
>, vtkIdType
> edge_map_iter(edge_map
);
310 //rewind the iterator
311 edge_map_iter
.toFront ();
313 while (edge_map_iter
.hasNext()) {
314 edge_map_iter
.next();
315 vtkIdType node1
=edge_map_iter
.key().first
;
316 vtkIdType node2
=edge_map_iter
.key().second
;
317 if(DebugLevel
>10) cout
<< "--->(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
318 QSet
<int> stencil_cells_set
;
319 QVector
<int> stencil_cells_vector
;
320 stencil_cells_set
=n2c
[node1
];
321 stencil_cells_set
.intersect(n2c
[node2
]);
322 if(DebugLevel
>10) cout
<<"stencil_cells_set="<<stencil_cells_set
<<endl
;
324 stencil_cells_vector
.resize(stencil_cells_set
.size());
325 qCopy(stencil_cells_set
.begin(),stencil_cells_set
.end(),stencil_cells_vector
.begin());
326 if(DebugLevel
>10) cout
<<"stencil_cells_vector="<<stencil_cells_vector
<<endl
;
328 vtkIdType id_cell
=stencil_cells_vector
[0];
329 int SideToSplit
= getSide(id_cell
,m_grid
,node1
,node2
);
330 if(DebugLevel
>10) cout
<<"SideToSplit="<<SideToSplit
<<endl
;
331 if(DebugLevel
>10) cout
<<"c2c[id_cell][SideToSplit]="<<c2c
[id_cell
][SideToSplit
]<<endl
;
332 if(DebugLevel
>10) for(int i
=0;i
<3;i
++) cout
<<"c2c[id_cell]["<<i
<<"]="<<c2c
[id_cell
][i
]<<endl
;
333 stencil_t S
=getStencil(id_cell
,SideToSplit
);
335 bool stencil_marked
=false;
336 foreach(vtkIdType C
,stencil_cells_vector
)
338 if(marked_cells
[C
]) stencil_marked
=true;
340 if(DebugLevel
>10) cout
<<"stencil_marked="<<stencil_marked
<<endl
;
341 if(DebugLevel
>10) cout
<<"insert_edgepoint(node1,node2)="<<insert_edgepoint(node1
,node2
)<<endl
;
343 if( !stencil_marked
&& insert_edgepoint(node1
,node2
) )
345 if(DebugLevel
>1) cout
<<"inserting an edge point "<< "(" << node1
<< "," << node2
<< ")" << ": " << edge_map_iter
.value() << endl
;
347 foreach(vtkIdType C
,stencil_cells_vector
) marked_cells
[C
]=true;
348 StencilVector
.push_back(S
);
350 if(stencil_cells_vector
.size()==2)//2 cells around the edge
355 else//1 cell around the edge
361 if(DebugLevel
>10) cout
<<"--->end of edge processing"<<endl
;
363 cout
<<"===insert_EP_counter() END==="<<endl
;
367 int CreateSpecialMapping::remove_FP_counter()
369 cout
<<"===remove_FP_counter() START==="<<endl
;
370 cout
<<"marked_cells="<<marked_cells
<<endl
;
371 // cout<<"hitlist="<<hitlist<<endl;
372 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
373 cout
<<"N_newcells="<<N_newcells
<<endl
;
374 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
375 cout
<<"N_removed_FP="<<N_removed_FP
<<endl
;
378 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
379 foreach(vtkIdType node
,m_SelectedNodes
)
381 if(node_type
->GetValue(node
)==VTK_SIMPLE_VERTEX
)
384 foreach(vtkIdType C
,n2c
[node
])
386 if(marked_cells
[C
]) marked
=true;
389 QSet
<vtkIdType
> DeadCells
;
390 QSet
<vtkIdType
> MutatedCells
;
391 QSet
<vtkIdType
> MutilatedCells
;
392 if( !marked
&& remove_fieldpoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
394 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
397 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
403 cout
<<"===remove_FP_counter() END==="<<endl
;
407 int CreateSpecialMapping::remove_EP_counter()
409 cout
<<"===remove_EP_counter() START==="<<endl
;
411 EG_VTKDCN(vtkCharArray
, node_type
, m_grid
, "node_type");
412 foreach(vtkIdType node
,m_SelectedNodes
)
414 if(node_type
->GetValue(node
)==VTK_BOUNDARY_EDGE_VERTEX
)
417 foreach(vtkIdType C
,n2c
[node
])
419 if(marked_cells
[C
]) marked
=true;
421 QSet
<vtkIdType
> DeadCells
;
422 QSet
<vtkIdType
> MutatedCells
;
423 QSet
<vtkIdType
> MutilatedCells
;
424 if( !marked
&& remove_edgepoint(node
) && FindSnapPoint(m_grid
,node
,DeadCells
,MutatedCells
,MutilatedCells
, N_newpoints
, N_newcells
)!=-1)
426 cout
<<"removing edge point "<<node
<<endl
;
429 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
430 if(n2n
[node
].size()==4)//4 cells around the edge
435 else//2 cells around the edge
443 cout
<<"===remove_EP_counter() END==="<<endl
;
447 int CreateSpecialMapping::insert_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
449 cout
<<"===insert_FP_actor START==="<<endl
;
451 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
452 foreach(vtkIdType id_cell
, m_SelectedCells
)
454 /* if(marked_cells[id_cell]) cout<<"--->marked_cells["<<id_cell<<"]=TRUE"<<endl;
455 else cout<<"--->marked_cells["<<id_cell<<"]=FALSE"<<endl;*/
457 if( !marked_cells
[id_cell
] && insert_fieldpoint(id_cell
) )
459 if(DebugLevel
>0) cout
<<"inserting a field point "<<id_cell
<<endl
;
460 vtkIdType newBC
=cell_code_tmp
->GetValue(id_cell
);
461 if(DebugLevel
>42) cout
<<"id_cell="<<id_cell
<<" newBC="<<newBC
<<endl
;
463 vtkIdType N_pts
, *pts
;
464 m_grid
->GetCellPoints(id_cell
, N_pts
, pts
);
467 int N_neighbours
=N_pts
;
468 if(DebugLevel
>42) cout
<<"N_neighbours="<<N_neighbours
<<endl
;
470 vtkIdType pts_triangle
[4][3];
471 for(int i
=0;i
<N_neighbours
;i
++)
473 m_grid
->GetPoints()->GetPoint(pts
[i
], corner
[i
].data());
476 C
=(1/(double)N_neighbours
)*C
;
477 addPoint(grid_tmp
,m_newNodeId
,C
.data());
478 vtkIdType intmidpoint
=m_newNodeId
;
481 for(int i
=0;i
<N_neighbours
;i
++)
483 pts_triangle
[i
][0]=pts
[i
];
484 pts_triangle
[i
][1]=pts
[(i
+1)%N_neighbours
];
485 pts_triangle
[i
][2]=intmidpoint
;
488 grid_tmp
->ReplaceCell(id_cell
, 3, pts_triangle
[0]);
489 cell_code_tmp
->SetValue(id_cell
, newBC
);
493 vtkIdType newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[i
]);
494 cell_code_tmp
->SetValue(newCellId
, newBC
);
500 cout
<<"===insert_FP_actor END==="<<endl
;
504 int CreateSpecialMapping::insert_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
506 cout
<<"===insert_EP_actor START==="<<endl
;
508 EG_VTKDCC(vtkIntArray
, cell_code_tmp
, grid_tmp
, "cell_code");
509 foreach(stencil_t S
,StencilVector
)
511 if(DebugLevel
>10) cout
<<"S="<<S
<<endl
;
513 grid_tmp
->GetPoint(S
.p
[1],A
.data());
514 grid_tmp
->GetPoint(S
.p
[3],B
.data());
516 addPoint(grid_tmp
,m_newNodeId
,M
.data());
517 if(DebugLevel
>0) cout
<<"NEW EDGE POINT: "<<m_newNodeId
<<endl
;
519 vtkIdType pts_triangle
[4][3];
521 if(S
.valid
){//there is a neighbour cell
522 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
523 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell2
<<"]=true;"<<endl
;
524 marked_cells
[S
.id_cell1
]=true;
525 marked_cells
[S
.id_cell2
]=true;
529 pts_triangle
[i
][0]=S
.p
[i
];
530 pts_triangle
[i
][1]=S
.p
[(i
+1)%4];
531 pts_triangle
[i
][2]=m_newNodeId
;
534 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
535 int bc2
=cell_code_tmp
->GetValue(S
.id_cell2
);
537 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
538 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
540 grid_tmp
->ReplaceCell(S
.id_cell2
, 3, pts_triangle
[1]);
541 cell_code_tmp
->SetValue(S
.id_cell2
, bc2
);
544 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[2]);
545 cell_code_tmp
->SetValue(newCellId
, bc2
);
546 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
547 cell_code_tmp
->SetValue(newCellId
, bc1
);
549 else{//there is no neighbour cell
550 if(DebugLevel
>10) cout
<<"marked_cells["<<S
.id_cell1
<<"]=true;"<<endl
;
551 marked_cells
[S
.id_cell1
]=true;
553 pts_triangle
[0][0]=S
.p
[0];
554 pts_triangle
[0][1]=S
.p
[1];
555 pts_triangle
[0][2]=m_newNodeId
;
556 pts_triangle
[3][0]=S
.p
[3];
557 pts_triangle
[3][1]=S
.p
[0];
558 pts_triangle
[3][2]=m_newNodeId
;
560 int bc1
=cell_code_tmp
->GetValue(S
.id_cell1
);
562 grid_tmp
->ReplaceCell(S
.id_cell1
, 3, pts_triangle
[0]);
563 cell_code_tmp
->SetValue(S
.id_cell1
, bc1
);
566 newCellId
= grid_tmp
->InsertNextCell(VTK_TRIANGLE
,3,pts_triangle
[3]);
567 cell_code_tmp
->SetValue(newCellId
, bc1
);
572 cout
<<"===insert_EP_actor END==="<<endl
;
576 int CreateSpecialMapping::remove_FP_actor(vtkUnstructuredGrid
* grid_tmp
)
578 cout
<<"===remove_FP_actor START==="<<endl
;
581 foreach(vtkIdType node
,m_SelectedNodes
)
588 foreach(vtkIdType C
,n2c
[node
])
590 if(marked_cells
[C
]) marked
=true;
592 if( !marked
&& remove_fieldpoint(node
) )
594 if(DebugLevel
>1) cout
<<"removing field point "<<node
<<endl
;
595 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
596 //TODO: Special copy function, leaving out nodes to remove
599 cout
<<"===remove_FP_actor END==="<<endl
;
603 int CreateSpecialMapping::remove_EP_actor(vtkUnstructuredGrid
* grid_tmp
)
605 cout
<<"===remove_EP_actor START==="<<endl
;
608 foreach(vtkIdType node
,m_SelectedNodes
)
611 foreach(vtkIdType C
,n2c
[node
])
613 if(marked_cells
[C
]) marked
=true;
615 if( !marked
&& remove_edgepoint(node
) )
617 if(DebugLevel
>1) cout
<<"removing edge point "<<node
<<endl
;
618 foreach(vtkIdType C
,n2c
[node
]) marked_cells
[C
]=true;
619 if(n2n
[node
].size()==4)//4 cells around the edge
623 else//2 cells around the edge
629 cout
<<"===remove_EP_actor END==="<<endl
;
633 int CreateSpecialMapping::insert_FP_all()
635 cout
<<"===insert_FP_all START==="<<endl
;
637 getAllSurfaceCells(m_AllCells
,m_grid
);
638 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
639 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
640 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
641 m_SelectedNodes
.clear();
642 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
643 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
645 setCells(m_AllCells
);
646 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
650 N_points
=m_grid
->GetNumberOfPoints();
651 N_cells
=m_grid
->GetNumberOfCells();
655 marked_cells
.clear();
656 marked_nodes
.clear();
660 //unmark cells (TODO: optimize)
661 marked_cells
.clear();
663 N_points
=m_grid
->GetNumberOfPoints();
664 N_cells
=m_grid
->GetNumberOfCells();
665 cout
<<"N_points="<<N_points
<<endl
;
666 cout
<<"N_cells="<<N_cells
<<endl
;
667 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
668 cout
<<"N_newcells="<<N_newcells
<<endl
;
669 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
670 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
671 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
673 makeCopyNoAlloc(m_grid
, grid_tmp
);
674 //initialize new node counter
675 m_newNodeId
=N_points
;
677 insert_FP_actor(grid_tmp
);
679 makeCopy(grid_tmp
,m_grid
);
680 cout
<<"===insert_FP_all END==="<<endl
;
684 int CreateSpecialMapping::insert_EP_all()
686 cout
<<"===insert_EP_all START==="<<endl
;
688 getAllSurfaceCells(m_AllCells
,m_grid
);
689 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
690 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
691 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
692 m_SelectedNodes
.clear();
693 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
694 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
696 setCells(m_AllCells
);
697 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
701 N_points
=m_grid
->GetNumberOfPoints();
702 N_cells
=m_grid
->GetNumberOfCells();
706 marked_cells
.clear();
707 marked_nodes
.clear();
711 //unmark cells (TODO: optimize)
712 marked_cells
.clear();
714 N_points
=m_grid
->GetNumberOfPoints();
715 N_cells
=m_grid
->GetNumberOfCells();
716 cout
<<"N_points="<<N_points
<<endl
;
717 cout
<<"N_cells="<<N_cells
<<endl
;
718 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
719 cout
<<"N_newcells="<<N_newcells
<<endl
;
720 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
721 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
722 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
724 makeCopyNoAlloc(m_grid
, grid_tmp
);
725 //initialize new node counter
726 m_newNodeId
=N_points
;
728 insert_EP_actor(grid_tmp
);
730 makeCopy(grid_tmp
,m_grid
);
732 cout
<<"===insert_EP_all END==="<<endl
;
736 int CreateSpecialMapping::remove_FP_all()
738 cout
<<"===remove_FP_all START==="<<endl
;
740 getAllSurfaceCells(m_AllCells
,m_grid
);
741 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
742 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
743 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
744 m_SelectedNodes
.clear();
745 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
746 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
748 setCells(m_AllCells
);
749 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
753 N_points
=m_grid
->GetNumberOfPoints();
754 N_cells
=m_grid
->GetNumberOfCells();
758 hitlist
.resize(N_points
);
759 offset
.resize(N_points
);
761 marked_cells
.clear();
762 marked_nodes
.clear();
766 //unmark cells (TODO: optimize)
767 marked_cells
.clear();
769 N_points
=m_grid
->GetNumberOfPoints();
770 N_cells
=m_grid
->GetNumberOfCells();
771 cout
<<"N_points="<<N_points
<<endl
;
772 cout
<<"N_cells="<<N_cells
<<endl
;
773 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
774 cout
<<"N_newcells="<<N_newcells
<<endl
;
775 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
776 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
777 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
779 makeCopyNoAlloc(m_grid
, grid_tmp
);
780 //initialize new node counter
781 m_newNodeId
=N_points
;
783 remove_FP_actor(grid_tmp
);
785 makeCopy(grid_tmp
,m_grid
);
787 cout
<<"===remove_FP_all END==="<<endl
;
791 int CreateSpecialMapping::remove_EP_all()
793 cout
<<"===remove_EP_all START==="<<endl
;
795 getAllSurfaceCells(m_AllCells
,m_grid
);
796 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
797 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
798 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
799 m_SelectedNodes
.clear();
800 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
801 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
803 setCells(m_AllCells
);
804 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
808 N_points
=m_grid
->GetNumberOfPoints();
809 N_cells
=m_grid
->GetNumberOfCells();
813 hitlist
.resize(N_points
);
814 offset
.resize(N_points
);
816 marked_cells
.clear();
817 marked_nodes
.clear();
821 //unmark cells (TODO: optimize)
822 marked_cells
.clear();
824 N_points
=m_grid
->GetNumberOfPoints();
825 N_cells
=m_grid
->GetNumberOfCells();
826 cout
<<"N_points="<<N_points
<<endl
;
827 cout
<<"N_cells="<<N_cells
<<endl
;
828 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
829 cout
<<"N_newcells="<<N_newcells
<<endl
;
830 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
831 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
832 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
834 makeCopyNoAlloc(m_grid
, grid_tmp
);
835 //initialize new node counter
836 m_newNodeId
=N_points
;
838 remove_EP_actor(grid_tmp
);
840 makeCopy(grid_tmp
,m_grid
);
842 cout
<<"===remove_EP_all END==="<<endl
;
846 int CreateSpecialMapping::FullEdit()
848 cout
<<"===FullEdit START==="<<endl
;
855 N_points
=m_grid
->GetNumberOfPoints();
856 N_cells
=m_grid
->GetNumberOfCells();
860 hitlist
.resize(N_points
);
861 offset
.resize(N_points
);
863 marked_cells
.clear();
864 marked_nodes
.clear();
866 if(insert_FP
) insert_FP_counter();
867 if(insert_EP
) insert_EP_counter();
868 if(remove_FP
) remove_FP_counter();
869 if(remove_EP
) remove_EP_counter();
871 cout
<<"================="<<endl
;
872 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
873 // cout<<"hitlist="<<hitlist<<endl;
874 cout
<<"================="<<endl
;
876 //unmark cells (TODO: optimize)
877 marked_cells
.clear();
879 N_points
=m_grid
->GetNumberOfPoints();
880 N_cells
=m_grid
->GetNumberOfCells();
881 cout
<<"N_points="<<N_points
<<endl
;
882 cout
<<"N_cells="<<N_cells
<<endl
;
883 cout
<<"N_newpoints="<<N_newpoints
<<endl
;
884 cout
<<"N_newcells="<<N_newcells
<<endl
;
885 EG_VTKSP(vtkUnstructuredGrid
,grid_tmp
);
886 allocateGrid(grid_tmp
,N_cells
+N_newcells
,N_points
+N_newpoints
);
887 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
889 makeCopyNoAlloc(m_grid
, grid_tmp
);//TODO: This will not work if the size of the grid is reduced!
890 //initialize new node counter
891 m_newNodeId
=N_points
;
893 if(insert_FP
) insert_FP_actor(grid_tmp
);
894 if(insert_EP
) insert_EP_actor(grid_tmp
);
896 cout
<<"================="<<endl
;
897 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
898 // cout<<"hitlist="<<hitlist<<endl;
899 cout
<<"================="<<endl
;
900 if(remove_FP
) remove_FP_actor(grid_tmp
);
901 if(remove_EP
) remove_EP_actor(grid_tmp
);
903 makeCopy(grid_tmp
,m_grid
);
905 cout
<<"===FullEdit END==="<<endl
;
909 int CreateSpecialMapping::remove_EP_all_2()
911 cout
<<"===remove_EP_all_2 START==="<<endl
;
912 getAllSurfaceCells(m_AllCells
,m_grid
);
913 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
914 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
915 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
916 m_SelectedNodes
.clear();
917 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
918 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
920 setCells(m_AllCells
);
921 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
925 N_points
=m_grid
->GetNumberOfPoints();
926 N_cells
=m_grid
->GetNumberOfCells();
932 hitlist
.resize(N_points
);
933 offset
.resize(N_points
);
935 marked_cells
.clear();
936 marked_nodes
.clear();
939 cout
<<"================="<<endl
;
940 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
941 // cout<<"hitlist="<<hitlist<<endl;
942 cout
<<"================="<<endl
;
946 for(int i
=0;i
<hitlist
.size();i
++)
950 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
952 QString num1
;num1
.setNum(i
);
953 QString num2
;num2
.setNum(i
-kills
);
954 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
956 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
957 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
962 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
966 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
970 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
974 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
975 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
976 cout
<<"===remove_EP_all_2 END==="<<endl
;
980 int CreateSpecialMapping::remove_FP_all_2()
982 cout
<<"===remove_FP_all_2 START==="<<endl
;
983 /* cout<<"+++++++"<<endl;
984 cout_grid(cout,m_grid,true,true,true,true);
985 cout<<"+++++++"<<endl;*/
987 getAllSurfaceCells(m_AllCells
,m_grid
);
988 getSurfaceCells(m_bcs
, m_SelectedCells
, m_grid
);
989 EG_VTKDCC(vtkIntArray
, cell_code
, m_grid
, "cell_code");
990 EG_VTKDCN(vtkDoubleArray
, node_meshdensity
, m_grid
, "node_meshdensity");
991 m_SelectedNodes
.clear();
992 getSurfaceNodes(m_bcs
,m_SelectedNodes
,m_grid
);
993 getNodesFromCells(m_AllCells
, nodes
, m_grid
);
995 setCells(m_AllCells
);
996 cout
<<"m_AllCells.size()="<<m_AllCells
.size()<<endl
;
1000 N_points
=m_grid
->GetNumberOfPoints();
1001 N_cells
=m_grid
->GetNumberOfCells();
1007 hitlist
.resize(N_points
);
1008 offset
.resize(N_points
);
1010 marked_cells
.clear();
1011 marked_nodes
.clear();
1013 // DualSave("pre-counter");
1014 remove_FP_counter();
1015 // DualSave("post-counter");
1017 // cout_grid(cout,m_grid);
1018 cout
<<"================="<<endl
;
1019 cout
<<"hitlist.size()="<<hitlist
.size()<<endl
;
1020 // cout<<"hitlist="<<hitlist<<endl;
1021 cout
<<"================="<<endl
;
1025 for(int i
=0;i
<hitlist
.size();i
++)
1029 if(DebugLevel
>47) cout
<<"Deleting point "<<i
<<" currently known as "<<i
-kills
<<endl
;
1031 QString num1
;num1
.setNum(i
);
1032 QString num2
;num2
.setNum(i
-kills
);
1033 // GuiMainWindow::pointer()->QuickSave("pre-deleting_"+num1+"_"+num2+".vtu");
1035 bool DelResult
=DeletePoint_2(m_grid
,i
-kills
,N_newpoints
,N_newcells
);
1036 m_total_N_newpoints
+=N_newpoints
; m_total_N_newcells
+=N_newcells
;
1041 if(DebugLevel
>47) cout
<<"Kill successful"<<endl
;
1045 if(DebugLevel
>47) cout
<<"Kill failed"<<endl
;
1049 // GuiMainWindow::pointer()->QuickSave("post-deleting_"+num1+"_"+num2+".vtu");
1053 cout
<<"Killed: "<<kills
<<"/"<<contracts
<<endl
;
1054 if(kills
!=contracts
) {cout
<<"MISSION FAILED"<<endl
;EG_BUG
;}
1055 cout
<<"===remove_FP_all_2 END==="<<endl
;