Changeset 22902


Ignore:
Timestamp:
07/05/18 03:04:58 (7 years ago)
Author:
bdef
Message:

BUG:fixing the freezing deactivation in IDS

Location:
issm/trunk-jpl/src/c
Files:
4 edited

Legend:

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

    r22898 r22902  
    485485
    486486        /*Intermediaries*/
    487         int                                             domaintype;
    488         Element*                        basalelement=NULL;
    489         bool                                    converged;
    490         int*                                    doflist =       NULL;
     487        bool     thawed_element;
     488        int                      domaintype;
     489        Element* basalelement=NULL;
     490        bool             converged;
     491        int*             doflist        =       NULL;
    491492
    492493        /*Get basal element*/
     
    514515
    515516        /*Use the dof list to index into the solution vector: */
     517
     518        /*need to introduce thawed test herre*/
    516519        for(int i=0;i<numnodes;i++){
    517520                values[i] =solution[doflist[i]];
     
    819822        }
    820823}/*}}}*/
     824
     825void HydrologyDCInefficientAnalysis::HydrologyIdsGetActive(Vector<IssmDouble>* active_vec, Element* element){/*{{{*/
     826        /*Constants*/
     827        int      domaintype;
     828        Element*   basalelement=NULL;
     829
     830        /*Get basal element*/
     831        element->FindParam(&domaintype,DomainTypeEnum);
     832        switch(domaintype){
     833                case Domain2DhorizontalEnum:
     834                        basalelement = element;
     835                        break;
     836                case Domain3DEnum:
     837                        if(!element->IsOnBase()) return;
     838                        basalelement = element->SpawnBasalElement();
     839                        break;
     840                default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
     841        }
     842
     843        const int   numnodes = basalelement->GetNumberOfNodes();
     844        IssmDouble  flag     = 0.;
     845        IssmDouble* active   = xNew<IssmDouble>(numnodes);
     846        bool active_element;
     847
     848        /*Pass the activity mask from elements to nodes*/
     849        basalelement->GetInputListOnVertices(&active[0],HydrologydcMaskThawedNodeEnum);
     850        Input*  active_element_input=basalelement->GetInput(HydrologydcMaskThawedEltEnum); _assert_(active_element_input);
     851        active_element_input->GetInputValue(&active_element);
     852
     853        for(int i=0;i<numnodes;i++) flag+=active[i];
     854
     855        /*If any node is active all the node in the element are active*/
     856        if(flag>0.){
     857                for(int i=0;i<numnodes;i++){
     858                        active_vec->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
     859                }
     860        }
     861        /*If the element is active all its nodes are active*/
     862        else if(active_element){
     863                for(int i=0;i<numnodes;i++){
     864                        active_vec->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL);
     865                }
     866        }
     867        else{
     868                /*Do not do anything: at least one node is active for this element but this element is not solved for*/
     869        }
     870        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     871        xDelete<IssmDouble>(active);
     872}
     873/*}}}*/
  • issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h

    r22898 r22902  
    4242                void HydrologyIDSGetMask(Vector<IssmDouble>* vec_mask, Element* element);
    4343                void ElementizeIdsMask(FemModel* femmodel);
     44                void HydrologyIdsGetActive(Vector<IssmDouble>* active_vec, Element* element);
    4445};
    4546#endif
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r22898 r22902  
    45994599        bool                isthermal;
    46004600        Vector<IssmDouble>* mask                                = NULL;
     4601        Vector<IssmDouble>* active                              = NULL;
    46014602        IssmDouble*         serial_mask = NULL;
     4603        IssmDouble*         serial_active       = NULL;
    46024604
    46034605        HydrologyDCInefficientAnalysis* inefanalysis =  new HydrologyDCInefficientAnalysis();
     
    46204622        /*for other cases we just grab the mask from the initialisation value*/
    46214623        else{
    4622         GetVectorFromInputsx(&serial_mask,this,HydrologydcMaskThawedNodeEnum,NodeSIdEnum);
    4623         }
     4624                GetVectorFromInputsx(&serial_mask,this,HydrologydcMaskThawedNodeEnum,NodeSIdEnum);
     4625        }
     4626        /*Update Mask and elementize*/
     4627        InputUpdateFromVectorx(this,serial_mask,HydrologydcMaskThawedNodeEnum,NodeSIdEnum);
     4628        xDelete<IssmDouble>(serial_mask);
     4629        inefanalysis->ElementizeIdsMask(this);
     4630
     4631        /*get node mask coherent with element mask*/
     4632        active=new Vector<IssmDouble>(nodes->NumberOfNodes(HydrologyDCInefficientAnalysisEnum));
     4633        for (int i=0;i<elements->Size();i++){
     4634                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
     4635                inefanalysis->HydrologyIdsGetActive(active,element);
     4636        }
     4637
     4638        /*Assemble and serialize*/
     4639        active->Assemble();
     4640        serial_active=active->ToMPISerial();
     4641        delete active;
     4642
    46244643        /*Update node activation accordingly*/
    46254644        int counter =0;
     
    46274646                Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
    46284647                if(node->InAnalysis(HydrologyDCInefficientAnalysisEnum)){
    4629                         if(serial_mask[node->Sid()]==1.){
     4648                        if(serial_active[node->Sid()]==1.){
    46304649                                node->Activate();
    46314650                                if(!node->IsClone()) counter++;
     
    46374656        }
    46384657
    4639         /*Update Mask*/
    4640         InputUpdateFromVectorx(this,serial_mask,HydrologydcMaskThawedNodeEnum,NodeSIdEnum);
    4641         xDelete<IssmDouble>(serial_mask);
    4642         inefanalysis->ElementizeIdsMask(this);
    4643 
     4658        xDelete<IssmDouble>(serial_active);
     4659        delete inefanalysis;
    46444660        int sum_counter;
    46454661        ISSM_MPI_Reduce(&counter,&sum_counter,1,ISSM_MPI_INT,ISSM_MPI_SUM,0,IssmComm::GetComm() );
  • issm/trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp

    r22898 r22902  
    6060        GetSolutionFromInputsx(&ug_sed,femmodel);
    6161        Reducevectorgtofx(&uf_sed, ug_sed, femmodel->nodes,femmodel->parameters);
    62         /*Initialize the thawed element mask*/
    6362        if(isefficientlayer) {
    6463                inefanalysis = new HydrologyDCInefficientAnalysis();
Note: See TracChangeset for help on using the changeset viewer.