Ignore:
Timestamp:
09/14/22 12:59:00 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: preparing ground for GlaDS bigger domain

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp

    r26325 r27282  
    1010#include "../modules.h"
    1111
    12 void SetActiveNodesLSMx(FemModel* femmodel){/*{{{*/
     12void SetActiveNodesLSMx(FemModel* femmodel,bool ishydrology){/*{{{*/
    1313        /* activate/deactivate nodes for levelset method according to IceMaskNodeActivation */
    1414
    15         /* find parameters */
    16         int domaintype;
    17         femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);
     15        /*Determine which node activation mask to pull from*/
     16        int nodeactivationmask = IceMaskNodeActivationEnum;
     17        if(ishydrology) nodeactivationmask = HydrologyMaskNodeActivationEnum;
     18
    1819
    1920        for(Object* & object : femmodel->elements->objects){
     
    2829                        case TaylorHoodEnum:case XTaylorHoodEnum:case LATaylorHoodEnum:
    2930                        case CrouzeixRaviartEnum:case LACrouzeixRaviartEnum:case OneLayerP4zEnum:{
    30                                 Input* input=element->GetInput(IceMaskNodeActivationEnum);
    31                                 if(!input) _error_("Input " << EnumToStringx(IceMaskNodeActivationEnum) << " not found in element");
     31                                Input* input=element->GetInput(nodeactivationmask);
     32                                if(!input) _error_("Input " << EnumToStringx(nodeactivationmask) << " not found in element");
    3233
    3334                                /* Start looping on the number of vertices: */
     
    4546                        }
    4647                        default:
    47                                 element->GetInputListOnNodes(&mask[0],IceMaskNodeActivationEnum);
     48                                element->GetInputListOnNodes(&mask[0],nodeactivationmask);
    4849                                break;
    4950                }
     
    5859}/*}}}*/
    5960
    60 void GetMaskOfIceVerticesLSMx0(FemModel* femmodel){/*{{{*/
     61void GetMaskOfIceVerticesLSMx0(FemModel* femmodel,bool ishydrology){/*{{{*/
     62
     63        /*Determine which node activation to construct*/
     64        int nodeactivationmask = IceMaskNodeActivationEnum;
     65        if(ishydrology) nodeactivationmask = HydrologyMaskNodeActivationEnum;
    6166
    6267        /*Initialize vector with number of vertices*/
     
    6873
    6974        /*Fill vector with values: */
    70         for(Object* & object : femmodel->elements->objects){
    71                 Element* element=xDynamicCast<Element*>(object);
    72                 if(element->IsIceInElement()){
    73                         int nbv = element->GetNumberOfVertices();
    74                         for(int iv=0;iv<nbv;iv++){
    75                                 vec_mask_ice->SetValue(element->vertices[iv]->Pid(),1.,INS_VAL);
     75        if(ishydrology){
     76                for(Object* & object : femmodel->elements->objects){
     77                        Element* element=xDynamicCast<Element*>(object);
     78                        if(element->IsIceInElement()){
     79                                int nbv = element->GetNumberOfVertices();
     80                                for(int iv=0;iv<nbv;iv++){
     81                                        vec_mask_ice->SetValue(element->vertices[iv]->Pid(),1.,INS_VAL);
     82                                }
     83                        }
     84                }
     85        }
     86        else{
     87                for(Object* & object : femmodel->elements->objects){
     88                        Element* element=xDynamicCast<Element*>(object);
     89                        if(element->IsIceInElement() && element->IsGrounded()){
     90                                int nbv = element->GetNumberOfVertices();
     91                                for(int iv=0;iv<nbv;iv++){
     92                                        vec_mask_ice->SetValue(element->vertices[iv]->Pid(),1.,INS_VAL);
     93                                }
    7694                        }
    7795                }
     
    8098        /*Assemble vector and serialize */
    8199        vec_mask_ice->Assemble();
    82         InputUpdateFromVectorx(femmodel,vec_mask_ice,IceMaskNodeActivationEnum,VertexPIdEnum);
     100        InputUpdateFromVectorx(femmodel,vec_mask_ice,nodeactivationmask,VertexPIdEnum);
    83101        delete vec_mask_ice;
    84102}/*}}}*/
    85 void GetMaskOfIceVerticesLSMx(FemModel* femmodel){/*{{{*/
     103void GetMaskOfIceVerticesLSMx(FemModel* femmodel,bool ishydrology){/*{{{*/
    86104
    87         femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum);
     105        /*Set configuration to levelset*/
     106        if(ishydrology){
     107                /*We may not be running with ismovingfront so we can't assume LevelsetAnalysis is active*/
     108                femmodel->SetCurrentConfiguration(HydrologyGlaDSAnalysisEnum);
     109        }
     110        else{
     111                femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum);
     112        }
     113
     114        /*Determine which node activation to construct*/
     115        int nodeactivationmask = IceMaskNodeActivationEnum;
     116        if(ishydrology) nodeactivationmask = HydrologyMaskNodeActivationEnum;
    88117
    89118        /*Create vector on gset*/
     
    97126                Element* element=xDynamicCast<Element*>(object);
    98127
    99                 if(element->IsIceInElement()){
    100                         int numnodes = element->GetNumberOfNodes();
    101                         int  gsize_local=GetNumberOfDofs(element->nodes,numnodes,GsetEnum,NoneEnum);
    102                         int* glist_local=GetGlobalDofList(element->nodes,numnodes,GsetEnum,NoneEnum);
    103                         IssmDouble* ones = xNew<IssmDouble>(gsize_local);
    104                         for(int n=0;n<gsize_local;n++) ones[n] = 1.;
    105                         vec_mask_ice->SetValues(gsize_local,glist_local,ones,INS_VAL);
    106                         xDelete<IssmDouble>(ones);
    107                         xDelete<int>(glist_local);
     128                if(ishydrology){
     129                        if(element->IsIceInElement() && element->IsGrounded()){
     130                                int numnodes = element->GetNumberOfNodes();
     131                                int  gsize_local=GetNumberOfDofs(element->nodes,numnodes,GsetEnum,NoneEnum);
     132                                int* glist_local=GetGlobalDofList(element->nodes,numnodes,GsetEnum,NoneEnum);
     133                                IssmDouble* ones = xNew<IssmDouble>(gsize_local);
     134                                for(int n=0;n<gsize_local;n++) ones[n] = 1.;
     135                                vec_mask_ice->SetValues(gsize_local,glist_local,ones,INS_VAL);
     136                                xDelete<IssmDouble>(ones);
     137                                xDelete<int>(glist_local);
     138                        }
     139                }
     140                else{
     141                        if(element->IsIceInElement()){
     142                                int numnodes = element->GetNumberOfNodes();
     143                                int  gsize_local=GetNumberOfDofs(element->nodes,numnodes,GsetEnum,NoneEnum);
     144                                int* glist_local=GetGlobalDofList(element->nodes,numnodes,GsetEnum,NoneEnum);
     145                                IssmDouble* ones = xNew<IssmDouble>(gsize_local);
     146                                for(int n=0;n<gsize_local;n++) ones[n] = 1.;
     147                                vec_mask_ice->SetValues(gsize_local,glist_local,ones,INS_VAL);
     148                                xDelete<IssmDouble>(ones);
     149                                xDelete<int>(glist_local);
     150                        }
    108151                }
    109152        }
     
    120163        for(Object* & object : femmodel->elements->objects){
    121164                Element* element=xDynamicCast<Element*>(object);
    122                 element->InputUpdateFromSolutionOneDof(local_ug,IceMaskNodeActivationEnum);
     165                element->InputUpdateFromSolutionOneDof(local_ug,nodeactivationmask);
    123166        }
    124167
Note: See TracChangeset for help on using the changeset viewer.