Dear all,
I am hoping someone can shed a bit more light on a problem I am having. The background of the system of equations i am solving: I have 4 DAEs (for pf, pr, vr, vf) and 2 time dependent equations (phi, t) as a system of 6 equations. I am solving the 4daes first then using the solutions into the time dependent equations (which need the solutions in the DAEs), and I am using these two solutions to rerun the 4 DAEs and so on.
The right hand side of the weak forms of the DAEs all require information about each other, so at the initial timestep I am providing a guess, but from then on, i am using get_function_values or get_function_gradients/divergences. I have been using these fine for most of my variables, but i am having an issue with one of them.
My 4 DAEs look basically like the Stokes' system, with 1 DAEs in mixed formulation (very similar to Darcy's) and another non-differential algebraic equation for vf. Now, for this equation/variable, I am using:
FESystem<dim> vf_fe;
DoFHandler<dim> vf_dof_handler;
ConstraintMatrix vf_constraints;
SparsityPattern vf_sparsity_pattern;
SparseMatrix<double> vf_system_matrix;
SparseMatrix<double> vf_mass_matrix;
Vector<double> vf_solution;
Vector<double> vf_initial_solution;
Vector<double> vf_system_rhs;
and vf_fe (FE_Q<dim>(pf_degree+1), dim) as vf is vector valued.
For the others, like the example codes (step-20/22/31), i am using BlockVectors etc. eg,
rock_fe (FE_Q<dim>(pr_degree+1), dim,
FE_Q<dim>(pr_degree), 1)
with BlockSparsityPattern rock_sparsity_pattern;
BlockSparseMatrix<double> rock_system_matrix;
BlockVector<double> rock_solution;
BlockVector<double> rock_system_rhs;
and so on.
I am of course using const FEValuesExtractors::Vector velocities (0); etc for most of the things I need. now out of the following, in the loop over all the cells: I have
pf_fe_values[pressure].get_function_values (pf_solution, pf_values);
pf_fe_values[pressure].get_function_gradients (pf_solution, grad_pf_values);
phi_fe_values.get_function_values (phi_solution, phi_values);
phi_fe_values.get_function_gradients (phi_solution, grad_phi_values);
vf_fe_values.get_function_values (vf_solution, vf_values);
vf_fe_values.get_function_divergences (vf_solution, div_vf_values);
and the LAST one for get_function_divergences does not seem to work. It is telling me there is no member function called get_function_divergeneces. I am a little confused as elsewhere i use vr_fe_values[velocities].get_function_divergences (rock_solution, div_vr_values); and this works fine.
I have also tried vf_fe_values[velocities].get_function_divergences (vf_solution, div_vf_values); - now this does not give me the same error, the program runs but i get:
An error occurred in line <2364> of file </scratch/leej/dealnew/dealii-8.5.0/source/fe/fe_values.cc> in function
void dealii::internal::do_function_values(const Number*, const dealii::Table<2, double>&, const dealii::FiniteElement<dim, spacedim>&, const std::vector<unsigned int>&, dealii::VectorSlice<std::vector<VectorType> >&, bool, unsigned int) [with int dim = 2; int spacedim = 2; VectorType = dealii::Vector<double>; Number = double]
The violated condition was:
(values[i].size()) == (result_components)
Additional information:
Dimension 0 not equal to 2.
I also get the same no member function call when used with the get_function_values on the same variable with FEValuesExtractors and adding [velocities]
I would be grateful if someone could shed a bit more light on why I am getting these errors. I particularly do not understand why it is giving me a dimension error either. It seems like quite a trivial thing but it seems not? I wondered whether it is because it is not aware that the solution is a vector, but I'm pretty sure the fact that I have an FESystem sorts this out?
As further information, note that i am using
std::vector<Vector<double> > vf_values (n_q_points);
std::vector<double> div_vf_values (n_q_points);
I have also looped over the right cells etc using
typename DoFHandler<dim>::active_cell_iterator
vf_cell = vf_dof_handler.begin_active();
as well as intialising correctly.
Before this assmebly bit is run, the initial vf_solution is just interpolated with
VectorTools::interpolate(vf_dof_handler, vfInitialFunction<dim>(), vf_solution);
where it is just zero
template <int dim>
double
vfInitialFunction<dim>::value (const Point<dim> &p,
const unsigned int component) const
{
if (component == 0)
return 0.0;
else if (component == 1)
return 0.0*p[0];
return 0.0;
}
Many thanks for your help in advance.