Hello,

I am facing an issue when I use hanging nodes with periodic boundary 
conditions. I have reproduced the error in the attached minimal example 
where I do the following steps:

1) Create a hypercube
2) Set appropriate boundary_ids on the faces of the hypercube for periodic 
boundary conditions, call collect_periodic_faces and 
triangulation.add_periodicity.
3) Perform two levels of mesh refinement:- a) first one step uniform 
refinement hypercube to get 8 cells ,and b) then pick one of the 8 cells 
and refine only that cell which creates hanging nodes on the faces. Finally 
I get 15 cells (see attached image).
4) Create constraintMatrix which includes both hanging node and periodic 
constraints.

*The issue:*
 If I flip the boundary ids of the face pairs while marking the faces of 
the hypercube in step-2 (change Ltemp=L in line 62 to Ltemp=-L), the size 
of the constraint matrix created in step-4 changes. Further investigation 
of the constraint matrix entries in the two cases revealed
that the number of identity_constraints are different- in one case it gives 
19 identity_constraints and 17 in the other case. Manually counting the 
numbering of identity_constraints using the attached image gives 19. 

Is it correct to expect the size of the constraint matrix to remain 
unchanged in the above case?

Additional note: The minimal example doesn't throw any error in the debug 
mode. I am using deal ii version 8.5.1 and serial triangulation.

Thanks,
Sambit

-- 
The deal.II project is located at http://www.dealii.org/
For mailing list/forum options, see 
https://groups.google.com/d/forum/dealii?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"deal.II User Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to dealii+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
//Include all deal.II header file
#include <deal.II/base/quadrature.h>
#include <deal.II/base/function.h>
#include <deal.II/base/logstream.h>
#include <deal.II/base/timer.h>
#include <deal.II/base/table.h>
#include <deal.II/lac/vector.h>
#include <deal.II/lac/full_matrix.h>
#include <deal.II/lac/constraint_matrix.h>
#include <deal.II/fe/fe_system.h>
#include <deal.II/fe/fe_q.h>
#include <deal.II/fe/fe_values.h>
#include <deal.II/fe/mapping_q1.h>
#include <deal.II/grid/tria.h>
#include <deal.II/grid/tria_accessor.h>
#include <deal.II/grid/tria_iterator.h>
#include <deal.II/grid/grid_generator.h>
#include <deal.II/dofs/dof_tools.h>
#include <deal.II/dofs/dof_handler.h>
#include <deal.II/numerics/data_out.h>
#include <deal.II/numerics/vector_tools.h>
#include <deal.II/base/tensor_function.h>
#include <deal.II/base/point.h>
#include <deal.II/base/conditional_ostream.h>
#include <deal.II/base/utilities.h>
#include <deal.II/lac/lapack_full_matrix.h>
#include <deal.II/numerics/matrix_tools.h>
#include <deal.II/numerics/error_estimator.h>
#include <deal.II/base/parameter_handler.h>
#include <deal.II/grid/grid_refinement.h>
#include <deal.II/grid/tria_boundary_lib.h>
#include <deal.II/grid/grid_tools.h>
#include <deal.II/grid/grid_in.h>
#include <deal.II/grid/grid_out.h>
#include <deal.II/dofs/dof_renumbering.h>
#include <deal.II/dofs/dof_accessor.h>
#include <deal.II/lac/solver_cg.h>
#include <deal.II/lac/solver_gmres.h>
#include <deal.II/lac/solver_bicgstab.h>
#include <deal.II/lac/precondition.h>
#include <deal.II/distributed/tria.h>
#include <deal.II/lac/parallel_vector.h>
#include <deal.II/matrix_free/matrix_free.h>
#include <deal.II/matrix_free/fe_evaluation.h>
#include <deal.II/lac/slepc_solver.h>
#include <deal.II/base/config.h>
#include <deal.II/base/smartpointer.h>
//Include generic C++ headers
#include <fstream>
#include <iostream>


using namespace dealii;
int main (int argc, char *argv[])
{
  Utilities::MPI::MPI_InitFinalize mpi_initialization(argc, argv);

  const double L=20;
  Triangulation<3,3> triangulation;  
  GridGenerator::hyper_cube (triangulation, -L, L);

  const double Ltemp=L;//FIXME: Size of constraint matrix changes between Ltemp=L, and Ltemp=-L;
  //mark faces
  typename Triangulation<3,3>::active_cell_iterator cell = triangulation.begin_active(), endc = triangulation.end();
  for(; cell!=endc; ++cell) 
  {
      for(unsigned int f=0; f < GeometryInfo<3>::faces_per_cell; ++f)
	{
	  const Point<3> face_center = cell->face(f)->center();
	  if(cell->face(f)->at_boundary())
	    {
	      if (std::abs(face_center[0]-Ltemp)<1.0e-5)
		cell->face(f)->set_boundary_id(1);
	      else if (std::abs(face_center[0]+Ltemp)<1.0e-5)
		cell->face(f)->set_boundary_id(2);
	      else if (std::abs(face_center[1]-Ltemp)<1.0e-5)
		cell->face(f)->set_boundary_id(3);
	      else if (std::abs(face_center[1]+Ltemp)<1.0e-5)
		cell->face(f)->set_boundary_id(4);
	      else if (std::abs(face_center[2]-Ltemp)<1.0e-5)
		cell->face(f)->set_boundary_id(5);
	      else if (std::abs(face_center[2]+Ltemp)<1.0e-5)
		cell->face(f)->set_boundary_id(6);
	    }
	}
  }
 
  std::vector<GridTools::PeriodicFacePair<typename Triangulation<3,3>::cell_iterator> > periodicity_vector;
  for (int i = 0; i < 3; ++i)
  {
      GridTools::collect_periodic_faces(triangulation, /*b_id1*/ 2*i+1, /*b_id2*/ 2*i+2,/*direction*/ i, periodicity_vector);
  }
  triangulation.add_periodicity(periodicity_vector);

  //two level mesh refinement 
  
  triangulation.refine_global(1);

  typename Triangulation<3,3>::active_cell_iterator cellBegin = triangulation.begin_active();
  cellBegin->set_refine_flag();
  triangulation.execute_coarsening_and_refinement(); 
  
  std::cout << "number of elements: "
	<< triangulation.n_global_active_cells()
	<< std::endl;   
  /////
  
  FESystem<3> FE(FE_Q<3>(QGaussLobatto<1>(2)), 1); //linear shape function
  DoFHandler<3> dofHandler (triangulation);
  dofHandler.distribute_dofs(FE);

  ///creating constraint matrix
  ConstraintMatrix constraints;
  constraints.clear();
  std::cout<< "Adding hanging node constraints... "<< std::endl;
  DoFTools::make_hanging_node_constraints(dofHandler, constraints);
  std::cout<< "Adding periodicity constraints... "<< std::endl;
  std::vector<GridTools::PeriodicFacePair<typename DoFHandler<3>::cell_iterator> > periodicity_vectorDof;
  for (int i = 0; i < 3; ++i)
    {
      GridTools::collect_periodic_faces(dofHandler, /*b_id1*/ 2*i+1, /*b_id2*/ 2*i+2,/*direction*/ i, periodicity_vectorDof);
    }
  DoFTools::make_periodicity_constraints<DoFHandler<3> >(periodicity_vectorDof, constraints);
  constraints.close();
  std::cout<< "size of constraint matrix: "<< constraints.n_constraints()<<std::endl;
  std::cout<< "printing constraint matrix ...."<<std::endl;
  constraints.print(std::cout);

  /////write mesh
  std::cout<<"writing mesh .." <<std::endl;
  DataOut<3> data_out;
  data_out.attach_dof_handler(dofHandler);
  data_out.build_patches ();
  std::ofstream output("mesh.vtu");
  data_out.write_vtu (output);  
}  

Reply via email to