void LSSAction::on_regions_set() { if(m_implementation->m_updating) // avoid recursion return; m_implementation->m_lss = options().value< Handle<LSS::System> >("lss"); if(is_null(m_implementation->m_lss)) return; if(is_null(m_dictionary)) return; m_implementation->m_updating = true; // Create the LSS if the mesh is set if(!m_loop_regions.empty() && !m_implementation->m_lss->is_created()) { VariablesDescriptor& descriptor = find_component_with_tag<VariablesDescriptor>(physical_model().variable_manager(), solution_tag()); Handle< List<Uint> > gids = m_implementation->m_lss->create_component< List<Uint> >("GIDs"); Handle< List<Uint> > ranks = m_implementation->m_lss->create_component< List<Uint> >("Ranks"); Handle< List<Uint> > used_node_map = m_implementation->m_lss->create_component< List<Uint> >("used_node_map"); std::vector<Uint> node_connectivity, starting_indices; boost::shared_ptr< List<Uint> > used_nodes = build_sparsity(m_loop_regions, *m_dictionary, node_connectivity, starting_indices, *gids, *ranks, *used_node_map); add_component(used_nodes); // This comm pattern is valid only over the used nodes for the supplied regions PE::CommPattern& comm_pattern = *create_component<PE::CommPattern>("CommPattern"); comm_pattern.insert("gid",gids->array(),false); comm_pattern.setup(Handle<PE::CommWrapper>(comm_pattern.get_child("gid")),ranks->array()); CFdebug << "Creating LSS for " << starting_indices.size()-1 << " blocks with descriptor " << solution_tag() << ": " << descriptor.description() << CFendl; m_implementation->m_lss->create(comm_pattern, descriptor.size(), node_connectivity, starting_indices); CFdebug << "Finished creating LSS" << CFendl; configure_option_recursively(solver::Tags::regions(), options().option(solver::Tags::regions()).value()); configure_option_recursively("lss", m_implementation->m_lss); } // Update the regions of any owned initial conditions BOOST_FOREACH(const Handle<Component>& ic, m_created_initial_conditions) { ic->options().set(solver::Tags::regions(), options().option(solver::Tags::regions()).value()); }
void HeatConductionSteady::on_initial_conditions_set(InitialConditions& initial_conditions) { initial_conditions.create_initial_condition(solution_tag()); }