644 std::vector<DoFIndex> multInd;
649 for(
size_t i = 0; i < this->m_turbZeroSg.size(); ++i){
653 SetAttachmentValues(aaDefTensor , m_uInfo->template begin<Vertex>(), m_uInfo->template end<Vertex>(), 0);
654 SetAttachmentValues(aaVol , m_uInfo->template begin<Vertex>(), m_uInfo->template end<Vertex>(), 0);
664 for(
int si = 0; si < domain.subset_handler()->
num_subsets(); ++si){
666 ElemIterator iter = m_uInfo->template begin<elem_type>(si);
667 ElemIterator iterEnd = m_uInfo->template end<elem_type>(si);
672 for( ;iter !=iterEnd; ++iter)
677 const size_t numVertices = elem->num_vertices();
678 for(
size_t i = 0; i < numVertices; ++i){
679 vVrt[i] = elem->vertex(i);
680 coCoord[i] = posAcc[vVrt[i]];
685 geo.
update(elem, &(coCoord[0]), domain.subset_handler().get());
687 static const size_t MaxNumVerticesOfElem = 10;
690 std::vector<MVD> uValue(MaxNumVerticesOfElem);
693 UG_ASSERT(
dynamic_cast<elem_type*
>(elem) != NULL,
"Only elements of type elem_type are currently supported");
695 size_t noc = elem->num_vertices();
699 for (
size_t co=0;co < noc;co++)
702 uValue[co]=aaU[elem->vertex(co)];
704 aaVol[elem->vertex(co)] += scv.
volume();
707 for (
size_t ip=0;ip<nip;ip++){
711 for (
size_t co=0;co < noc;co++){
712 for (
int d=0;d<dim;d++){
713 ipVelocity[d] += scvf.
shape(co)*uValue[co][d];
718 for (
int d=0;d<dim;d++){
719 for (
int j=0;j<dim;j++){
720 ipDefTensorFlux[d][j]= 0.5 * (ipVelocity[d] * scvf.
normal()[j] + ipVelocity[j] * scvf.
normal()[d]);
723 aaDefTensor[elem->vertex(scvf.
from())]+=ipDefTensorFlux;
724 aaDefTensor[elem->vertex(scvf.
to())]-=ipDefTensorFlux;
726 for(
size_t sgi = 0; sgi < this->m_turbZeroSg.size(); ++sgi){
727 const size_t sgsi=this->m_turbZeroSg[sgi];
728 if (geo.
num_bf(sgsi) == 0)
continue;
729 for(
size_t bfi = 0; bfi < geo.
num_bf(sgsi); ++bfi){
731 const size_t nodeID = bf.
node_id();
732 for (
int i=0;i<dim;i++)
733 for (
int j=0;j<dim;j++){
734 aaDefTensor[elem->vertex(nodeID)][i][j] += 0.5 * (uValue[nodeID][i] * bf.
normal()[j] + uValue[nodeID][j] * bf.
normal()[i]);
741 for(
int si = 0; si < domain.subset_handler()->num_subsets(); ++si){
744 for( ;vertexIter !=vertexIterEnd; vertexIter++)
746 Vertex* vertex = *vertexIter;
747 if (pbm && pbm->
is_slave(vertex))
continue;
748 aaDefTensor[vertex]/=(
number)aaVol[vertex];
822 SetAttachmentValues(m_acTurbulentViscosity, m_grid->template begin<Vertex>(), m_grid->template end<Vertex>(), 0);
829 this->assembleDeformationTensor(m_acDeformation,m_acVolume,m_u);
831 for(
int si = 0; si < domain.subset_handler()->
num_subsets(); ++si)
833 if ((this->m_turbZeroSg.size()!=0) && (this->m_turbZeroSg.contains(si)==
true))
continue;
836 for( ;vertexIter !=vertexIterEnd; vertexIter++)
839 Vertex* vertex = *vertexIter;
840 if (m_pbm && m_pbm->is_slave(vertex)){
843 number delta = m_acVolume[vertex];
846 number tensorNorm = this->FNorm(m_acDeformation[vertex]);
847 m_acTurbulentViscosity[vertex] = m_c * delta*delta * tensorNorm;
851 this->transferToLowerLevels(m_acTurbulentViscosity,*m_spApproxSpace);
865 SetAttachmentValues(m_acTurbulentViscosity, m_grid->template begin<Vertex>(), m_grid->template end<Vertex>(), 0);
867 SetAttachmentValues(m_acTurbulentC,m_grid->template begin<Vertex>(), m_grid->template end<Vertex>(), 0);
872 SetAttachmentValues(m_acMij,m_grid->template begin<Vertex>(), m_grid->template end<Vertex>(), 0);
876 this->elementFilter(m_acUHat,m_acVolumeHat,m_u);
879 this->addUiUjTerm(m_acMij,1.0,m_u);
881 this->elementFilter(m_acLij,m_acVolumeHat,m_acMij);
883 this->addUiUjTerm(m_acLij,-1.0,m_acUHat);
888 this->assembleDeformationTensor(m_acDeformationHat,m_acVolume,m_acUHat);
890 this->scaleTensorByNorm(m_acDeformationHat);
893 this->assembleDeformationTensor(m_acDeformation,m_acVolumeHat,m_u);
895 this->scaleTensorByNorm(m_acDeformation);
898 this->elementFilter(m_acMij,m_acVolumeHat,m_acDeformation);
900 bool use_filter =
false;
903 std::vector<DoFIndex> multInd;
907 for(
int si = 0; si < domain.subset_handler()->
num_subsets(); ++si)
909 if (use_filter==
false)
910 if ((this->m_turbZeroSg.size()!=0) && (this->m_turbZeroSg.contains(si)==
true))
continue;
913 for( ;vertexIter !=vertexIterEnd; vertexIter++){
914 Vertex* vertex = *vertexIter;
915 if (m_pbm && m_pbm->is_slave(vertex))
continue;
917 number delta = m_acVolume[vertex];
919 number deltaHat = m_acVolumeHat[vertex];
921 m_u->dof_indices(vertex, 0, multInd);
922 m_u->dof_indices(vertex, 1, multInd);
923 m_acDeformationHat[vertex] *= -2*deltaHat*deltaHat;
924 m_acMij[vertex] *= 2*delta*delta;
925 m_acMij[vertex] += m_acDeformationHat[vertex];
927 for (
int d1=0;d1<dim;d1++){
928 for (
int d2=0;d2<dim;d2++){
934 for (
int d1=0;d1<dim;d1++){
935 for (
int d2=0;d2<dim;d2++){
943 for (
int d1=0;d1<dim;d1++)
944 for (
int d2=0;d2<dim;d2++)
945 c += m_acLij[vertex][d1][d2]*m_acMij[vertex][d1][d2];
948 for (
int d1=0;d1<dim;d1++)
949 for (
int d2=0;d2<dim;d2++)
950 denom += m_acMij[vertex][d1][d2]*m_acMij[vertex][d1][d2];
955 if (m_spaceFilter==
false){
956 if (m_timeFilter==
false){
957 m_acTurbulentViscosity[vertex] = c * delta*delta * this->FNorm(m_acDeformation[vertex]);
959 m_acTurbulentC[vertex]= (m_timeFilterEps * c + (1-m_timeFilterEps)*m_acTurbulentC[vertex]);
960 m_acTurbulentViscosity[vertex] = m_acTurbulentC[vertex] * delta*delta * this->FNorm(m_acDeformation[vertex]);
962 if (m_acTurbulentViscosity[vertex]+m_viscosityNumber<m_small) m_acTurbulentViscosity[vertex] = m_viscosityNumber + m_small; }
965 m_acTurbulentViscosity[vertex] = c;
969 if (m_spaceFilter==
true){
971 if (m_timeFilter==
false)
972 this->elementFilter(m_acTurbulentC,m_acVolumeHat,m_acTurbulentViscosity);
975 this->elementFilter(m_acVolumeHat,m_acVolumeHat,m_acTurbulentViscosity);
977 for(
int si = 0; si < domain.subset_handler()->
num_subsets(); ++si)
980 if ((this->m_turbZeroSg.size()!=0) && (this->m_turbZeroSg.contains(si)==
true))
continue;
983 for( ;vertexIter !=vertexIterEnd; vertexIter++){
984 Vertex* vertex = *vertexIter;
985 if (m_pbm && m_pbm->is_slave(vertex))
continue;
986 number delta = m_acVolume[vertex];
988 if (m_timeFilter==
true)
990 m_acTurbulentC[vertex]= (m_timeFilterEps * m_acVolumeHat[vertex] + (1-m_timeFilterEps)*m_acTurbulentC[vertex]);
991 m_acTurbulentViscosity[vertex] = m_acTurbulentC[vertex] * delta*delta * this->FNorm(m_acDeformation[vertex]);
992 if (m_acTurbulentViscosity[vertex]+m_viscosityNumber<m_small) m_acTurbulentViscosity[vertex] = m_viscosityNumber+m_small;