34#ifndef LEVEL_SET_UTIL_IMPL_H_
35#define LEVEL_SET_UTIL_IMPL_H_
51template<
typename TGr
idFunction>
63 std::vector<DoFIndex> ind;
70 grid.attach_to_vertices(aMin);
71 grid.attach_to_vertices(aMax);
76 for (
int si=0;si<uOld.num_subsets();++si)
79 iter !=uOld.template end<Vertex>(si); ++iter)
86 uOld.inner_dof_indices(vrt, 0, ind);
87 aaMax[vrt] =
DoFRef(uOld, ind[0]);
88 aaMin[vrt] =
DoFRef(uOld, ind[0]);
91 for (
int si=0;si<uOld.num_subsets();++si)
95 iter !=uOld.template end<Edge>(si); ++iter)
100 uOld.inner_dof_indices(vi, 0, ind);
102 uOld.inner_dof_indices(vj, 0, ind);
132 for (
int si=0;si<1;++si)
135 iter !=uOld.template end<Edge>(si); ++iter)
145 uOld.inner_dof_indices(vi, 0, ind);
147 uOld.inner_dof_indices(vj, 0, ind);
151 number uij = ui + distVec*gradi;
155 if (uij>aaMax[vi]) alpha=(aaMax[vi]-ui)/(distVec*gradi);
165 if (uij<aaMin[vi]) alpha=(aaMin[vi]-ui)/(distVec*gradi);
174 uij = uj + distVec*gradj;
178 if (uij>aaMax[vj]) alpha=(aaMax[vj]-uj)/(distVec*gradj);
188 if (uij<aaMin[vj]) alpha=(aaMin[vj]-uj)/(distVec*gradj);
210 for( ;iter !=iterEnd; ++iter)
221 size_t noc=elem->num_vertices();
222 for(
size_t i = 0; i < noc; ++i)
224 vVrt[i] = elem->vertex(i);
225 coCoord[i] = aaPos[vVrt[i]];
226 grad[i] =
aaGrad[vVrt[i]] ;
228 uOld.inner_dof_indices(vVrt[i], 0, ind);
229 u[i]=
DoFRef(uOld, ind[0]);
232 for (
size_t i=0;i<noc;++i)
238 uCenter = u[i] + distVec*grad[i];
241 if (uCenter>aaMax[vVrt[i]]) alpha=(aaMax[vVrt[i]]-u[i])/(distVec*grad[i]);
250 if (uCenter<aaMin[vVrt[i]]) alpha=(aaMin[vVrt[i]]-u[i])/(distVec*grad[i]);
261 grid.detach_from_vertices(aMin);
262 grid.detach_from_vertices(aMax);
273template<
typename TGr
idFunction>
274template <
typename TElem>
281 const TGridFunction& uOld,
287 static const size_t maxNumCo = 20;
293 std::vector<DoFIndex> multInd;
307 const size_t numVertices = elem->num_vertices();
308 for(
size_t i = 0; i < numVertices; ++i)
310 vVrt[i] = elem->vertex(i);
311 coCoord[i] = aaPos[vVrt[i]];
315 geo.
update(elem, &(coCoord[0]), uOld.domain()->subset_handler().get());
318 std::vector<number> uValue(geo.
num_scv());
320 for (
size_t i=0; i < noc; i++)
323 uOld.inner_dof_indices(vVrt[i], 0, multInd);
324 uValue[i]=
DoFRef(uOld, multInd[0]);
328 for (
size_t i=0; i < noc; i++)
331 uOld.inner_dof_indices(vVrt[i], 0, multInd);
332 grad[i]= aaGradient[vVrt[i]];
337 for (
size_t i=0; i<noc; ++i)
342 if (m_imVelocity->requires_grid_fct())
349 uNew.indices(elem, localind);
365 if (m_gamma!=1)
for (
size_t i=0; i < noc; i++) coVelocity[i]*=m_gamma;
369 for (
size_t i=0; i < noc; i++)
372 if (vnorm>1e-15)
for (
int j=0; j < dim; j++) coVelocity[i][j] += m_delta/vnorm*grad[i][j];
378 for (
size_t ip=0;ip < geo.
num_scvf();ip++)
382 for (
size_t co=0; co < noc; co++)
384 for (
int j=0; j<dim; j++)
385 ipVelocity[ip][j] += scvf.
shape(co)*coVelocity[co][j];
390 std::vector<number> coSource(noc);
398 for(
size_t ip = 0; ip < geo.
num_scvf(); ++ip)
404 size_t from = scvf.
from();
405 size_t to = scvf.
to();
406 if (scvf.
normal()*ipVelocity[ip]>0)
412 flux = m_dt*(ipVelocity[ip]*scvf.
normal())*( uValue[base] + (distVec*grad[base]) + 0.5*m_dt*(coSource[base] - (grad[base]*coVelocity[base])) );
414 uOld.inner_dof_indices(vVrt[from], 0, multInd);
415 DoFRef(uNew, multInd[0])-=flux/aaVolume[ vVrt[from] ];
418 DoFRef(uNew, multInd[0])+=m_dt*(ipVelocity[ip]*scvf.
normal())*(uValue[from] + 0.5*m_dt*(coSource[from] - (grad[from]*coVelocity[from])))/aaVolume[ vVrt[from] ];
421 uOld.inner_dof_indices(vVrt[
to], 0, multInd);
422 DoFRef(uNew, multInd[0])+=flux/aaVolume[ vVrt[
to] ];
425 DoFRef(uNew, multInd[0])-=m_dt*(ipVelocity[ip]*scvf.
normal())*(uValue[
to] + 0.5*m_dt*(coSource[
to] - (grad[
to]*coVelocity[
to])))/aaVolume[ vVrt[
to] ];
427 number localCFL = std::max(m_dt*std::abs(ipVelocity[ip]*scvf.
normal())/aaVolume[ vVrt[from] ],m_dt*std::abs(ipVelocity[ip]*scvf.
normal())/aaVolume[ vVrt[
to] ] );
428 if (localCFL>m_maxCFL)
437 for (
int si=0;si<uNew.num_subsets();++si)
440 for(
size_t i = 0; i < geo.
num_bf(si); ++i)
444 const size_t nodeID = bf.
node_id();
453 for (
size_t co=0;co<noc;co++)
456 for (
int j=0;j<dim;j++)
458 bipVelocity[j] += bf.
shape(co) * coVelocity[co][j];
459 bipGrad[j] += bf.
shape(co) * globalGradVec[co][j];
461 bipU += bf.
shape(co) * uValue[co];
462 bipSource += bf.
shape(co) * coSource[co];
465 flux = m_dt*(bipVelocity*bf.
normal())*uValue[nodeID];
466 uOld.inner_dof_indices(vVrt[nodeID], 0, multInd);
467 DoFRef(uNew, multInd[0])-=flux/aaVolume[ vVrt[nodeID] ];
470 DoFRef(uNew, multInd[0])+=m_dt*(bipVelocity*bf.
normal())*(uValue[nodeID] )/aaVolume[ vVrt[nodeID] ];
483template<
typename TGr
idFunction>
495 typename domain_type::grid_type&
grid = *domain.grid();
498 std::vector<DoFIndex> multInd;
516 for(
int si = 0; si < domain.subset_handler()->
num_subsets(); ++si)
519 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(si))
continue;
520 if (m_neumann_sg.size()!=0)
if (m_neumann_sg.contains(si))
continue;
521 if (m_inactive_sg.size()!=0)
if (m_inactive_sg.contains(si))
continue;
528 for( ;iter !=iterEnd; ++iter)
537 const size_t numVertices = elem->num_vertices();
538 for(
size_t i = 0; i < numVertices; ++i)
540 vVrt[i] = elem->vertex(i);
541 coCoord[i] = aaPos[vVrt[i]];
545 geo.
update(elem, &(coCoord[0]), domain.subset_handler().get());
554 for (
size_t i=0;i < noc;i++)
557 u.inner_dof_indices(vVrt[i], fct, multInd);
560 uValue[i]=
DoFRef(u, multInd[0]);
570 for (
size_t i=0;i < noc;i++)
582 for(
size_t sh = 0 ; sh < noc; ++sh)
600 aaGradient[vVrt[i]] += globalGrad;
601 aaVolume[vVrt[i]] += vol;
609 for (
int si=0;si < u.num_subsets();++si)
613 iter != u.template end<Vertex>(si); ++iter)
617 if (aaVolume[vrt]!=0)
619 (aaGradient[vrt]) /= aaVolume[vrt];
638template<
typename TGr
idFunction>
641 TGridFunction& numsol
651 for(
size_t i = 0; i < m_dirichlet_sg.size(); ++i)
653 const int si = m_dirichlet_sg[i];
656 iter != numsol.template end<Vertex>(si); ++iter)
664 std::vector<DoFIndex> ind;
666 const size_t numInd = numsol.inner_dof_indices(vrt, 0, ind);
669 if(numInd != 1) {
UG_LOG(
"ERROR: Wrong number of indices!");
return false;}
671 (*m_imDirichlet)(&exactVal,&aaPos[vrt],m_time,si,1);
672 DoFRef(numsol, ind[0]) = exactVal;
694template<
typename TGr
idFunction>
717 grid.attach_to_vertices(aScvVolume);
718 grid.attach_to_vertices(aGradient);
738 std::vector<DoFIndex> ind;
742 for (
size_t step=0; step<m_nrOfSteps; step++)
745 if (! calculate_vertex_grad_vol(uNew,aaGradient, aaVolume)) {
UG_LOG(
"ERROR: gradient computation failed!"); };
748 limit_grad(uNew,aaGradient);
753 for (
int si=0;si<uOld.num_subsets();++si)
757 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(si))
continue;
758 if (m_neumann_sg.size()!=0)
if (m_neumann_sg.contains(si))
continue;
759 if (m_inactive_sg.size()!=0)
if (m_inactive_sg.contains(si))
continue;
775 for(
size_t i = 0; i < m_neumann_sg.size(); ++i)
777 const int bndSi = m_neumann_sg[i];
783 for( ;iter !=iterEnd; ++iter)
790 assemble_element(elem, geo,
grid, uNew, uOld, aaGradient, aaVolume);
795 for (
int si=0;si<uOld.num_subsets();++si)
797 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(si))
continue;
798 if (m_inactive_sg.size()!=0)
if (m_inactive_sg.contains(si))
continue;
799 std::vector<number> sourceValue(1);
802 iter != uNew.template end<Vertex>(si); ++iter)
805 sourceCo[0]= aaPos[vrt];
806 (*m_imSource)(&sourceValue[0],sourceCo,m_time,si,1);
807 uNew.inner_dof_indices(vrt, 0, ind);
808 DoFRef(uNew, ind[0]) += m_dt*sourceValue[0];
817 assign_dirichlet(uNew);
820 for(
size_t i = 0; i < m_inactive_sg.size(); ++i)
822 const int si = m_inactive_sg[i];
823 UG_LOG(
"inactive si: " << si <<
"\n");
825 iter != uNew.template end<Vertex>(si); ++iter)
829 uNew.inner_dof_indices(vrt, 0, ind);
835 UG_LOG(
"time step length: " << m_dt <<
"\n");
836 UG_LOG(
"time step no.: " << m_timestep_nr <<
"\n");
837 UG_LOG(
"time: " << m_time <<
"\n");
838 UG_LOG(
"max CFL: " << m_maxCFL <<
"\n");
848 grid.detach_from_vertices(aScvVolume);
849 grid.detach_from_vertices(aGradient);
858template <
typename TGr
idFunction>
875 for(
int si = 0; si < u.num_subsets(); ++si)
883 for( ;iter !=iterEnd; ++iter)
888 size_t numVertices=elem->num_vertices();
890 for(
size_t i = 0; i < numVertices; ++i)
891 coCoord[i] = aaPos[elem->vertex(i)];
894 geo.
update(elem, &(coCoord[0]), domain.subset_handler().get());
898 for (
size_t i=0;i < geo.
num_scv();i++)
903 aaVolume[elem->vertex(i)] += scv.
volume();
916template<
typename TGr
idFunction>
929 grid.attach_to_vertices(aScvVolume);
943 if (! calculate_vertex_vol(numsol,aaVolume)) {
UG_LOG(
"ERROR: gradient computation failed in compute_error function!"); };
947 if(!bRes) {
UG_LOG(
"Error while calculating CV Volume.\n");
return false;}
948 for (
int si=0;si<numsol.num_subsets();++si)
952 iter != numsol.template end<Vertex>(si); ++iter)
960 std::vector<DoFIndex> ind;
962 const size_t numInd = numsol.dof_indices(vrt, 0, ind);
965 if(numInd != 1) {
UG_LOG(
"ERROR: Wrong number of indices!");
return false;}
967 (*m_imDirichlet)(&exactVal,&aaPos[vrt],m_time,si,1);
968 number differ = std::abs(
DoFRef(numsol, ind[0])-exactVal);
970 l1Error += aaVolume[vrt] * differ;
971 l2Error += aaVolume[vrt] * differ*differ;
976 UG_LOG(
"coord=" << aaPos[vrt] <<
" value=" <<
DoFRef(numsol, ind[0]) <<
" exact=" << exactVal <<
" error=" << differ <<
"\n");
979 if (differ > maxErr) maxErr = differ;
983 l2Error = sqrt(l2Error);
984 UG_LOG(
"timestep " << m_timestep_nr <<
" time " << m_time <<
"\n");
985 UG_LOG(
"l1 error: " << l1Error <<
"\n");
986 UG_LOG(
"l2 error: " << l2Error <<
"\n");
987 UG_LOG(
"maximum error: " << maxErr <<
"\n");
995template<
typename TGr
idFunction>
1003 typename domain_type::grid_type&
grid = *domain.grid();
1006 std::vector<DoFIndex> multInd;
1024 for(
int si = 0; si < domain.subset_handler()->
num_subsets(); ++si)
1026 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(si))
continue;
1027 if (m_neumann_sg.size()!=0)
if (m_neumann_sg.contains(si))
continue;
1028 if (m_inactive_sg.size()!=0)
if (m_inactive_sg.contains(si))
continue;
1034 for( ;iter !=iterEnd; ++iter)
1043 const size_t numVertices = elem->num_vertices();
1044 for(
size_t i = 0; i < numVertices; ++i)
1046 vVrt[i] = elem->vertex(i);
1047 coCoord[i] = aaPos[vVrt[i]];
1051 geo.
update(elem, &(coCoord[0]), domain.subset_handler().get());
1059 bool rightsign=
true;
1060 for (
size_t i=0;i < noc;i++)
1063 u.inner_dof_indices(vVrt[i], fct, multInd);
1066 uValue[i]=
DoFRef(u, multInd[0]);
1069 if (
DoFRef(phi, multInd[0])>0)
1077 if (
DoFRef(phi, multInd[0])>0)
1086 if (! rightsign)
continue;
1087 for (
size_t i=0;i < noc;i++)
1090 u.inner_dof_indices(vVrt[i], fct, multInd);
1093 uValue[i]=
DoFRef(u, multInd[0]);
1103 for (
size_t i=0;i < noc;i++)
1115 for(
size_t sh = 0 ; sh < noc; ++sh)
1133 aaGradient[vVrt[i]] += globalGrad;
1134 aaVolume[vVrt[i]] += vol;
1141 for (
int si=0;si < u.num_subsets();++si)
1145 iter != u.template end<Vertex>(si); ++iter)
1149 if (aaVolume[vrt]!=0){
1150 (aaGradient[vrt]) /= aaVolume[vrt];
1167template<
typename TGr
idFunction>
1171 typename domain_type::grid_type&
grid = *u.domain()->grid();
1180 AGradient aGradient;
1183 grid.attach_to_vertices(aScvVolume);
1184 grid.attach_to_vertices(aGradient);
1198 std::vector<DoFIndex> ind;
1202 if (!calculate_vertex_grad_vol(u,aaGradient, aaVolume)) {
UG_LOG(
"ERROR: gradient computation failed!");
return false;};
1204 limit_grad(u,aaGradient);
1206 for (
int si=0;si<u.num_subsets();++si)
1208 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(si))
continue;
1209 if (m_neumann_sg.size()!=0)
if (m_neumann_sg.contains(si))
continue;
1210 if (m_inactive_sg.size()!=0)
if (m_inactive_sg.contains(si))
continue;
1213 for (;iter != iterEnd; ++iter)
1216 u.inner_dof_indices(vrt, 0, ind);
1220 DoFRef(vx, ind[0]) = aaGradient[vrt][0]/vnorm;
1221 DoFRef(vy, ind[0]) = aaGradient[vrt][1]/vnorm;
1232template<
typename TGr
idFunction>
1236 typename domain_type::grid_type&
grid = *u.domain()->grid();
1245 AGradient aGradient;
1248 grid.attach_to_vertices(aScvVolume);
1249 grid.attach_to_vertices(aGradient);
1262 std::vector<DoFIndex> ind;
1267 if (! calculate_vertex_grad_vol_sign(u,aaGradient, aaVolume,phi,-1)) {
UG_LOG(
"ERROR: gradient computation failed!");
return false;};
1272 compute_normal(vx,vy,phi);
1273 for (
int si=0;si<u.num_subsets();++si)
1278 for (;iter != iterEnd; ++iter)
1281 u.inner_dof_indices(vrt, 0, ind);
1283 DoFRef(dnormal, ind[0]) =
DoFRef(vx, ind[0]) * aaGradient[vrt][0] +
DoFRef(vy, ind[0]) * aaGradient[vrt][1];
1293template<
typename TGr
idFunction>
1297 typename domain_type::grid_type&
grid = *u.domain()->grid();
1306 AGradient aGradient;
1309 grid.attach_to_vertices(aScvVolume);
1310 grid.attach_to_vertices(aGradient);
1326 compute_dnormal(dnormal,vx,vy,phi,u);
1327 if (! calculate_vertex_grad_vol_sign(dnormal,aaGradient, aaVolume,phi,-1)) {
UG_LOG(
"ERROR: gradient computation failed!");
return false;};
1333 std::vector<DoFIndex> ind;
1335 for (
int si=0;si<u.num_subsets();++si)
1340 for (;iter != iterEnd; ++iter)
1343 u.inner_dof_indices(vrt, 0, ind);
1346 =
DoFRef(vx, ind[0]) * aaGradient[vrt][0]
1347 +
DoFRef(vy, ind[0]) * aaGradient[vrt][1];
1358template<
typename TGr
idFunction>
1361 TGridFunction& unew,
1362 TGridFunction& uold,
1367 for (
int si=0;si<unew.num_subsets();++si)
1370 iter != unew.template end<Vertex>(si); ++iter)
1375 std::vector<DoFIndex> ind;
1376 unew.inner_dof_indices(vrt, 0, ind);
1379 if (phiValue<0) nodeSign =-1;
1380 if (phiValue>0) nodeSign = 1;
1381 if (phiValue==0) nodeSign = 0;
1382 if (nodeSign==sign)
DoFRef(unew, ind[0]) =
DoFRef(uold, ind[0]);
1390template<
typename TGr
idFunction>
1393 TGridFunction& unew,
1399 for (
int si=0;si<unew.num_subsets();++si)
1402 iter != unew.template end<Vertex>(si); ++iter)
1407 std::vector<MultiIndex<2> > ind;
1408 unew.inner_dof_indices(vrt, 0, ind);
1411 if (phiValue<0) nodeSign =-1;
1412 if (phiValue>0) nodeSign = 1;
1413 if (phiValue==0) nodeSign = 0;
1414 if (nodeSign==sign)
DoFRef(unew, ind[0]) = value;
1422template<
typename TGr
idFunction>
1429 std::vector<DoFIndex> ind;
1432 m_inactive_sg.set_subset_handler(domain.subset_handler());
1433 for (
int si=0;si<domain.subset_handler()->
num_subsets();++si)
1435 UG_LOG(
"******************* si " << si <<
" **********************\n");
1436 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(si))
continue;
1437 if (m_neumann_sg.size()!=0)
if (m_neumann_sg.contains(si))
continue;
1441 for( ;iter !=iterEnd; ++iter)
1450 const size_t numVertices = elem->num_vertices();
1451 for(
size_t i = 0; i < numVertices; ++i)
1453 vVrt[i] = elem->vertex(i);
1457 std::vector<MathVector<dim> > coCoord;
1460 std::vector<MathVector<dim> > grad;
1462 int noc=elem->num_vertices();
1463 std::vector<number> phiCo(noc);
1464 for(
int i = 0; i < noc; ++i)
1466 phi.inner_dof_indices(vVrt[i], 0, ind);
1467 phiCo[i]=
DoFRef(phi, ind[0]);
1469 int firstNonzero=-1;
1470 for (
int j=0;j<noc;j++)
1478 if (firstNonzero==-1)
1479 domain.subset_handler()->assign_subset(elem,m_inside_elements_si);
1481 for (
int i=0;i<noc;i++)
1485 int oldindex = domain.subset_handler()->get_subset_index(vVrt[i]);
1486 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(oldindex))
continue;
1487 if (m_neumann_sg.size()!=0)
if (m_neumann_sg.contains(oldindex))
continue;
1488 domain.subset_handler()->assign_subset(vVrt[i],m_onls_nodes_si);
1492 for (
int i=firstNonzero+1;i<noc;i++)
1494 if (phiCo[firstNonzero]*phiCo[i]<0)
1502 if (phiCo[firstNonzero]<0)
1505 domain.subset_handler()->assign_subset(elem,m_inside_elements_si);
1506 UG_LOG(
"element is inside \n");
1510 if (phiCo[firstNonzero]>0)
1513 domain.subset_handler()->assign_subset(elem,m_outside_elements_si);
1521 domain.subset_handler()->assign_subset(elem,m_onls_elements_si);
1524 for (
int i=0;i<noc;i++)
1526 int oldindex = domain.subset_handler()->get_subset_index(vVrt[i]);
1527 if (m_dirichlet_sg.size()!=0)
if (m_dirichlet_sg.contains(oldindex))
continue;
1528 if (m_neumann_sg.size()!=0)
if (m_neumann_sg.contains(oldindex))
continue;
1531 domain.subset_handler()->assign_subset(vVrt[i],m_inside_nodes_si);
1532 UG_LOG(
"node is inside \n");
1536 domain.subset_handler()->assign_subset(vVrt[i],m_outside_nodes_si);
1540 domain.subset_handler()->assign_subset(vVrt[i],m_onls_nodes_si);
1571template<
typename TGr
idFunction>
1574 create_ls_subsets(phi);
1575 if (! update_ls_subsets(phi))
return false;
1579template<
typename TGr
idFunction>
1584 UG_LOG(
"nr of subsets: " << domain.subset_handler()->num_subsets() <<
"\n");
1585 m_inside_elements_si = domain.subset_handler()->num_subsets();
1586 m_outside_elements_si = m_inside_elements_si + 1;
1587 m_onls_elements_si = m_inside_elements_si + 2;
1588 m_inside_nodes_si = m_inside_elements_si + 3;
1589 m_outside_nodes_si = m_inside_elements_si + 4;
1590 m_onls_nodes_si = m_inside_elements_si + 5;
1591 domain.subset_handler()->subset_required(phi.num_subsets()+5);
1592 UG_LOG(
"nr of subsets:" << domain.subset_handler()->num_subsets() <<
"\n");
1596template<
typename TGr
idFunction>
1612 for (
int si=0;si<uNew.num_subsets();++si)
1616 ElemIterator iterEnd = uNew.template end<ElemType>(si);
1618 for( ;iter !=iterEnd; ++iter)
1624 const size_t numVertices = elem->num_vertices();
1625 for(
size_t i = 0; i < numVertices; ++i)
1626 coCoord[i] = aaPos[elem->vertex(i)];
1629 geo.
update(elem, &(coCoord[0]), domain.subset_handler().get());
number shape(size_t sh) const
const MathVector< worldDim > & normal() const
const MathVector< worldDim > * global_grad_vector() const
const MathVector< worldDim > & normal() const
const MathVector< worldDim > & global_ip() const
number shape(size_t sh) const
const MathVector< worldDim > & global_grad(size_t sh) const
const MathVector< worldDim > * scv_global_ips() const
const SCVF & scvf(size_t i) const
const MathVector< dim > * scv_local_ips() const
void update(GridObject *elem, const MathVector< worldDim > *vCornerCoords, const ISubsetHandler *ish=NULL)
const std::vector< BF > & bf(int si) const
void add_boundary_subset(int subsetIndex)
const SCV & scv(size_t i) const
virtual Vertex * vertex(size_t index) const
void create_ls_subsets(TGridFunction &phi)
Definition level_set_impl.h:1580
bool calculate_vertex_vol(TGridFunction &u, aaVol &aaVolVolume)
fills the scvVolume attachment for all element types
Definition level_set_impl.h:860
bool compute_ddnormal(TGridFunction &ddnormal, TGridFunction &dnormal, TGridFunction &vx, TGridFunction &vy, TGridFunction &phi, TGridFunction &u)
Definition level_set_impl.h:1294
bool update_ls_subsets(TGridFunction &phi)
Definition level_set_impl.h:1423
bool compute_error(TGridFunction &numsol)
computes error w.r.t. the analytical solution (taken from the dirichlet bc)
Definition level_set_impl.h:917
TGridFunction::template traits< Vertex >::const_iterator VertexConstIterator
vertex base iterator
Definition level_set.h:89
TGridFunction::template dim_traits< dim >::grid_base_object ElemType
type of base grid object
Definition level_set.h:83
bool assemble_element(TElem &elem, DimFV1Geometry< dim > &geo, grid_type &grid, TGridFunction &uNew, const TGridFunction &uOld, aaGrad &aaGradient, aaVol &aaVolume)
Definition level_set_impl.h:276
domain_type::grid_type grid_type
grid type
Definition level_set.h:71
bool compute_normal(TGridFunction &vx, TGridFunction &vy, TGridFunction &u)
Definition level_set_impl.h:1168
bool limit_grad(TGridFunction &uOld, aaGrad &aaGradient)
Definition level_set_impl.h:53
bool runtimetest(TGridFunction &u)
Definition level_set_impl.h:1597
domain_type::position_accessor_type position_accessor_type
type of the position accessor
Definition level_set.h:74
TGridFunction::template dim_traits< dim >::const_iterator ElemIterator
grid element iterator
Definition level_set.h:92
bool assign_dirichlet(TGridFunction &)
Definition level_set_impl.h:640
bool compute_dnormal(TGridFunction &dnormal, TGridFunction &vx, TGridFunction &vy, TGridFunction &phi, TGridFunction &u)
Definition level_set_impl.h:1233
bool calculate_vertex_grad_vol_sign(TGridFunction &, aaGrad &, aaVol &, TGridFunction &, int)
Definition level_set_impl.h:997
TGridFunction::domain_type domain_type
domain type
Definition level_set.h:59
bool overwrite(TGridFunction &, TGridFunction &, TGridFunction &, int)
Definition level_set_impl.h:1360
TGridFunction::template traits< Edge >::const_iterator EdgeConstIterator
edge iterator
Definition level_set.h:86
bool init_ls_subsets(TGridFunction &phi)
subset handling methods:
Definition level_set_impl.h:1572
bool calculate_vertex_grad_vol(TGridFunction &u, aaGrad &aaGradient, aaVol &aaVolume)
Definition level_set_impl.h:485
bool advect_lsf(TGridFunction &uNew, TGridFunction &u)
computes the time steps of the discretization of the level-set equation
Definition level_set_impl.h:696
void resize(const LocalIndices &ind)
void VecAssign(GPUVector< T > &dest, const GPUVector< T > &v1)
size_t num_subsets() const
void SetAttachmentValues(TAttachmentAccessor &aaVal, TIter elemsBegin, TIter elemsEnd, const TVal &val)
vector_t::value_type VecLength(const vector_t &v)
void VecScaleAppend(vector_t &vOut, typename vector_t::value_type s1, const vector_t &v1)
void VecAppend(vector_t &vOut, const vector_t &v1)
void VecSubtract(vector_t &vOut, const vector_t &v, typename vector_t::value_type s)
const number & DoFRef(const TMatrix &mat, const DoFIndex &iInd, const DoFIndex &jInd)
void GetLocalVector(LocalVector &lvec, const TVector &vec)
void VecScaleAdd(double &dest, double alpha1, const double &v1, double alpha2, const double &v2)