NumericType PostProcessedQuantities<NumericType>::component( const libMesh::FEMContext& context, unsigned int component, const libMesh::Point& p, libMesh::Real /*time*/ ) { // Check if the Elem is the same between the incoming context and the cached one. // If not, reinit the cached MultiphysicsSystem context if( &(context.get_elem()) != &(_multiphysics_context->get_elem()) ) { _multiphysics_context->pre_fe_reinit(*_multiphysics_sys,&context.get_elem()); _multiphysics_context->elem_fe_reinit(); } /* Optimization since we expect this function to be called many times with the same point. _prev_point initialized to something absurd so this should always be false the first time. */ if( _prev_point != p ) { _prev_point = p; std::vector<libMesh::Point> point_vec(1,p); this->_cache.clear(); _multiphysics_sys->compute_element_cache( *(this->_multiphysics_context), point_vec, this->_cache ); } return this->compute_quantities( component ); }
NumericType PostProcessedQuantities<NumericType>::component( const libMesh::FEMContext& context, unsigned int component, const libMesh::Point& p, libMesh::Real /*time*/ ) { // Check if the Elem is the same between the incoming context and the cached one. // If not, reinit the cached MultiphysicsSystem context if(context.has_elem() && _multiphysics_context->has_elem()) { if( &(context.get_elem()) != &(_multiphysics_context->get_elem()) ) { _multiphysics_context->pre_fe_reinit(*_multiphysics_sys,&context.get_elem()); _multiphysics_context->elem_fe_reinit(); } } else if( !context.has_elem() && _multiphysics_context->has_elem() ) { // Incoming context has NULL elem ==> SCALAR variables _multiphysics_context->pre_fe_reinit(*_multiphysics_sys,NULL); _multiphysics_context->elem_fe_reinit(); } else if( context.has_elem() && !_multiphysics_context->has_elem() ) { _multiphysics_context->pre_fe_reinit(*_multiphysics_sys,&context.get_elem()); _multiphysics_context->elem_fe_reinit(); } //else /* If has_elem() is false for both contexts, we're still dealing with SCALAR variables and therefore don't need to reinit. */ libMesh::Real value = 0.0; // Quantity we want had better be there. libmesh_assert(_quantity_index_var_map.find(component) != _quantity_index_var_map.end()); unsigned int quantity_index = _quantity_index_var_map.find(component)->second; _multiphysics_sys->compute_postprocessed_quantity( quantity_index, *(this->_multiphysics_context), p, value ); return value; }