]> https://gitweb.dealii.org/ - dealii-svn.git/commitdiff
some modifications to use both cg and dg elements in mg
authorjanssen <janssen@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 28 Sep 2010 16:35:47 +0000 (16:35 +0000)
committerjanssen <janssen@0785d39b-7218-0410-832d-ea1e28bc413d>
Tue, 28 Sep 2010 16:35:47 +0000 (16:35 +0000)
git-svn-id: https://svn.dealii.org/trunk@22183 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/deal.II/include/multigrid/mg_constrained_dofs.h
deal.II/deal.II/include/numerics/mesh_worker_assembler.h
deal.II/deal.II/source/multigrid/mg_tools.cc

index b9d82d14b80d741923a3773906bb4e2d99adf6ff..a64a1261e16a9e946e62ecf5e88efa7a9463be37 100644 (file)
@@ -125,7 +125,12 @@ class MGConstrainedDoFs : public Subscriptor
                                      */
 
     bool set_boundary_values () const;
-    bool continuity_across_edges () const;
+
+                                    /**
+                                     * Return if the finite element requires 
+                                      * continuity across refinement edges.
+                                      */
+    bool continuity_across_refinement_edges () const;
   private:
 
                                     /**
@@ -281,7 +286,7 @@ MGConstrainedDoFs::set_boundary_values () const
 
 inline
 bool 
-MGConstrainedDoFs::continuity_across_edges () const
+MGConstrainedDoFs::continuity_across_refinement_edges () const
 {
   bool is_continuous = false;
   for(unsigned int l=0; l<refinement_edge_indices.size(); ++l)
index 82dc1a1752fe0c37bc74ffcfad2d3009087c5ade..c2c62ee40752d0bc3e7cda348089f42dc86f6c2b 100644 (file)
@@ -1523,10 +1523,23 @@ namespace MeshWorker
       AssertDimension(M.m(), i1.size());
       AssertDimension(M.n(), i2.size());
       
+      if(mg_constrained_dofs == 0)
+      {
         for (unsigned int j=0; j<i1.size(); ++j)
           for (unsigned int k=0; k<i2.size(); ++k)
             if (std::fabs(M(j,k)) >= threshold)
               G.add(i1[j], i2[k], M(j,k));
+      }
+      else
+      {
+        for (unsigned int j=0; j<i1.size(); ++j)
+          for (unsigned int k=0; k<i2.size(); ++k)
+            if (std::fabs(M(j,k)) >= threshold)
+            {
+                if(!mg_constrained_dofs->continuity_across_refinement_edges())
+                  G.add(i1[j], i2[k], M(j,k));
+            }
+      }
     }
 
 
@@ -1598,14 +1611,9 @@ namespace MeshWorker
         for (unsigned int j=0; j<i1.size(); ++j)
           for (unsigned int k=0; k<i2.size(); ++k)
             if (std::fabs(M(k,j)) >= threshold)
-            {
-              if(!mg_constrained_dofs->at_refinement_edge(level, i1[j]) ||
-                  mg_constrained_dofs->at_refinement_edge(level, i2[k]))
-              {
-                if(!mg_constrained_dofs->continuity_across_edges())
-                  G.add(i1[j], i2[k], M(k,j));
-              }
-            }
+              if(mg_constrained_dofs->at_refinement_edge(level, i1[j]) &&
+                  !mg_constrained_dofs->at_refinement_edge(level, i2[k]))
+                G.add(i1[j], i2[k], M(k,j));
       }
     }
 
@@ -1633,14 +1641,9 @@ namespace MeshWorker
         for (unsigned int j=0; j<i1.size(); ++j)
           for (unsigned int k=0; k<i2.size(); ++k)
             if (std::fabs(M(j,k)) >= threshold)
-            {
-              if(!mg_constrained_dofs->at_refinement_edge(level, i1[j]) ||
-                  mg_constrained_dofs->at_refinement_edge(level, i2[k]))
-              {
-                if(!mg_constrained_dofs->continuity_across_edges())
+              if(mg_constrained_dofs->at_refinement_edge(level, i1[j]) &&
+                  !mg_constrained_dofs->at_refinement_edge(level, i2[k]))
                   G.add(i1[j], i2[k], M(j,k));
-              }
-            }
       }
     }
 
@@ -1740,7 +1743,6 @@ namespace MeshWorker
       assemble((*matrix)[level], info.matrix(0,false).matrix, info.indices, info.indices, level);
 
       if(mg_constrained_dofs != 0)
-      //if(interface_in != 0 && interface_out != 0 && level>0)
       {
         assemble_in((*interface_in)[level], info.matrix(0,false).matrix, info.indices, info.indices, level);
         assemble_out((*interface_out)[level],info.matrix(0,false).matrix, info.indices, info.indices, level);
index afccf41f06a0fd2b43f031b2e32d11ca7406b5d5..d2b29a6f23651e175a7d573b15d941ffc68a6df2 100644 (file)
@@ -1479,6 +1479,9 @@ extract_inner_interface_dofs (const MGDoFHandler<dim,spacedim> &mg_dof_handler,
   const unsigned int   dofs_per_cell   = fe.dofs_per_cell;
   const unsigned int   dofs_per_face   = fe.dofs_per_face;
 
+
+  deallog << "dofs_per_face" << dofs_per_face << std::endl;
+
   std::vector<unsigned int> local_dof_indices (dofs_per_cell);
   std::vector<unsigned int> face_dof_indices (dofs_per_face);
 
@@ -1495,8 +1498,6 @@ extract_inner_interface_dofs (const MGDoFHandler<dim,spacedim> &mg_dof_handler,
       std::fill (cell_dofs.begin(), cell_dofs.end(), false);
       std::fill (boundary_cell_dofs.begin(), boundary_cell_dofs.end(), false);
 
-      if(fe.conforms(FiniteElementData<dim>::H1))
-      {
       for (unsigned int face_nr=0; face_nr<GeometryInfo<dim>::faces_per_cell; ++face_nr)
        {
          const typename DoFHandler<dim,spacedim>::face_iterator face = cell->face(face_nr);
@@ -1538,7 +1539,6 @@ extract_inner_interface_dofs (const MGDoFHandler<dim,spacedim> &mg_dof_handler,
            boundary_interface_dofs[level][local_dof_indices[i]] = true;
        }
     }
-    }
 }
 
 #endif

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.