Deal deal.II community
In my attempt to simulate the additive manufacturing process, I modified
the step-26 program to reproduce the results in which I ran into an error
which produces the output as :
$ make run
Consolidate compiler generated dependencies of target step-26
[ 66%] Built target step-26
[100%] Run step-26 with Debug configuration
***Time step 0 at t=0
===========================================
Number of active cells: 1024
Number of degrees of freedom: 99
--------------------------------------------------------
An error occurred in line <367> of file
</usr/local/include/deal.II/base/smartpointer.h> in function
T* dealii::SmartPointer<T, P>::operator->() const [with T = const
dealii::SparsityPattern; P = dealii::SparseMatrix<double>]
The violated condition was:
t != nullptr
Additional information:
(none)
Stacktrace:
-----------
#0 ./step-26: Step26::HeatEquation<2>::assemble_system()
#1 ./step-26: Step26::HeatEquation<2>::run()
#2 ./step-26: main
--------------------------------------------------------
make[3]: *** [CMakeFiles/run.dir/build.make:71: CMakeFiles/run] Aborted
(core dumped)
make[2]: *** [CMakeFiles/Makefile2:116: CMakeFiles/run.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:123: CMakeFiles/run.dir/rule] Error 2
make: *** [Makefile:137: run] Error 2
I tried to debug with gdb but coudnt make track the error. So any help in
this regard to debug the code will prove beneficialMoreover,I have
attached step-26.cc file which was modified.
Sincerely
Pushkar
--
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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/dealii/8afa57b5-ba7a-4f82-90c8-c37a01354513n%40googlegroups.com.
/* ---------------------------------------------------------------------
*
* Copyright (C) 2013 - 2017 by the deal.II authors
*
* This file is part of the deal.II library.
*
* The deal.II library is free software; you can use it, redistribute
* it, and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* The full text of the license can be found in the file LICENSE at
* the top level of the deal.II distribution.
*
* ---------------------------------------------------------------------
*
* Author: Wolfgang Bangerth, Texas A&M University, 2013
*/
#include <deal.II/base/utilities.h>
#include <deal.II/base/quadrature_lib.h>
#include <deal.II/base/function.h>
#include <deal.II/base/logstream.h>
//#include <deal.II/base/function_time.h>
#include <deal.II/lac/vector.h>
#include <deal.II/lac/full_matrix.h>
#include <deal.II/lac/dynamic_sparsity_pattern.h>
#include <deal.II/lac/sparse_matrix.h>
#include <deal.II/lac/solver_cg.h>
#include <deal.II/lac/precondition.h>
#include <deal.II/lac/constraint_matrix.h>
#include <deal.II/lac/sparse_direct.h>
#include <deal.II/grid/tria.h>
#include <deal.II/grid/grid_generator.h>
#include <deal.II/grid/grid_refinement.h>
#include <deal.II/grid/grid_out.h>
#include <deal.II/grid/tria_accessor.h>
#include <deal.II/grid/tria_iterator.h>
#include <deal.II/dofs/dof_handler.h>
#include <deal.II/dofs/dof_accessor.h>
#include <deal.II/dofs/dof_tools.h>
#include <deal.II/fe/fe_q.h>
#include <deal.II/fe/fe_values.h>
#include <deal.II/fe/fe_nothing.h>
#include <deal.II/numerics/data_out.h>
#include <deal.II/numerics/vector_tools.h>
#include <deal.II/numerics/error_estimator.h>
#include <deal.II/numerics/solution_transfer.h>
#include <deal.II/numerics/matrix_tools.h>
#include"Point_Comparison_Operator.hpp"
#include <fstream>
#include <iostream>
namespace Step26
{
using namespace dealii;
template <int dim>
class HeatEquation
{
public:
HeatEquation();
void run();
private:
void create_coarse_grid();
void part_height_measure();
bool cell_is_in_metal_domain(const typename hp::DoFHandler<dim>::cell_iterator &cell);
bool cell_is_in_void_domain(const typename hp::DoFHandler<dim>::cell_iterator &cell);
void set_active_fe_indice();
void setup_system();
void store_old_vectors();//Need to define a map to store old solution
void transfer_old_vectors();//Uses the map filled by store_old_vector()
void assemble_system();
void solve_time_step();
void output_results() const;
void refine_mesh (const unsigned int min_grid_level,
const unsigned int max_grid_level);
Triangulation<dim> triangulation;
hp::FECollection<dim>fe_collection;
hp::DoFHandler<dim> dof_handler;
hp::QCollection<dim> quadrature_collection;
hp::QCollection<dim-1> face_quadrature_collection;
ConstraintMatrix constraints;
SparsityPattern sparsity_pattern;
SparseMatrix<double> mass_matrix;
SparseMatrix<double> laplace_matrix;
SparseMatrix<double> system_matrix;
SparseMatrix<double> boundary_matrix;
Vector<double> solution;
Vector<double> old_solution;
Vector<double> system_rhs;
double time;
double time_step;
unsigned int timestep_number;
const double theta;
const double edge_length;
const double layerThickness;
const double number_layer;
const double heat_capacity;
const double heat_conductivity;
const double convection_coeff;
const double Tamb;
double part_height;
std::map<Point<dim>,double> map_old_solution;
};
template<int dim>
class InitialCondition : public Function<dim>
{
public:
InitialCondition():Function<dim>(){}
virtual double value (const Point<dim> &p,const unsigned int component = 0) const;
};
template<int dim>
double InitialCondition<dim>::value(const Point<dim> &p,const unsigned int component) const
{
Assert(component == 0,ExcInternalError());
return 1;//Initial Temperature value
}
template <int dim>
class RightHandSide : public Function<dim>
{
public:
RightHandSide ()
:
Function<dim>(),
period (0.2) //Time needed to complete one layer
{}
//void set_time(const double new_time);
virtual double value (const Point<dim> &p,
const unsigned int component = 0) const;
private:
const double period;
};
template <int dim>
double RightHandSide<dim>::value (const Point<dim> &p,
const unsigned int component) const
{
(void) component;
Assert (component == 0, ExcIndexRange(component, 0, 1));
const double time = this->get_time();//get the time value
const double point_within_layer = (time/period - std::floor(time/period));//Return the x coordinate of point on which the laser has to be centered
double limit = (1+floor(time*5))*0.1;//Returns the y coordinate of the part surface
double dist = point_within_layer;
const double tol_dist = 5e-2;
if((p[0]>dist-tol_dist) && (p[0] < dist+tol_dist) && (p[1]>limit-tol_dist) && (p[1]<limit+tol_dist))
return 1000;
else
return 0;
}
template <int dim>
class BoundaryValues : public Function<dim>
{
public:
virtual double value (const Point<dim> &p,
const unsigned int component = 0) const;
};
template <int dim>
double BoundaryValues<dim>::value (const Point<dim> &/*p*/,
const unsigned int component) const
{
(void) component;
Assert (component == 0, ExcIndexRange(component, 0, 1));
return 1;//Temperature to impose
}
template <int dim>
HeatEquation<dim>::HeatEquation ()
:
dof_handler(triangulation),
time (0.0),
time_step(1. / 500),
timestep_number (0),
theta(0.5),
edge_length(1.0),
layerThickness(0.05),
number_layer(20),
heat_capacity(1.0),
heat_conductivity(1.0),
convection_coeff(1.0),
Tamb(1),
part_height(0.0)
{
fe_collection.push_back(FE_Q<dim>(1));
fe_collection.push_back(FE_Nothing<dim>());
quadrature_collection.push_back(QGauss<dim>(2));
quadrature_collection.push_back(QGauss<dim>(2));
face_quadrature_collection.push_back(QGauss<dim-1>(2));
face_quadrature_collection.push_back(QGauss<dim-1>(2));
}
template<int dim>
void HeatEquation<dim>::create_coarse_grid(){
//Creation of two points
Point<dim> p1;
Point<dim> p2;
//Writing coordinates to p1 and p2
for(unsigned int n=0;n<dim;n++){
p1[n] = 0;
p2[n] = edge_length;
}
p2[dim-1] = layerThickness*number_layer;
//Generate a parallelopiped with a [p1 p2] diagonal
GridGenerator::hyper_rectangle(triangulation,p1,p2);
}
template <int dim>
void HeatEquation<dim>::setup_system()
{
//DOF distribution using proper finite element
dof_handler.distribute_dofs(fe_collection);
//Creation of the constraints to handle hanging nodes
constraints.clear();
DoFTools::make_hanging_node_constraints(dof_handler, constraints);
constraints.close();
//Creation of the sparsity pattern for the matrices
DynamicSparsityPattern dsp(dof_handler.n_dofs());
DoFTools::make_sparsity_pattern(dof_handler, dsp, constraints, true);
sparsity_pattern.copy_from(dsp);
mass_matrix.reinit(sparsity_pattern);
laplace_matrix.reinit(sparsity_pattern);
system_matrix.reinit(sparsity_pattern);
//Mass Matrix Computation
MatrixCreator::create_mass_matrix(dof_handler,quadrature_collection,mass_matrix,(const Function<dim> *)0,constraints);
//Stiffness Matrix Computation
MatrixCreator::create_laplace_matrix(dof_handler, quadrature_collection, laplace_matrix, (const Function<dim> *)0,constraints);
//Memory Allocation for the RHS vector
system_rhs.reinit(dof_handler.n_dofs());
//Memory Allocation for solution vector
solution.reinit(dof_handler.n_dofs());
old_solution.reinit(dof_handler.n_dofs());
}
template<int dim>
void HeatEquation<dim>::assemble_system()
{
Vector<double> tmp;
Vector<double> tmp2;
Vector<double> forcing_terms;
tmp.reinit(solution.size());
tmp2.reinit(solution.size());
forcing_terms.reinit(solution.size());
tmp2.add(heat_capacity,old_solution);
mass_matrix.vmult(system_rhs,tmp2); //rhs = c*M*T^(n-1)
laplace_matrix.vmult(tmp, old_solution);//tmp=K*T^(n-1)
system_rhs.add(-(1-theta)*time_step*heat_conductivity,tmp);//rhs = (cM - (1-theta)*tau*k)*K*T^(n-1)
//Computation of the forcing terms(=laser heat input)
RightHandSide<dim> rhs_function;
rhs_function.set_time(time);// t=tn
VectorTools::create_right_hand_side(dof_handler,quadrature_collection,rhs_function,tmp); // tmp = F^n
forcing_terms = tmp;// Forcing terms = F^n
forcing_terms *= time_step * theta;//forcing_terms = tau*theta*F^n
rhs_function.set_time(time-time_step);//t = t(n-1)
VectorTools::create_right_hand_side(dof_handler,quadrature_collection, rhs_function, tmp);//tmp = F^(n-1)
forcing_terms.add(time_step*(1-theta),tmp);// forcing_terms = tau*theta*F^n + tau*(1-theta)*F^(n-1)
system_rhs += forcing_terms; //rhs = tau*theta*F^n+tau*(1-theta)*F^(n-1)+ (c*M-(1-theta)*tau*k*K)*T^(n-1)
system_matrix.add(heat_capacity,mass_matrix); //A = cM
system_matrix.add(theta*time_step*heat_conductivity,laplace_matrix);// A = c*M+ theta*K*tau*K
//Applying Robin BCs
const unsigned int n_face_q_points = face_quadrature_collection[0].size();// quadrature points on faces
const unsigned int n_q_points = quadrature_collection[0].size();//quadrature points on elements
//Finite Element evaluated in quadrature points of a cell
hp::FEValues<dim> hp_fe_values(fe_collection,quadrature_collection,update_values | update_quadrature_points | update_JxW_values);
// Finite element evaluated in quadrature points of the faces of a cell
hp::FEFaceValues<dim> hp_fe_face_values(fe_collection,face_quadrature_collection,update_values | update_quadrature_points | update_JxW_values);
//Iteration over all the cells
typename hp::DoFHandler<dim>::active_cell_iterator cell=dof_handler.begin_active(),endc = dof_handler.end();
for(;cell!=endc;++cell)
{
const unsigned int dofs_per_cell = cell->get_fe().dofs_per_cell;
FullMatrix<double> cell_matrix;
Vector<double> cell_rhs;
std::vector<types::global_dof_index> local_dof_indices(dofs_per_cell);
if(dofs_per_cell!=0) //Skip the cells which are in the void domain
{
cell_matrix.reinit(dofs_per_cell,dofs_per_cell);
cell_matrix = 0;
cell_rhs.reinit(dofs_per_cell);
cell_rhs = 0;
for(unsigned int face_number=0;face_number<GeometryInfo<dim>::faces_per_cell;++face_number)
{
//Tests to select the cell faces which belong to the Robin Boundary
if(cell->face(face_number)->at_boundary() && (cell->face(face_number)->boundary_id()==0))
{
//Term to be added in the RHS
hp_fe_face_values.reinit(cell,face_number);
for(unsigned int q_point = 0;q_point<n_face_q_points;++q_point)
{
//Computation and storage of the shape functions on boundary face integration points
const FEFaceValues<dim> &fe_face_values = hp_fe_face_values.get_present_fe_values();
for(unsigned int i=0;i<dofs_per_cell;++i)
cell_rhs(i) += (fe_face_values.shape_value(i,q_point)*fe_face_values.JxW(q_point));
//Computation and addition of the terms in the RHS
cell->get_dof_indices(local_dof_indices);
for(unsigned int i=0;i<dofs_per_cell;++i)
system_rhs(local_dof_indices[i]) -= time_step*convection_coeff*cell_rhs(i)*((1-theta)*old_solution(i)-Tamb);
}
//Term to be added in the system matrix
hp_fe_values.reinit(cell);
const FEValues<dim> &fe_values = hp_fe_values.get_present_fe_values();
//Computation and storage of the value of the shape functions on boundary cell integration points
for(unsigned int q_point = 0;q_point < n_q_points; ++q_point)
for(unsigned int i=0;i<dofs_per_cell;++i)
for(unsigned int j=0;j<dofs_per_cell;++j)
cell_matrix(i,j) += (fe_values.shape_value(i,q_point)*fe_values.shape_value(j,q_point)*fe_values.JxW(q_point));
cell->get_dof_indices(local_dof_indices);
for(unsigned int i=0;i<dofs_per_cell;++i)
for(unsigned int j=0;j<dofs_per_cell;++j)
boundary_matrix.add(local_dof_indices[i],local_dof_indices[j],cell_matrix(i,j));
}
}
}
//Computation and addition of the terms in the system matrix
system_matrix.add(theta*time_step*convection_coeff,boundary_matrix);
}
constraints.condense(system_matrix,system_rhs);
}
template <int dim>
void HeatEquation<dim>::solve_time_step()
{
SparseDirectUMFPACK A_direct;
//Initialization and LU factorization of A_direct
A_direct.initialize(system_matrix);
//Direct Resolution
A_direct.vmult(solution,system_rhs);
//Application of hanging nodes constraints
constraints.clear();
DoFTools::make_hanging_node_constraints(dof_handler, constraints);
constraints.close();
constraints.distribute(solution);
std::cout << "***Time step " << timestep_number << " at t=" << time
<< std::endl;
std::cout << std::endl
<< "==========================================="
<< std::endl
<< "Number of active cells: " <<
triangulation.n_active_cells()
<< std::endl
<< "Number of degrees of freedom: " <<
dof_handler.n_dofs()
<< std::endl
<< std::endl;
}
template<int dim>
bool HeatEquation<dim>::cell_is_in_metal_domain(const typename hp::DoFHandler<dim>::cell_iterator
&cell)
{
bool in_metal=false;
unsigned int n = 0;
for (unsigned int v=0;v<GeometryInfo<dim>::vertices_per_cell;++v)
{
double limit = (1+floor(5*time))*layerThickness;
in_metal = (cell->vertex(n)[dim-1]) < std::max(part_height,limit);
if(in_metal==false)
n++;
}
return in_metal;
}
template<int dim>
bool HeatEquation<dim>::cell_is_in_void_domain(const typename hp::DoFHandler<dim>::cell_iterator
&cell)
{
bool in_void = false;
unsigned int n = 0;
for(unsigned int v=0;v<GeometryInfo<dim>::vertices_per_cell;++v)
{
double limit = (1+floor(5*time))*layerThickness;
in_void = cell->vertex(n)[dim-1] > std::max(part_height,limit);
if(in_void == false)
n++;
}
return in_void;
}
template<int dim>
void HeatEquation<dim>::set_active_fe_indice()
{
//Iteration over all the cells of the mesh
for(typename hp::DoFHandler<dim>::active_cell_iterator cell = dof_handler.begin_active();cell != dof_handler.end();++cell)
{
//Lagrange Element if the cell is in metal domain
if(cell_is_in_metal_domain(cell))
cell->set_active_fe_index(0);
//Zero element if the cell is in void domain
else if (cell_is_in_void_domain(cell))
cell->set_active_fe_index(1);
//Throw an error if none of the above two cases is encountered
else
Assert(false,ExcNotImplemented());
}
}
template<int dim>
void HeatEquation<dim>::part_height_measure()
{
double max_height = part_height; //Maximal Height of vertice belonging to the metal domain in the previous function call
//Iteration over all the cells and storage of the maximal height of a vertex belonging to the metal domain
typename hp::DoFHandler<dim>::active_cell_iterator cell = dof_handler.begin_active(),endc = dof_handler.end();
for(;cell!=endc;++cell)
{
if(cell->active_fe_index() == 0)
{
double height_temp = 0;
for(unsigned int v=0;v<GeometryInfo<dim>::vertices_per_cell;++v)
{
height_temp = cell->vertex(v)[dim-1];
if(height_temp>max_height)
max_height = height_temp;
}
}
}
part_height = max_height;
}
template <int dim>
void HeatEquation<dim>::output_results() const
{
DataOut<dim,hp::DoFHandler<dim>> data_out;
data_out.attach_dof_handler(dof_handler);
data_out.add_data_vector(solution, "U");
data_out.build_patches();
const std::string filename = "solution-"
+ Utilities::int_to_string(timestep_number, 3) +
".vtk";
std::ofstream output(filename.c_str());
data_out.write_vtk(output);
}
template<int dim>
void HeatEquation<dim>::store_old_vectors()
{
map_old_solution.clear();
const MappingQ1<dim,dim> mapping;
typename hp::DoFHandler<dim>::active_cell_iterator cell1 = dof_handler.begin_active(),endc1 = dof_handler.end();
for(;cell1!=endc1;cell1++)
{
//Temporary variable to get the number of dof for the currently visited cell
const unsigned int dofs_per_cell = cell1->get_fe().dofs_per_cell;
std::vector<Point<dim>> support_points(dofs_per_cell);
if(dofs_per_cell != 0)//To skip the cell with FE = FE_Nothing as there is no support point there
{
//Get the coordinates of the support points on the unit cell
support_points = fe_collection[0].get_unit_support_points();
//Get the coordinates of the support points on the real cell
for(unsigned int i=0;i<dofs_per_cell;i++)
{
support_points[i] = mapping.transform_unit_to_real_cell(cell1,support_points[i]);
map_old_solution[support_points[i]] = VectorTools::point_value(dof_handler,old_solution,support_points[i]);
}
}
}
}
template <int dim>
void HeatEquation<dim>::refine_mesh (const unsigned int /*min_grid_level*/,
const unsigned int max_grid_level)
{
//Error estimation to set refine flags
Vector<float> estimated_error_per_cell(triangulation.n_active_cells());
//Computation of the vector of the KellyErrorEstimator on each cell
KellyErrorEstimator<dim>::estimate(dof_handler, face_quadrature_collection, typename FunctionMap<dim>::type(), solution, estimated_error_per_cell);
GridRefinement::refine_and_coarsen_fixed_fraction(triangulation, estimated_error_per_cell, 0.6, 0.4);
//Clear the refine flag of the cell which are already at the maximal level of refinement
if(triangulation.n_levels()>max_grid_level)
for(typename Triangulation<dim>::active_cell_iterator cell = triangulation.begin_active(max_grid_level);cell != triangulation.end(); ++cell)
cell->clear_refine_flag();
// Considering the bug in deal.II library all coarsen flags are removed
// Otherwise only the coarsening flag of the cells which are at the minimal level of refinement would be cleared
for (typename Triangulation<dim>::active_cell_iterator
cell = triangulation.begin_active();
cell != triangulation.end(); ++cell)
cell->clear_coarsen_flag ();
//Computation of the new triangulation and DoFHandler
triangulation.prepare_coarsening_and_refinement();
SolutionTransfer<dim,Vector<double>,hp::DoFHandler<dim>> solution_trans(dof_handler);
solution_trans.prepare_for_coarsening_and_refinement(solution);
triangulation.execute_coarsening_and_refinement();
dof_handler.distribute_dofs(fe_collection);
//Solution interpolation on the new DoF Handler
Vector<double> new_solution(dof_handler.n_dofs());
solution_trans.interpolate(solution, new_solution);
solution.reinit(dof_handler.n_dofs());
solution = new_solution;
old_solution = solution;
constraints.clear();
DoFTools::make_hanging_node_constraints(dof_handler, constraints);
constraints.close();
//Computation of the hanging node constraints
constraints.distribute(solution);
}
template<int dim>
void HeatEquation<dim>::transfer_old_vectors()
{
//Creation of a solution of the same size of the number of dof of the new FE space
Vector<double> long_solution;
long_solution.reinit(dof_handler.n_dofs(),false);
const MappingQ1<dim,dim> mapping;
std::vector<types::global_dof_index> local_dof_indices;
//Iteration over all the cells of the updated dof_handler to fill the solution vector from the one from of the former one
unsigned int k=0;
typename hp::DoFHandler<dim>::active_cell_iterator cell=dof_handler.begin_active(),endc = dof_handler.end();
for(;cell!=endc;cell++)
{
//Vector of the points already stored
std::vector<Point<dim>> points_stored;
//Number of dofof the currently visited cell
const unsigned int dofs_per_cell = cell -> get_fe().dofs_per_cell;
//Vector of the support points of one cell
std::vector<Point<dim>> support_points(dofs_per_cell);
if(dofs_per_cell!=0)// To skip the cell with FE = FE_Nothing because they have not any support point
{
// Get the coordinates of the support points on the unit cell
support_points = fe_collection[0].get_unit_support_points();
// Vector of the degree of freedom indices of one cell
local_dof_indices.resize(dofs_per_cell);
cell->get_dof_indices(local_dof_indices);
//Get the coordinates of the support points on the real cell
for (unsigned int i=0;i<dofs_per_cell;i++)
{
support_points[i] =
mapping.transform_unit_to_real_cell(cell,
support_points[i]);
typename std::map< Point<dim>, double>::iterator
iter_old = map_old_solution.begin();
double solution_temp = 0;
// Variable to check if a point has already been stored
unsigned int is_point_stored = 0;
// Iteration in the old solution map
for(;iter_old!= map_old_solution.end();iter_old++)
{
// Test if the point visited corresponds to a point in the "old" dof_handler
if(support_points[i] == iter_old -> first )
//store the Point currently visited
points_stored.push_back(support_points[i]);
typename std::vector<Point<dim>>::iterator it_points = points_stored.begin();
//Test if the point has not been visited and stored yet
for(;it_points != points_stored.end();it_points++)
{
if(*it_points == iter_old->first)
is_point_stored++; //=1 if it is the first time the point is visited, >1 if it is not
}
}
//In case it has not been visited yet --> we store the solution
if(is_point_stored == 1)
{
solution_temp = map_old_solution.find(support_points[i])-> second;
//Write the solution at the right place inside the vector
long_solution[local_dof_indices[i]] = solution_temp;
k++;
}
}
}
}
solution.reinit(dof_handler.n_dofs());
old_solution = long_solution;
constraints.clear();
DoFTools::make_hanging_node_constraints(dof_handler, constraints);
constraints.close();
constraints.distribute(old_solution);
}
template <int dim>
void HeatEquation<dim>::run()
{
//Initial Mesh Creation
const unsigned int initial_global_refinement = 5; //minimum level of refinement
const unsigned int n_adaptive_pre_refinement_steps = 7;// maximal level of refinement
create_coarse_grid();
triangulation.refine_global (initial_global_refinement);
//Set the right FE Type for each cell
set_active_fe_indice();
//Initialize the matrices and RHS
setup_system();
old_solution.reinit(dof_handler.n_dofs());
//Initial Condition
//Instantiation
InitialCondition<dim> initial_condition;
//Projection of the function defined in the initial condition class on the limit of the domain
VectorTools::project(dof_handler,constraints,quadrature_collection,initial_condition,old_solution,false,face_quadrature_collection);
//Dirichlet Boundary Conditions
//Instantiation
BoundaryValues<dim> boundary_value_function;
boundary_value_function.set_time(time);
std::map<types::global_dof_index,double> boundary_values;
VectorTools::interpolate_boundary_values(dof_handler,1,boundary_value_function,boundary_values);
//Modifies old_solution vector, rhs vector and system matrix according to Dirichlet BCs
MatrixTools::apply_boundary_values(boundary_values,system_matrix,old_solution,system_rhs);
//Initialization of the solution vector taking into account the initial condition
solution = old_solution;
//Solution map filling
store_old_vectors();
std::cout << "***Time step " << timestep_number << " at t=" << time<< std::endl;
std::cout << std::endl
<< "==========================================="
<< std::endl
<< "Number of active cells: " << triangulation.n_active_cells()
<< std::endl
<< "Number of degrees of freedom: " << dof_handler.n_dofs()
<< std::endl
<< std::endl;
output_results();
//Beginning of the time loop
while(time <=5.)
{
time+=time_step;
++timestep_number;
//Part height measurement considering the new layer
part_height_measure();
//Give the right FE type on each cell
set_active_fe_indice();
//Compute the mass and stiffness matrices on the new FE domain
setup_system();
//Transfer the solution(Temperature Field) to the new dofhandler
transfer_old_vectors();
//Compute the system matrix and RHS vector
assemble_system();
//Dirichlet boundary Conditions
BoundaryValues<dim> boundary_values_function;
boundary_values_function.set_time(time);
std::map<types::global_dof_index,double> boundary_values;
VectorTools::interpolate_boundary_values(dof_handler, 1, boundary_values_function, boundary_values);
MatrixTools::apply_boundary_values(boundary_values, system_matrix, solution, system_rhs);
//Compute the vector of nodal temperatures with direct solver
solve_time_step();
//Adaptive Mesh Refinement
refine_mesh(initial_global_refinement,n_adaptive_pre_refinement_steps);
part_height_measure();
//Produce the output files
output_results();
//Fill the map matching each point to its temperature
store_old_vectors();
}
}
}
int main()
{
try
{
using namespace dealii;
using namespace Step26;
HeatEquation<2> heat_equation_solver;
heat_equation_solver.run();
}
catch (std::exception &exc)
{
std::cerr << std::endl << std::endl
<< "----------------------------------------------------"
<< std::endl;
std::cerr << "Exception on processing: " << std::endl << exc.what()
<< std::endl << "Aborting!" << std::endl
<< "----------------------------------------------------"
<< std::endl;
return 1;
}
catch (...)
{
std::cerr << std::endl << std::endl
<< "----------------------------------------------------"
<< std::endl;
std::cerr << "Unknown exception!" << std::endl << "Aborting!"
<< std::endl
<< "----------------------------------------------------"
<< std::endl;
return 1;
}
return 0;
}