Beispiel #1
0
void attach_view_and_controller(popup_t&               control,
                                const dictionary_t&    parameters,
                                const factory_token_t& token,
                                adobe::name_t,
                                adobe::name_t,
                                adobe::name_t)
{
    sheet_t&      layout_sheet(token.client_holder_m.layout_sheet_m);
    assemblage_t& assemblage(token.client_holder_m.assemblage_m);

    if (parameters.count(key_bind) != 0)
    {
        name_t cell(get_value(parameters, key_bind).cast<name_t>());

        attach_view_and_controller_direct(control, parameters, token, cell);
    }

    if (parameters.count(key_items) && 
            get_value(parameters, key_items).type_info() == typeid(name_t))
    {
        // dynamically bind to the cell instead of getting a static list of popup items

        name_t cell(get_value(parameters, key_items).cast<name_t>());

        if (layout_sheet.count_interface(cell))
            attach_popup_menu_item_set(control, cell, layout_sheet, assemblage, token.client_holder_m);
        else
            attach_popup_menu_item_set(control, cell, token.sheet_m, assemblage, token.client_holder_m);
    }
}
Beispiel #2
0
    void attach_view_and_controller(listbox_t&             control,
                                    const dictionary_t&    parameters,
                                    const factory_token_t& token,
                                    adobe::name_t,
                                    adobe::name_t,
                                    adobe::name_t)
    {
        basic_sheet_t& layout_sheet(token.client_holder_m.layout_sheet_m);
        assemblage_t&  assemblage(token.client_holder_m.assemblage_m);

        if (parameters.count(key_bind) != 0) {
            name_t cell(get_value(parameters, key_bind).cast<name_t>());
            attach_view_and_controller_direct(control, parameters, token, cell);
        }

        control.row_factory_m = token.row_factory_m;

        if (parameters.count(key_items) &&
            get_value(parameters, key_items).type_info() == type_info<name_t>()) {
            name_t cell(get_value(parameters, key_items).cast<name_t>());
            listbox_t::item_set_view_controller_t& tmp = control.item_set_view_controller_m;
            if (layout_sheet.count_interface(cell)) {
                attach_view(assemblage, cell, tmp, layout_sheet);
                attach_controller_direct(tmp, parameters, token, cell);
            } else {
                attach_view(assemblage, cell, tmp, token.sheet_m);
                attach_controller_direct(tmp, parameters, token, cell);
            }
        }

        {
            any_regular_t selection_changed_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_selection_changed_signal"), selection_changed_binding))
                implementation::cell_and_expression(selection_changed_binding, cell, expression);
            control.selection_changed_proc_m =
                boost::bind(&handle_selection_changed_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("selection_changed"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2);
        }

        {
            any_regular_t dropped_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_dropped_signal"), dropped_binding))
                implementation::cell_and_expression(dropped_binding, cell, expression);
            control.dropped_proc_m =
                boost::bind(&handle_row_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("dropped"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2);
        }

        {
            any_regular_t drop_acceptable_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_drop_acceptable_signal"), drop_acceptable_binding))
                implementation::cell_and_expression(drop_acceptable_binding, cell, expression);
            control.drop_acceptable_proc_m =
                boost::bind(&handle_drop_acceptable_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("drop_acceptable"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2,
                            _3);
        }

        {
            any_regular_t left_clicked_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_left_clicked_signal"), left_clicked_binding))
                implementation::cell_and_expression(left_clicked_binding, cell, expression);
            control.left_clicked_proc_m =
                boost::bind(&handle_row_click_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("left_clicked"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2,
                            _3);
        }

        {
            any_regular_t right_clicked_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_right_clicked_signal"), right_clicked_binding))
                implementation::cell_and_expression(right_clicked_binding, cell, expression);
            control.right_clicked_proc_m =
                boost::bind(&handle_row_click_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("right_clicked"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2,
                            _3);
        }

        {
            any_regular_t double_clicked_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_double_clicked_signal"), double_clicked_binding))
                implementation::cell_and_expression(double_clicked_binding, cell, expression);
            control.double_clicked_proc_m =
                boost::bind(&handle_row_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("double_clicked"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2);
        }

        {
            any_regular_t erased_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_erased_signal"), erased_binding))
                implementation::cell_and_expression(erased_binding, cell, expression);
            control.erased_proc_m =
                boost::bind(&handle_row_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("erased"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2);
        }

        {
            any_regular_t browsed_binding;
            name_t cell;
            array_t expression;
            if (get_value(parameters, static_name_t("bind_browsed_signal"), browsed_binding))
                implementation::cell_and_expression(browsed_binding, cell, expression);
            control.browsed_proc_m =
                boost::bind(&handle_row_signal,
                            _1,
                            token.signal_notifier_m,
                            static_name_t("browsed"),
                            control.signal_id_m,
                            boost::ref(token.sheet_m),
                            cell,
                            expression,
                            _2);
        }

        adobe::attach_view(control.name_m.color_proxy_m, parameters, token, adobe::static_name_t("bind_label_color"));
#define BIND_COLOR(name)                                                \
        adobe::attach_view(control.name##_proxy_m, parameters, token, adobe::static_name_t("bind_" #name))
        BIND_COLOR(color);
        BIND_COLOR(interior_color);
        BIND_COLOR(hilite_color);
        BIND_COLOR(item_text_color);
#undef BIND_COLOR
    }
Beispiel #3
0
Probleme::Probleme(Maillage monMaillage, int rang)
{
    Set_maillage(&monMaillage);

    uexa = new VectorXd;
    uexa->resize(maillage->Get_n_nodes(),1);

    g = new VectorXd;
    g->resize(maillage->Get_n_nodes(),1);

    u = new VectorXd;
    u->resize(maillage->Get_n_nodes(),1);

    felim = new VectorXd(maillage->Get_n_nodes());
    
    for (int i=0;i<maillage->Get_n_nodes();i++)
    {
        double x=maillage->Get_nodes_coords()[3*i+0];
        double y=maillage->Get_nodes_coords()[3*i+1];
        double addedCoeff = calcul_f(x,y);
        felim->coeffRef(i,0)=addedCoeff;
    }

    p_K = new Eigen::SparseMatrix<double> (maillage->Get_n_nodes(),maillage->Get_n_nodes());
    p_M = new Eigen::SparseMatrix<double> (maillage->Get_n_nodes(),maillage->Get_n_nodes());

    diag = new Eigen::SparseMatrix<double> (maillage->Get_n_nodes(),maillage->Get_n_nodes());

    partition_noeud = new int[maillage->Get_n_nodes()];
    for (int i=0;i<maillage->Get_n_nodes();i++)
    {
        partition_noeud[i]=-1;
    }

    for (int i = 0; i < maillage->Get_nb_partitions(); i++) 
    {
        voisins_interface.push_back(vector<int>()); 
    }
    
    for (int i = 0; i < maillage->Get_nb_partitions(); i++) 
    {
        voisins_partition.push_back(vector<int>()); 
    }

    for (int ind_triangle=0;ind_triangle<maillage->Get_n_triangles();ind_triangle++)
    {
        int ind_pt1=(maillage->Get_triangles_sommets())[3*ind_triangle]-1;
        int ind_pt2=maillage->Get_triangles_sommets()[3*ind_triangle+1]-1;
        int ind_pt3=maillage->Get_triangles_sommets()[3*ind_triangle+2]-1;

        int numero_partition_triangle=maillage->Get_partition_ref()[maillage->Get_n_elems()-maillage->Get_n_triangles()+ind_triangle];

        /* Un noeud à l'interface est reconnu par son appartenance à deux partitions distinctes. */

        if (partition_noeud[ind_pt1]==-1)
        {
            partition_noeud[ind_pt1]=numero_partition_triangle;
        }
        else if(partition_noeud[ind_pt1]==numero_partition_triangle)
        {
        }
        else
        {
            partition_noeud[ind_pt1]=0;
        }

        if (partition_noeud[ind_pt2]==-1)
        {
            partition_noeud[ind_pt2]=numero_partition_triangle;
        }
        else if(partition_noeud[ind_pt2]==numero_partition_triangle)
        {
        }
        else
        {
            partition_noeud[ind_pt2]=0;
        }

        if (partition_noeud[ind_pt3]==-1)
        {
            partition_noeud[ind_pt3]=numero_partition_triangle;
        }
        else if(partition_noeud[ind_pt3]==numero_partition_triangle)
        {
        }
        else
        {
            partition_noeud[ind_pt3]=0;
        }
    }

    /* On sait maintenant quel noeud appartient à quel triangle. En parcourant à nouveau les triangles,
     * en s'arretant sur ceux qui sont au contact de l'interface sans y etre totalement inclus, on peut
     * donc déterminer les vecteurs voisins_interface et voisins_partition
     */

    for (int ind_triangle=0;ind_triangle<maillage->Get_n_triangles();ind_triangle++)
    {
        int ind_pt1=maillage->Get_triangles_sommets()[3*ind_triangle]-1; 
        int ind_pt2=maillage->Get_triangles_sommets()[3*ind_triangle+1]-1;
        int ind_pt3=maillage->Get_triangles_sommets()[3*ind_triangle+2]-1;

        int numero_partition_triangle=maillage->Get_partition_ref()[maillage->Get_n_elems()-maillage->Get_n_triangles()+ind_triangle];

        if ((partition_noeud[ind_pt1]==0 || partition_noeud[ind_pt2]==0 || partition_noeud[ind_pt3]==0) &&
                (!(partition_noeud[ind_pt1]==0 && partition_noeud[ind_pt2]==0 && partition_noeud[ind_pt3]==0)))
        {

            if (partition_noeud[ind_pt2]!=0)
            {
                /* Si le noeud n'est pas sur l'interface, il en est voisin */
                voisins_interface[partition_noeud[ind_pt2]-1].push_back(ind_pt2+1);
            }
            else
            {
                /* Si le noeud est sur l'interface, il est voisin de la partition du triangle auquel il appartient */
                voisins_partition[numero_partition_triangle-1].push_back(ind_pt2+1);
            }
            if (partition_noeud[ind_pt3]!=0)
            {
                voisins_interface[partition_noeud[ind_pt3]-1].push_back(ind_pt3+1);
            }
            else
            {
                voisins_partition[numero_partition_triangle-1].push_back(ind_pt3+1);
            }
            if (partition_noeud[ind_pt1]!=0)
            {
                voisins_interface[partition_noeud[ind_pt1]-1].push_back(ind_pt1+1);
            }
            else
            {
                voisins_partition[numero_partition_triangle-1].push_back(ind_pt1+1);
            }
        }
        else
        {
        }

     }

    /* On trie chaque liste de noeuds des vecteurs voisins_partition et voisins_interface par ordre
     * croissant afin de pouvoir les utiliser dans les communications
     * */

    vector<vector<int> >::iterator vect_it; 

    for (vect_it=voisins_partition.begin();vect_it!=voisins_partition.end();vect_it++)
    {
        std::sort((*vect_it).begin(),(*vect_it).end());
        
        vector<int>::iterator it;

        it = std::unique((*vect_it).begin(),(*vect_it).end());
        (*vect_it).resize(std::distance((*vect_it).begin(),it));

    }

    for (vect_it=voisins_interface.begin();vect_it!=voisins_interface.end();vect_it++)
    {
        std::sort((*vect_it).begin(),(*vect_it).end());

        vector<int>::iterator it;

        it = std::unique((*vect_it).begin(),(*vect_it).end());
        (*vect_it).resize(std::distance((*vect_it).begin(),it));
    }

    /* Calcul de la solution exacte */

    for(int ind_node=0;ind_node<maillage->Get_n_nodes();ind_node++)
    {
        uexa->coeffRef(ind_node,0)=calcul_uexa(maillage->Get_nodes_coords()[3*ind_node],maillage->Get_nodes_coords()[3*ind_node+1]);
    }
    
    /* Initialisation des conditions au bord, dans un premier temps a une constante*/

    for(int ind_node=0;ind_node<maillage->Get_n_nodes();ind_node++)
    {
        if (maillage->Get_nodes_ref()[ind_node]!=0)
        {
            double x=maillage->Get_nodes_coords()[3*ind_node+0];
            double y=maillage->Get_nodes_coords()[3*ind_node+1];
            double addedCoeff = calcul_g(x,y);
            g->coeffRef(ind_node,0)=addedCoeff;
        }
    }

    for(int ind_node=0;ind_node<maillage->Get_n_nodes();ind_node++)
    {
        u->coeffRef(ind_node,0)=1;
    }

    /* Assemblage de la matrice de rigidité par parcours de tous les triangles */

    assemblage(rang);

    /* Calcul du second membre avant pseudo élimination par l'intermédiaire de la matrice de masse */

    *felim = (*p_M)*(*felim); 

    /* Second membre prenant en compte les conditions aux bords */

    *felim=*felim-(*p_K) * (*g);

    /* Mise en oeuvre de la pseudo elimination */
    
    for(int i=0;i<maillage->Get_n_nodes();i++)
    {
        if (maillage->Get_nodes_ref()[i]==1)
        {
            double nouvCoeff = p_K->coeffRef(i,i)*g->coeffRef(i,0);
            felim->coeffRef(i,0)=nouvCoeff;
            for(int j=0;j<maillage->Get_n_nodes();j++)
            {
                if (j!=i)
                {
                    p_K->coeffRef(i,j)=0;
                    p_K->coeffRef(j,i)=0;
                }
            }
        }
    }

    /* On sotcke la diagonale de la matrice de rigidité pour les itérations */

    for (int i=0;i<maillage->Get_n_nodes();i++)
    {
        diag->coeffRef(i,i)=p_K->coeffRef(i,i);
    }
    /* On retire cette diagonale de la matrice de rigidité car le produit matriciel au cours
     * des itérations ne les fait pas intervenir ; une boucle pourrait etre évitée en utilisant
     * les fonctions diagonal de eigen mais la version installee empeche d'ajouter des matrices creuses
     * et des matrices denses
     * */

    for (int i=0;i<maillage->Get_n_nodes();i++)
    {
        p_K->coeffRef(i,i)=0;
    }
}