Changeset 13918


Ignore:
Timestamp:
11/08/12 16:02:41 (12 years ago)
Author:
Mathieu Morlighem
Message:

NEW: final touches to matrix preallocation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r13909 r13918  
    409409        int      configuration_type;
    410410        int      d_nz,o_nz;
    411         Element *element      = NULL;
    412         int     *head         = NULL;
    413         int     *next         = NULL;
    414         int     *count2offset = NULL;
    415         int     * sidlist     = NULL;
     411        Element *element            = NULL;
     412        Load    *load               = NULL;
     413        int     *head_e             = NULL;
     414        int     *next_e             = NULL;
     415        int     *count2offset_e     = NULL;
     416        int     *head_l             = NULL;
     417        int     *next_l             = NULL;
     418        int     *count2offset_l     = NULL;
     419        int     *sidlist            = NULL;
    416420
    417421        /*output*/
     
    429433        int m                   = nodes->NumberOfDofsLocal(configuration_type,set1enum);
    430434        int n                   = nodes->NumberOfDofsLocal(configuration_type,set2enum);
    431         int numnodesperobject   = elements->MaxNumNodes();
     435        int numnodesperelement  = elements->MaxNumNodes();
     436        int numnodesperload     = loads->MaxNumNodes(configuration_type);
    432437
    433438        /*First, we are building chaining vectors so that we know what nodes are
     
    436441         * will loop over all the elements that are connected to the node number
    437442         * id*/
    438         head         = xNew<int>(numnodes); for(i=0;i<numnodes;i++) head[i]=-1;
    439         next         = xNew<int>(elements->Size()*numnodesperobject);
    440         count2offset = xNew<int>(elements->Size()*numnodesperobject);
     443        head_e         = xNew<int>(numnodes); for(i=0;i<numnodes;i++) head_e[i]=-1;
     444        next_e         = xNew<int>(elements->Size()*numnodesperelement);
     445        count2offset_e = xNew<int>(elements->Size()*numnodesperelement);
    441446
    442447        k=0;
     
    450455                        _assert_(index>=0 && index<numnodes);
    451456
    452                         count2offset[k]=i;
    453                         next[k]=head[index];
    454                         head[index]=k++;
     457                        count2offset_e[k]=i;
     458                        next_e[k]=head_e[index];
     459                        head_e[index]=k++;
    455460                }
    456                 for(j=0;j<numnodesperobject-element->GetNumberOfNodes();j++) k++;
     461                for(j=0;j<numnodesperelement-element->GetNumberOfNodes();j++) k++;
     462
     463                xDelete<int>(sidlist);
     464        }
     465
     466        /*Chain for loads*/
     467        head_l         = xNew<int>(numnodes); for(i=0;i<numnodes;i++) head_l[i]=-1;
     468        next_l         = xNew<int>(loads->Size(configuration_type)*numnodesperload);
     469        count2offset_l = xNew<int>(loads->Size(configuration_type)*numnodesperload);
     470        k=0;
     471        for(i=0;i<loads->Size();i++){
     472                load = dynamic_cast<Load*>(loads->GetObjectByOffset(i));
     473                if(!load->InAnalysis(configuration_type)) continue;
     474                sidlist = xNew<int>(load->GetNumberOfNodes());
     475                load->GetNodesSidList(sidlist);
     476
     477                for(j=0;j<load->GetNumberOfNodes();j++){
     478                        index = sidlist[j];
     479                        _assert_(index>=0 && index<numnodes);
     480
     481                        count2offset_l[k]=i;
     482                        next_l[k]=head_l[index];
     483                        head_l[index]=k++;
     484                }
     485                for(j=0;j<numnodesperload-load->GetNumberOfNodes();j++) k++;
    457486
    458487                xDelete<int>(sidlist);
     
    475504
    476505                        /*Loop over elements that hold node number i*/
    477                         _assert_(head[node->Sid()]!=-1);
    478                         for(j=head[node->Sid()];j!=-1;j=next[j]){
    479                                 offset=count2offset[j];
     506                        _assert_(head_e[node->Sid()]!=-1 || head_l[node->Sid()]!=-1);
     507                        for(j=head_e[node->Sid()];j!=-1;j=next_e[j]){
     508                                offset=count2offset_e[j];
    480509                                element=dynamic_cast<Element*>(elements->GetObjectByOffset(offset));
    481510                                element->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,set1enum,set2enum);
     
    488517                                }
    489518                        }
     519                        for(j=head_l[node->Sid()];j!=-1;j=next_l[j]){
     520                                offset=count2offset_l[j];
     521                                load=dynamic_cast<Load*>(loads->GetObjectByOffset(offset));
     522                                load->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,set1enum,set2enum);
     523                                if(node->IsClone()){
     524                                        connectivity_clone[node->Sid()]+=d_nz+o_nz;
     525                                }
     526                                else{
     527                                        d_connectivity[node->Sid()]+=d_nz;
     528                                        o_connectivity[node->Sid()]+=o_nz;
     529                                }
     530                        }
    490531                }
    491532        }
    492533        xDelete<bool>(flags);
    493         xDelete<int>(count2offset);
    494         xDelete<int>(head);
    495         xDelete<int>(next);
     534        xDelete<int>(count2offset_e);
     535        xDelete<int>(head_e);
     536        xDelete<int>(next_e);
     537        xDelete<int>(count2offset_l);
     538        xDelete<int>(head_l);
     539        xDelete<int>(next_l);
    496540
    497541        /*sum over all cpus*/
Note: See TracChangeset for help on using the changeset viewer.