Changeset 13889


Ignore:
Timestamp:
11/06/12 16:39:48 (12 years ago)
Author:
Mathieu Morlighem
Message:

CHG: improved some aspects of stiffness matrix allocation (get number of nodes per elements), still some work to do

File:
1 edited

Legend:

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

    r13888 r13889  
    406406
    407407        /*Intermediary*/
    408         int      i,j,k,index,count;
     408        int      i,j,k,index,offset,count;
    409409        int      analysis_type,configuration_type;
    410         int      fsize,dim;
    411410        int      d_nz,o_nz;
    412         Element *element = NULL;
    413         int     *head    = NULL;
    414         int     *next    = NULL;
     411        Element *element      = NULL;
     412        int     *head         = NULL;
     413        int     *next         = NULL;
     414        int     *count2offset = NULL;
    415415
    416416        /*output*/
     
    421421        this->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
    422422        this->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
    423         this->parameters->FindParam(&dim,MeshDimensionEnum);
    424423
    425424        /*Get vector size and number of nodes*/
     
    427426        int numberofdofspernode = nodes->MaxNumDofs(configuration_type,GsetEnum);
    428427        int m                   = nodes->NumberOfDofsLocal(analysis_type,set1enum);
     428        int numnodesperobject   = elements->MaxNumNodes();
    429429
    430430        /*First, we are building chaining vectors so that we know what nodes are
     
    433433         * will loop over all the elements that are connected to the node number
    434434         * id*/
    435         if(dim==2){
    436                 head=xNew<int>(numnodes); for(i=0;i<numnodes;i++) head[i]=-1;
    437                 next=xNew<int>(elements->Size()*3); /*3 = number of nodes per element*/
    438         }
    439         else if(dim==3){
    440                 head=xNew<int>(numnodes); for(i=0;i<numnodes;i++) head[i]=-1;
    441                 next=xNew<int>(elements->Size()*6); /*6 = number of nodes per element*/
    442         }
    443         else{
    444                 _error_("dim "<<dim<<" not supported yet");
    445         }
     435        head         = xNew<int>(numnodes); for(i=0;i<numnodes;i++) head[i]=-1;
     436        next         = xNew<int>(elements->Size()*numnodesperobject);
     437        count2offset = xNew<int>(elements->Size()*numnodesperobject);
     438
    446439        k=0;
    447440        for(i=0;i<elements->Size();i++){
    448441                element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
    449                 for(int j=0;j<3;j++){
    450                         int index =dynamic_cast<Tria*>(element)->nodes[j]->sid;//starts at 0 for a given analysis
     442                for(int j=0;j<numnodesperobject;j++){
     443                        index =dynamic_cast<Tria*>(element)->nodes[j]->sid;//starts at 0 for a given analysis
    451444                        _assert_(k>=0 && k<numnodes*elements->Size() && index>=0 && index<numnodes);
     445
     446                        count2offset[k]=i;
    452447                        next[k]=head[index];
    453448                        head[index]=k++;
     
    473468                        _assert_(head[node->Sid()]!=-1);
    474469                        for(j=head[node->Sid()];j!=-1;j=next[j]){
    475                                 if(dim==2){
    476                                         index = (int)(double(j)/3);
    477                                 }
    478                                 else if(dim==3){
    479                                         index = (int)(double(j)/6);
    480                                 }
    481                                 else{
    482                                         _error_("dim "<<dim<<" not supported yet");
    483                                 }
    484                                 element=dynamic_cast<Element*>(elements->GetObjectByOffset(index));
     470                                offset=count2offset[j];
     471                                element=dynamic_cast<Element*>(elements->GetObjectByOffset(offset));
    485472                                element->SetwiseNodeConnectivity(&d_nz,&o_nz,node,flags,set1enum,set2enum);
    486473                                if(node->IsClone()){
     
    495482        }
    496483        xDelete<bool>(flags);
     484        xDelete<int>(count2offset);
    497485        xDelete<int>(head);
    498486        xDelete<int>(next);
     
    515503                                        d_nnz[count]=numberofdofspernode*(d_connectivity[node->Sid()] + all_connectivity_clone[node->Sid()]);
    516504                                        o_nnz[count]=numberofdofspernode*(o_connectivity[node->Sid()] + all_connectivity_clone[node->Sid()]);
    517                                         if(d_nnz[count]>m)   d_nnz[count]=m;
    518                                         if(o_nnz[count]>fsize-m) o_nnz[count]=fsize-m;
     505                                        //if(d_nnz[count]>m)   d_nnz[count]=m;
     506                                        //if(o_nnz[count]>fsize-m) o_nnz[count]=fsize-m;
    519507                                        count++;
    520508                                }
Note: See TracChangeset for help on using the changeset viewer.