Changeset 27282


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

CHG: preparing ground for GlaDS bigger domain

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

Legend:

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

    r26796 r27282  
    233233}/*}}}*/
    234234ElementMatrix* HydrologyGlaDSAnalysis::CreateKMatrix(Element* element){/*{{{*/
     235
     236        /*Skip if water or ice shelf element*/
     237        if(element->IsAllFloating() || !element->IsIceInElement()) return NULL;
    235238
    236239        /*Intermediaries */
     
    332335
    333336        /*Skip if water or ice shelf element*/
    334         if(element->IsAllFloating()) return NULL;
     337        if(element->IsAllFloating() || !element->IsIceInElement()) return NULL;
    335338
    336339        /*Intermediaries */
     
    443446}/*}}}*/
    444447void           HydrologyGlaDSAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
    445         SetActiveNodesLSMx(femmodel);
     448
     449        /*Update active elements based on ice levelset and ocean levelset*/
     450        GetMaskOfIceVerticesLSMx(femmodel,true);
     451        SetActiveNodesLSMx(femmodel,true);
     452
     453        IssmDouble rho_ice   = femmodel->parameters->FindParam(MaterialsRhoIceEnum);
     454        IssmDouble rho_water = femmodel->parameters->FindParam(MaterialsRhoFreshwaterEnum);
     455        IssmDouble g         = femmodel->parameters->FindParam(ConstantsGEnum);
     456
     457        /*Constrain all nodes that are grounded and unconstrain the ones that float*/
     458        for(Object* & object : femmodel->elements->objects){
     459                Element    *element  = xDynamicCast<Element*>(object);
     460                int         numnodes  = element->GetNumberOfNodes();
     461                IssmDouble *mask      = xNew<IssmDouble>(numnodes);
     462                IssmDouble *bed       = xNew<IssmDouble>(numnodes);
     463                IssmDouble *thickness = xNew<IssmDouble>(numnodes);
     464                IssmDouble *ls_active = xNew<IssmDouble>(numnodes);
     465
     466                element->GetInputListOnNodes(&mask[0],MaskOceanLevelsetEnum);
     467                element->GetInputListOnNodes(&bed[0],BaseEnum);
     468                element->GetInputListOnNodes(&thickness[0],BaseEnum);
     469                element->GetInputListOnNodes(&ls_active[0],HydrologyMaskNodeActivationEnum);
     470
     471                for(int in=0;in<numnodes;in++){
     472                        Node* node=element->GetNode(in);
     473                        if(mask[in]>0. && ls_active[in]==1.){
     474                                node->Activate(); //Not sure if we need this!
     475                        }
     476                        else{
     477                                IssmDouble phi =  rho_ice*g*thickness[in] + rho_water*g*bed[in]; //FIXME this is correct!
     478                                node->Deactivate();// Not sure if we need this
     479                                node->ApplyConstraint(0,phi);
     480                        }
     481                }
     482                xDelete<IssmDouble>(mask);
     483                xDelete<IssmDouble>(bed);
     484                xDelete<IssmDouble>(thickness);
     485                xDelete<IssmDouble>(ls_active);
     486        }
     487
     488        return;
    446489}/*}}}*/
    447490
     
    471514void HydrologyGlaDSAnalysis::UpdateSheetThickness(Element* element){/*{{{*/
    472515
    473         /*Skip if water or ice shelf element*/
    474         //if(element->IsAllFloating()) return;
    475 
    476516        /*Intermediaries */
    477517        IssmDouble  Jdet,vx,vy,ub,h_old,N,h_r,H,b;
     
    484524        /*Initialize new sheet thickness*/
    485525        IssmDouble* h_new = xNew<IssmDouble>(numvertices);
     526
     527        /*Set to 0 if inactive element*/
     528        if(element->IsAllFloating() || !element->IsIceInElement()){
     529                for(int iv=0;iv<numvertices;iv++) h_new[iv] = 0.;
     530                element->AddInput(HydrologySheetThicknessEnum,h_new,P1Enum);
     531                xDelete<IssmDouble>(h_new);
     532                return;
     533        }
    486534
    487535        /*Retrieve all inputs and parameters*/
     
    545593       
    546594        /*Force floating ice to have zero sheet thickness*/
    547         if(element->IsAllFloating()){
     595        if(element->IsAllFloating() || !element->IsIceInElement()){
    548596                for(int iv=0;iv<numvertices;iv++) h_new[iv] = 0.;
    549597        }
     
    564612}/*}}}*/
    565613void HydrologyGlaDSAnalysis::UpdateEffectivePressure(Element* element){/*{{{*/
    566 
    567         /*Skip if water or ice shelf element*/
    568         //if(element->IsAllFloating()) return;
    569614
    570615        /*Intermediary*/
     
    583628        Input* phi_input = element->GetInput(HydraulicPotentialEnum); _assert_(phi_input);
    584629
     630        /*Set to 0 if inactive element*/
     631        if(element->IsAllFloating() || !element->IsIceInElement()){
     632                for(int iv=0;iv<numnodes;iv++) N[iv] = 0.;
     633                element->AddInput(EffectivePressureEnum,N,P1Enum);
     634                xDelete<IssmDouble>(N);
     635                return;
     636        }
     637
    585638        /* Start  looping on the number of gaussian points: */
    586639        Gauss* gauss=element->NewGauss();
     
    607660                if(xIsNan<IssmDouble>(N[iv])) _error_("NaN found in solution vector");
    608661                if(xIsInf<IssmDouble>(N[iv])) _error_("Inf found in solution vector");
    609         }
    610 
    611    /*Force floating ice to have zero effective pressure*/
    612    if(element->IsAllFloating()){
    613                 for(int iv=0;iv<numnodes;iv++) N[iv] = 0.;
    614662        }
    615663
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r27278 r27282  
    23662366}/*}}}*/
    23672367bool       Element::IsGrounded(){/*{{{*/
     2368        /*At least ONE node is grounded (partially grounded returns true)*/
    23682369
    23692370        Input* input=this->GetInput(MaskOceanLevelsetEnum); _assert_(input);
  • TabularUnified issm/trunk-jpl/src/c/classes/Loads/Channel.cpp

    r26772 r27282  
    603603        /*Initialize Element matrix and return if necessary*/
    604604        Tria*  tria=(Tria*)element;
    605         if(!tria->IsIceInElement() || tria->IsAllFloating() || this->boundary){
     605        if(this->boundary){
    606606                this->S = 0.;
    607607                return;
    608608        }
    609609        _assert_(tria->FiniteElement()==P1Enum);
     610
     611        /*Evaluate all fields on center of edge*/
    610612        int index1=tria->GetVertexIndex(vertices[0]);
    611613        int index2=tria->GetVertexIndex(vertices[1]);
     614        GaussTria* gauss=new GaussTria();
     615        gauss->GaussEdgeCenter(index1,index2);
     616
     617        /*Set to 0 if inactive*/
     618        IssmDouble active;
     619        Input* active_input = element->GetInput(HydrologyMaskNodeActivationEnum); _assert_(active_input);
     620        active_input->GetInputValue(&active,gauss);
     621        if(active!=1.){
     622                this->S = 0.;
     623                delete gauss;
     624                return;
     625        }
    612626
    613627        /*Intermediaries */
     
    644658        tx = tx/Lt;
    645659        ty = ty/Lt;
    646 
    647         /*Evaluate fields on center of edge*/
    648         GaussTria* gauss=new GaussTria();
    649         gauss->GaussEdgeCenter(index1,index2);
    650660
    651661        /*Get input values at gauss points*/
  • TabularUnified 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
  • TabularUnified issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.h

    r23173 r27282  
    88#include "../../classes/classes.h"
    99
    10 void SetActiveNodesLSMx(FemModel* femmodel);
    11 void GetMaskOfIceVerticesLSMx0(FemModel* femmodel);
    12 void GetMaskOfIceVerticesLSMx(FemModel* femmodel);
     10void SetActiveNodesLSMx(FemModel* femmodel,bool ishydrology=false);
     11void GetMaskOfIceVerticesLSMx0(FemModel* femmodel,bool ishydrology=false);
     12void GetMaskOfIceVerticesLSMx(FemModel* femmodel,bool ishydrology=false);
    1313#endif  /* _SETACTIVENODESLSMX_H*/
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r27278 r27282  
    820820syn keyword cConstant HydrologyWaterVxEnum
    821821syn keyword cConstant HydrologyWaterVyEnum
     822syn keyword cConstant HydrologyMaskNodeActivationEnum
    822823syn keyword cConstant IceEnum
    823824syn keyword cConstant IceMaskNodeActivationEnum
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r27278 r27282  
    816816        HydrologyWaterVxEnum,
    817817        HydrologyWaterVyEnum,
     818        HydrologyMaskNodeActivationEnum,
    818819        IceEnum,
    819820        IceMaskNodeActivationEnum,
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r27278 r27282  
    822822                case HydrologyWaterVxEnum : return "HydrologyWaterVx";
    823823                case HydrologyWaterVyEnum : return "HydrologyWaterVy";
     824                case HydrologyMaskNodeActivationEnum : return "HydrologyMaskNodeActivation";
    824825                case IceEnum : return "Ice";
    825826                case IceMaskNodeActivationEnum : return "IceMaskNodeActivation";
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim

    r27278 r27282  
    813813syn keyword juliaConstC HydrologyWaterVxEnum
    814814syn keyword juliaConstC HydrologyWaterVyEnum
     815syn keyword juliaConstC HydrologyMaskNodeActivationEnum
    815816syn keyword juliaConstC IceEnum
    816817syn keyword juliaConstC IceMaskNodeActivationEnum
  • TabularUnified issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r27278 r27282  
    840840              else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum;
    841841              else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
     842              else if (strcmp(name,"HydrologyMaskNodeActivation")==0) return HydrologyMaskNodeActivationEnum;
    842843              else if (strcmp(name,"Ice")==0) return IceEnum;
    843844              else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
     
    874875              else if (strcmp(name,"Misfit")==0) return MisfitEnum;
    875876              else if (strcmp(name,"MovingFrontalVx")==0) return MovingFrontalVxEnum;
    876               else if (strcmp(name,"MovingFrontalVy")==0) return MovingFrontalVyEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
     880              if (strcmp(name,"MovingFrontalVy")==0) return MovingFrontalVyEnum;
     881              else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
    881882              else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
    882883              else if (strcmp(name,"Node")==0) return NodeEnum;
     
    997998              else if (strcmp(name,"SmbCciceValue")==0) return SmbCciceValueEnum;
    998999              else if (strcmp(name,"SmbCotValue")==0) return SmbCotValueEnum;
    999               else if (strcmp(name,"SmbD")==0) return SmbDEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"SmbDailyairdensity")==0) return SmbDailyairdensityEnum;
     1003              if (strcmp(name,"SmbD")==0) return SmbDEnum;
     1004              else if (strcmp(name,"SmbDailyairdensity")==0) return SmbDailyairdensityEnum;
    10041005              else if (strcmp(name,"SmbDailyairhumidity")==0) return SmbDailyairhumidityEnum;
    10051006              else if (strcmp(name,"SmbDailydlradiation")==0) return SmbDailydlradiationEnum;
     
    11201121              else if (strcmp(name,"Surface")==0) return SurfaceEnum;
    11211122              else if (strcmp(name,"SurfaceOld")==0) return SurfaceOldEnum;
    1122               else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
     1126              if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
     1127              else if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
    11271128              else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
    11281129              else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum;
     
    12431244              else if (strcmp(name,"Outputdefinition69")==0) return Outputdefinition69Enum;
    12441245              else if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum;
    1245               else if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum;
     1249              if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum;
     1250              else if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum;
    12501251              else if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
    12511252              else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum;
     
    13661367              else if (strcmp(name,"ElementHook")==0) return ElementHookEnum;
    13671368              else if (strcmp(name,"ElementSId")==0) return ElementSIdEnum;
    1368               else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
    13691369         else stage=12;
    13701370   }
    13711371   if(stage==12){
    1372               if (strcmp(name,"EsaAnalysis")==0) return EsaAnalysisEnum;
     1372              if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
     1373              else if (strcmp(name,"EsaAnalysis")==0) return EsaAnalysisEnum;
    13731374              else if (strcmp(name,"EsaSolution")==0) return EsaSolutionEnum;
    13741375              else if (strcmp(name,"EsaTransitions")==0) return EsaTransitionsEnum;
     
    14891490              else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
    14901491              else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
    1491               else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
    14921492         else stage=13;
    14931493   }
    14941494   if(stage==13){
    1495               if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum;
     1495              if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
     1496              else if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum;
    14961497              else if (strcmp(name,"Matenhancedice")==0) return MatenhancediceEnum;
    14971498              else if (strcmp(name,"Materials")==0) return MaterialsEnum;
     
    16121613              else if (strcmp(name,"SoftMigration")==0) return SoftMigrationEnum;
    16131614              else if (strcmp(name,"SpatialLinearFloatingMeltRate")==0) return SpatialLinearFloatingMeltRateEnum;
    1614               else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
    16151615         else stage=14;
    16161616   }
    16171617   if(stage==14){
    1618               if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
     1618              if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
     1619              else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
    16191620              else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
    16201621              else if (strcmp(name,"Sset")==0) return SsetEnum;
Note: See TracChangeset for help on using the changeset viewer.