Changeset 24030


Ignore:
Timestamp:
06/19/19 07:14:34 (6 years ago)
Author:
bdef
Message:

CHG: a better way to reset deactivated hydro nodes

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

Legend:

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

    r23959 r24030  
    434434        basalelement->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum);
    435435        IssmDouble* eplHeads = xNew<IssmDouble>(numnodes);
    436         IssmDouble* base     = xNew<IssmDouble>(numnodes);
    437 
    438         basalelement->GetInputListOnVertices(&base[0],BaseEnum);
     436
    439437        /*Use the dof list to index into the solution vector: */
    440         /*If the EPL is not active we revert to the bedrock elevation*/
     438        /*If the EPL is not active we revert to the bedrock elevation when deactivating*/
    441439        for(int i=0;i<numnodes;i++){
    442                 if(basalelement->nodes[i]->IsActive()){
    443                         eplHeads[i]=solution[doflist[i]];
    444                 }
    445                 else{
    446                         eplHeads[i]=base[i];
    447                 }
     440                eplHeads[i]=solution[doflist[i]];
    448441                if(xIsNan<IssmDouble>(eplHeads[i])) _error_("NaN found in solution vector");
    449442                if(xIsInf<IssmDouble>(eplHeads[i])) _error_("Inf found in solution vector");
     
    453446        /*Free ressources:*/
    454447        xDelete<IssmDouble>(eplHeads);
    455         xDelete<IssmDouble>(base);
    456448        xDelete<int>(doflist);
    457449        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
  • issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp

    r23959 r24030  
    364364        basalelement->FindParam(&smb_model,SmbEnum);
    365365
    366         Input*  sed_head_input                   = basalelement->GetInput(SedimentHeadHydrostepEnum);
    367         Input*  epl_head_input                   = basalelement->GetInput(EplHeadHydrostepEnum);
    368         Input*  base_input                                       = basalelement->GetInput(BaseEnum);
    369         Input*  basal_melt_input                 = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melt_input);
    370         Input*  SedTrans_input                   = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
     366        Input* sed_head_input   = basalelement->GetInput(SedimentHeadHydrostepEnum);
     367        Input* epl_head_input   = basalelement->GetInput(EplHeadHydrostepEnum);
     368        Input* base_input                       = basalelement->GetInput(BaseEnum);
     369        Input* basal_melt_input = basalelement->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(basal_melt_input);
     370        Input* SedTrans_input   = basalelement->GetInput(HydrologydcSedimentTransmitivityEnum); _assert_(SedTrans_input);
    371371
    372372        if(dt!= 0.){
     
    488488
    489489        /*Intermediaries*/
    490         int                     domaintype;
     490        int      domaintype;
    491491        Element* basalelement=NULL;
    492         bool             converged;
     492        bool     converged;
     493        int*     doflist = NULL;
    493494
    494495        /*Get basal element*/
     
    504505                default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
    505506        }
    506         /*Intermediary*/
    507         int* doflist = NULL;
    508 
    509507        /*Fetch number of nodes for this finite element*/
    510508        int numnodes = basalelement->GetNumberOfNodes();
     
    515513        IssmDouble* pressure = xNew<IssmDouble>(numnodes);
    516514        IssmDouble* residual = xNew<IssmDouble>(numnodes);
    517         IssmDouble* base     = xNew<IssmDouble>(numnodes);
    518 
    519         basalelement->GetInputListOnVertices(&base[0],BaseEnum);
    520         /*Use the dof list to index into the solution vector, frozen nodes are set to initial value: */
     515
     516        /*Use the dof list to index into the solution vector reseting to base is done at the deactivate stage: */
    521517        for(int i=0;i<numnodes;i++){
    522                 if(basalelement->nodes[i]->IsActive()){
    523                         values[i] =solution[doflist[i]];
    524                 }
    525                 else{
    526                         values[i] = base[i];
    527                 }
     518                values[i] =solution[doflist[i]];
    528519                if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
    529520                if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in solution vector");
     
    537528                IssmDouble  penalty_factor,kmax,kappa,h_max;
    538529                IssmDouble* thickness = xNew<IssmDouble>(numnodes);
     530                IssmDouble* base = xNew<IssmDouble>(numnodes);
    539531                IssmDouble* transmitivity = xNew<IssmDouble>(numnodes);
    540532
     
    546538
    547539                basalelement->GetInputListOnVertices(&thickness[0],ThicknessEnum);
     540                basalelement->GetInputListOnVertices(&base[0],BaseEnum);
    548541                basalelement->GetInputListOnVertices(&transmitivity[0],HydrologydcSedimentTransmitivityEnum);
    549542
     
    563556                }
    564557                xDelete<IssmDouble>(thickness);
     558                xDelete<IssmDouble>(base);
    565559                xDelete<IssmDouble>(transmitivity);
    566                 xDelete<IssmDouble>(base);
    567560        }
    568561
     
    576569        xDelete<IssmDouble>(residual);
    577570        xDelete<IssmDouble>(pressure);
    578         xDelete<IssmDouble>(base);
    579571        xDelete<int>(doflist);
    580572        if(domaintype!=Domain2DhorizontalEnum){
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r23993 r24030  
    14701470                ISSM_MPI_Reduce(&local_icefront_area,&total_icefront_area,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm());
    14711471                ISSM_MPI_Bcast(&total_icefront_area,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    1472                
     1472
    14731473                basin_icefront_area[basin-1]=total_icefront_area;
    14741474        }
    1475        
     1475
    14761476        this->parameters->AddObject(new DoubleVecParam(FrontalForcingsBasinIcefrontAreaEnum,basin_icefront_area,numbasins));
    14771477        xDelete<IssmDouble>(basin_icefront_area);
    1478        
     1478
    14791479}/*}}}*/
    14801480void FemModel::IcefrontMassFluxx(IssmDouble* pM, bool scaled){/*{{{*/
     
    48084808        delete active;
    48094809
     4810
    48104811        /*Update node activation accordingly*/
    4811         int counter =0;
    4812         for (int i=0;i<nodes->Size();i++){
    4813                 Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
    4814                 if(serial_active[node->Sid()]==1.){
    4815                         node->Activate();
    4816                         if(!node->IsClone()) counter++;
    4817                 }
    4818                 else{
    4819                         node->Deactivate();
    4820                 }
     4812        int         counter  = 0; //this is probably not acurate but we are only interested in positivity
     4813        for(int i=0;i<elements->Size();i++){
     4814                Element    *element  = xDynamicCast<Element*>(elements->GetObjectByOffset(i));
     4815                int         numnodes = element->GetNumberOfNodes();
     4816                IssmDouble *base     = xNew<IssmDouble>(numnodes);
     4817                element->GetInputListOnNodes(&base[0],BaseEnum);
     4818                for(int in=0;in<numnodes;in++){
     4819                        Node* node=element->GetNode(in);
     4820                        if(serial_active[node->Sid()]==1.){
     4821                                node->Activate();
     4822                                if(!node->IsClone()) counter++;
     4823                        }
     4824                        else{
     4825                                node->Deactivate();
     4826                                node->ApplyConstraint(0,base[in]);
     4827                        }
     4828                }
     4829                xDelete<IssmDouble>(base);
    48214830        }
    48224831        xDelete<IssmDouble>(serial_active);
     
    48284837        counter=sum_counter;
    48294838        *pEplcount = counter;
    4830         if(VerboseSolution()) _printf0_("   Number of active nodes in EPL layer: "<< counter <<"\n");
     4839        if(VerboseSolution()) {
     4840                if(counter==0){
     4841                        _printf0_("   No nodes are active in EPL layer \n");
     4842                }
     4843                else {
     4844                        _printf0_("   Some active nodes in EPL layer \n");
     4845                }
     4846        }
    48314847
    48324848        /*Update dof indexings*/
     
    48814897
    48824898        /*Update node activation accordingly*/
    4883         int counter =0;
    4884         for (int i=0;i<nodes->Size();i++){
    4885                 Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i));
    4886                 if(serial_active[node->Sid()]==1.){
    4887                         node->Activate();
    4888                         if(!node->IsClone()) counter++;
    4889                 }
    4890                 else{
    4891                         node->Deactivate();
    4892                 }
    4893         }
    4894 
     4899        int         counter  = 0; //this is probably not acurate but we are only interested in positivity
     4900        for(int i=0;i<elements->Size();i++){
     4901                Element    *element  = xDynamicCast<Element*>(elements->GetObjectByOffset(i));
     4902                int         numnodes = element->GetNumberOfNodes();
     4903                IssmDouble *base     = xNew<IssmDouble>(numnodes);
     4904
     4905                element->GetInputListOnNodes(&base[0],BaseEnum);
     4906
     4907                for(int in=0;in<numnodes;in++){
     4908                        Node* node=element->GetNode(in);
     4909                        if(serial_active[node->Sid()]==1.){
     4910                                node->Activate();
     4911                                if(!node->IsClone()) counter++;
     4912                        }
     4913                        else{
     4914                                node->Deactivate();
     4915                                node->ApplyConstraint(0,base[in]);
     4916                        }
     4917                }
     4918                xDelete<IssmDouble>(base);
     4919        }
    48954920        xDelete<IssmDouble>(serial_active);
    48964921        delete inefanalysis;
     
    49004925        counter=sum_counter;
    49014926        *pIDScount = counter;
    4902         if(VerboseSolution()) _printf0_("   Number of active nodes in IDS layer: "<< counter <<"\n");
    4903 
     4927        if(VerboseSolution()) {
     4928                if(counter==0){
     4929                        _printf0_("   No nodes are active in IDS layer \n");
     4930                }
     4931                else {
     4932                        _printf0_("   Some active nodes in IDS layer \n");
     4933                }
     4934        }
    49044935        /*Update dof indexings*/
    49054936        this->UpdateConstraintsx();
  • issm/trunk-jpl/src/c/classes/IoModel.cpp

    r23767 r24030  
    402402                        _printf0_(" Marshalled file is corrupted                                            \n");
    403403                        _printf0_("                                                                         \n");
    404                         _printf0_("   * Last record found is : \n");
     404                        _printf0_("   * Last record found is :                                              \n");
    405405                        _printf0_("     the corresponding model field has probably been marshalled          \n");
    406406                        _printf0_("     incorrectly                                                         \n");
  • issm/trunk-jpl/src/c/shared/Exp/exp.h

    r21035 r24030  
    8080        /*open domain outline file for reading: */
    8181        if ((fid=fopen(domainname,"r"))==NULL){
    82                 _error_("could not find file \"" << domainname<<"\". Make sure that the file and path provided exist."); 
     82                _error_("could not find file \"" << domainname<<"\". Make sure that the file and path provided exist.");
    8383        }
    8484
Note: See TracChangeset for help on using the changeset viewer.