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. 

-- 
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].
For more options, visit https://groups.google.com/d/optout.

Reply via email to