Changeset 26448


Ignore:
Timestamp:
09/21/21 11:41:28 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: made Crevasse depth more efficient by removing ToMPISerial

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp

    r26434 r26448  
    516516                }
    517517        }
    518 
    519         if(calvinglaw==CalvingHabEnum){
     518   else if(calvinglaw==CalvingHabEnum){
    520519
    521520                /*Get the fraction of the flotation thickness at the terminus*/
     
    559558                }
    560559        }
    561 
    562         if(calvinglaw==CalvingCrevasseDepthEnum){
    563 
    564                 int                 nflipped,local_nflipped;
    565                 Vector<IssmDouble>* vec_constraint_nodes = NULL;
     560   else if(calvinglaw==CalvingCrevasseDepthEnum){
     561
     562                int   nflipped,local_nflipped;
    566563                IssmDouble* constraint_nodes = NULL;
    567564
     
    571568
    572569                /*Vector of size number of nodes*/
    573                 vec_constraint_nodes=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes());
     570      int numnodes      = femmodel->nodes->NumberOfNodes();
     571      int localmasters  = femmodel->nodes->NumberOfNodesLocal();
     572      Vector<IssmDouble>* vec_constraint_nodes = vec_constraint_nodes=new Vector<IssmDouble>(localmasters,numnodes);
    574573
    575574                for(Object* & object : femmodel->elements->objects){
    576                         Element* element               = xDynamicCast<Element*>(object);
    577                         int      numnodes              = element->GetNumberOfNodes();
    578                         Gauss*   gauss                 = element->NewGauss();
    579                         Input*   crevassedepth_input   = element->GetInput(CrevasseDepthEnum); _assert_(crevassedepth_input);
    580                         Input*   bed_input             = element->GetInput(BedEnum); _assert_(bed_input);
     575                        Element* element   = xDynamicCast<Element*>(object);
     576                        int      numnodes  = element->GetNumberOfNodes();
     577                        Gauss*   gauss     = element->NewGauss();
     578
     579                        Input*   crevassedepth_input    = element->GetInput(CrevasseDepthEnum); _assert_(crevassedepth_input);
     580                        Input*   bed_input              = element->GetInput(BedEnum); _assert_(bed_input);
    581581                        Input*   surface_crevasse_input = element->GetInput(SurfaceCrevasseEnum); _assert_(surface_crevasse_input);
    582                         Input*   thickness_input       = element->GetInput(ThicknessEnum); _assert_(thickness_input);
    583                         Input*   surface_input         = element->GetInput(SurfaceEnum); _assert_(surface_input);
     582                        Input*   thickness_input        = element->GetInput(ThicknessEnum); _assert_(thickness_input);
     583                        Input*   surface_input          = element->GetInput(SurfaceEnum); _assert_(surface_input);
    584584
    585585                        /*First, look at ice front and figure out if any of the nodes will be calved*/
     
    606606                /*Assemble vector and serialize: */
    607607                vec_constraint_nodes->Assemble();
    608                 constraint_nodes=vec_constraint_nodes->ToMPISerial();
     608      femmodel->GetLocalVectorWithClonesNodes(&constraint_nodes,vec_constraint_nodes);
    609609
    610610                nflipped=1;
     
    612612                        local_nflipped=0;
    613613                        for(Object* & object : femmodel->elements->objects){
    614                                 Element* element                = xDynamicCast<Element*>(object);
    615                                 int      numnodes               = element->GetNumberOfNodes();
    616                                 Gauss*   gauss                  = element->NewGauss();
     614                                Element* element  = xDynamicCast<Element*>(object);
     615                                int      numnodes = element->GetNumberOfNodes();
     616                                Gauss*   gauss    = element->NewGauss();
     617
    617618                                Input*   levelset_input         = element->GetInput(DistanceToCalvingfrontEnum); _assert_(levelset_input);
    618619                                Input*   crevassedepth_input    = element->GetInput(CrevasseDepthEnum); _assert_(crevassedepth_input);
     
    626627                                for(int in=0;in<numnodes;in++){
    627628                                        Node* node=element->GetNode(in);
    628                                         if(constraint_nodes[node->Pid()]==1.){
     629                                        if(constraint_nodes[node->Lid()]==1.){
    629630                                                isconnected = true;
    630631                                                break;
     
    644645                                                surface_input->GetInputValue(&surface,gauss);
    645646
    646                                                 if((surface_crevasse-surface>0. || crevassedepth-thickness>0.) && bed<0. && levelset>-300. && levelset<0. && constraint_nodes[node->Pid()]==0.){
     647                                                if((surface_crevasse-surface>0. || crevassedepth-thickness>0.) && bed<0. && levelset>-300. && levelset<0. && constraint_nodes[node->Lid()]==0.){
    647648                                                        local_nflipped++;
    648649                                                        vec_constraint_nodes->SetValue(node->Pid(),1.0,INS_VAL);
     
    659660                        vec_constraint_nodes->Assemble();
    660661                        xDelete<IssmDouble>(constraint_nodes);
    661                         constraint_nodes=vec_constraint_nodes->ToMPISerial();
     662         femmodel->GetLocalVectorWithClonesNodes(&constraint_nodes,vec_constraint_nodes);
    662663                }
    663664                /*Free ressources:*/
     
    675676                                if(!node->IsActive()) continue;
    676677
    677                                 if(constraint_nodes[node->Pid()]>0.){
     678                                if(constraint_nodes[node->Lid()]>0.){
    678679                                        node->ApplyConstraint(0,+1.);
    679680                                }
Note: See TracChangeset for help on using the changeset viewer.