Changeset 24935


Ignore:
Timestamp:
05/30/20 22:18:26 (5 years ago)
Author:
Eric.Larour
Message:

CHG: added DoubleInput2 class. Added Area computation in the sealevelrise_core_geometry,
and fixed a huge performance hog where we were querying IsIceOnlyOnElement and IsOceanInElement
nel * numberofvertices.

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

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/Makefile.am

    r24919 r24935  
    320320        ./classes/Inputs2/Inputs2.cpp \
    321321        ./classes/Inputs2/BoolInput2.cpp \
     322        ./classes/Inputs2/DoubleInput2.cpp \
    322323        ./classes/Inputs2/IntInput2.cpp \
    323324        ./classes/Inputs2/ElementInput2.cpp \
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r24889 r24935  
    11891189}/*}}}*/
    11901190void       Element::GetInput2Value(int* pvalue,int inputenum){/*{{{*/
     1191
     1192        this->inputs2->GetInputValue(pvalue,inputenum,this->lid);
     1193
     1194}/*}}}*/
     1195void       Element::GetInput2Value(IssmDouble* pvalue,int inputenum){/*{{{*/
    11911196
    11921197        this->inputs2->GetInputValue(pvalue,inputenum,this->lid);
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r24924 r24935  
    102102                void               GetInput2Value(bool* pvalue,int enum_type);
    103103                void               GetInput2Value(int* pvalue,int enum_type);
     104                void               GetInput2Value(IssmDouble* pvalue,int enum_type);
    104105                void               GetInputValue(IssmDouble* pvalue,Gauss* gauss,int enum_type);
    105106                Node*              GetNode(int nodeindex);
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r24926 r24935  
    55845584        bool computerigid = true;
    55855585
    5586         /*recover computational flags: */
    5587         this->parameters->FindParam(&computerigid,SealevelriseRigidEnum);
    5588         if(!computerigid) return; //we are running eustatic solution only.
    5589 
    55905586        /*how many dofs are we working with here? */
    55915587        this->parameters->FindParam(&gsize,MeshNumberofverticesEnum);
     
    56505646        /*Add in inputs:*/
    56515647    this->inputs2->SetArrayInput(SealevelriseIndicesEnum,this->lid,indices,gsize);
     5648
     5649        /*Another quantity, area:*/
     5650        this->inputs2->SetDoubleInput(AreaEnum,this->lid,GetAreaSpherical());
    56525651
    56535652        return;
     
    57415740        this->parameters->FindParam(&scaleoceanarea,SealevelriseOceanAreaScalingEnum);
    57425741
    5743         /*recover elastic green function:*/
     5742        /*recover precomputed green function kernels:*/
    57445743        DoubleVecParam* parameter = static_cast<DoubleVecParam*>(this->parameters->FindParamObject(SealevelriseGRigidEnum)); _assert_(parameter);
    57455744        parameter->GetParameterValueByPointer(&G_rigid_precomputed,&M);
     
    57565755        if(computerigid){this->inputs2->GetArrayPtr(SealevelriseIndicesEnum,this->lid,&indices,&dummy); _assert_(dummy==gsize);}
    57575756
    5758         /*Compute area of element. Scale it by grounded fraction if not fully grounded: */
    5759         area=GetAreaSpherical();
     5757        /*Get area of element: precomputed in the sealevelrise_core_geometry:*/
     5758        this->GetInput2Value(&area,AreaEnum);
     5759
    57605760        if(notfullygrounded){
    57615761                IssmDouble phi=0;
     
    59255925        /*}}}*/
    59265926
    5927         /*Compute area of element. For now, we dont do partially grounded elements:*/
    5928         area=GetAreaSpherical();
     5927        /*Get area of element: precomputed in the sealevelrise_core_geometry:*/
     5928        this->GetInput2Value(&area,AreaEnum);
    59295929
    59305930        /*Compute bottom pressure change: */
     
    60376037        S=0; for(int i=0;i<NUMVERTICES;i++) S+=Sg_old[this->vertices[i]->Sid()]/NUMVERTICES;
    60386038
    6039         /*Compute area of element:*/
    6040         area=GetAreaSpherical();
     6039        /*Get area of element: precomputed in the sealevelrise_core_geometry:*/
     6040        this->GetInput2Value(&area,AreaEnum);
    60416041
    60426042        /*recover rigid and elastic green functions:*/
     
    61406140        if(computerigid){this->inputs2->GetArrayPtr(SealevelriseIndicesEnum,this->lid,&indices,&dummy); _assert_(dummy==gsize);}
    61416141
    6142         /*compute area of element:*/
    6143         area=GetAreaSpherical();
     6142        /*Get area of element: precomputed in the sealevelrise_core_geometry:*/
     6143        this->GetInput2Value(&area,AreaEnum);
    61446144
    61456145        /*figure out gravity center of our element (Cartesian): */
     
    61846184        IssmDouble N_azim, E_azim;
    61856185
     6186        /*we are going to use the result of these masks a lot: */
     6187        bool isiceonlyinelement=IsIceOnlyInElement();
     6188        bool isoceaninelement=IsOceanInElement();
     6189
    61866190        for(int i=0;i<gsize;i++){
    61876191
     
    62156219
    62166220                /*Add all components to the pUp solution vectors:*/
    6217                 if(IsIceOnlyInElement()){
     6221                if(isiceonlyinelement){
    62186222                        Up[i]+=3*rho_ice/rho_earth*area/eartharea*I*U_elastic[i];
    62196223                        if(horiz){
     
    62226226                        }
    62236227                }
    6224                 else if(IsOceanInElement()) {
     6228                else if(isoceaninelement){
    62256229                        Up[i]+=3*rho_water/rho_earth*area/eartharea*S*U_elastic[i];
    62266230                        if(horiz){
  • issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp

    r24926 r24935  
    1515#include "./BoolInput2.h"
    1616#include "./IntInput2.h"
     17#include "./DoubleInput2.h"
    1718#include "./ElementInput2.h"
    1819#include "./SegInput2.h"
     
    518519        input->GetInput(pvalue,index);
    519520}/*}}}*/
     521void Inputs2::GetInputValue(IssmDouble* pvalue,int enum_in,int index){/*{{{*/
     522
     523        /*Get input id*/
     524        int id = EnumToIndex(enum_in);
     525
     526        /*Create it if necessary*/
     527        if(this->inputs[id]){
     528                if(this->inputs[id]->ObjectEnum()!=DoubleInput2Enum) _error_(EnumToStringx(this->inputs[id]->ObjectEnum())<<" cannot return a int");
     529        }
     530        else{
     531                int* temp = xNew<int>(3);
     532                _error_("Input "<<EnumToStringx(enum_in)<<" not found");
     533        }
     534
     535        /*Set input*/
     536        DoubleInput2* input = xDynamicCast<DoubleInput2*>(this->inputs[id]);
     537        input->GetInput(pvalue,index);
     538
     539}/*}}}*/
    520540void Inputs2::ResultInterpolation(int* pinterpolation,int* pnodesperelement,int* parray_size, int output_enum){/*{{{*/
    521541
     
    568588        input->SetInput(index,value);
    569589}/*}}}*/
     590void Inputs2::SetDoubleInput(int enum_in,int index,IssmDouble value){/*{{{*/
     591
     592        /*Get input id*/
     593        int id = EnumToIndex(enum_in);
     594
     595        /*Create it if necessary*/
     596        if(this->inputs[id]){
     597                if(this->inputs[id]->ObjectEnum()!=DoubleInput2Enum) _error_("cannot add a double to a "<<EnumToStringx(this->inputs[id]->ObjectEnum()));
     598        }
     599        else{
     600                this->inputs[id] = new DoubleInput2(this->numberofelements_local);
     601        }
     602
     603        /*Set input*/
     604        DoubleInput2* input = xDynamicCast<DoubleInput2*>(this->inputs[id]);
     605        input->SetInput(index,value);
     606}/*}}}*/
    570607void Inputs2::SetArrayInput(int enum_in,int row,IssmDouble* values,int numlayers){/*{{{*/
    571608
  • issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h

    r24926 r24935  
    6666                void  GetInputValue(bool* pvalue,int enum_in,int index);
    6767                void  GetInputValue(int*  pvalue,int enum_in,int index);
     68                void  GetInputValue(IssmDouble*  pvalue,int enum_in,int index);
    6869                void  ResultInterpolation(int* pinterpolation,int*nodesperelement,int* parray_size, int output_enum);
    6970                void  SetInput(int enum_in,int index,bool value);
    7071                void  SetInput(int enum_in,int index,int value);
     72                void  SetDoubleInput(int enum_in,int index,IssmDouble value);
    7173                void  SetTransientInput(int enum_in,IssmDouble* times,int numtimes);
    7274                TransientInput2* SetDatasetTransientInput(int enum_in,int id,IssmDouble* times,int numtimes);
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r24924 r24935  
    804804syn keyword cConstant SurfaceAbsMisfitEnum
    805805syn keyword cConstant SurfaceAbsVelMisfitEnum
     806syn keyword cConstant AreaEnum
    806807syn keyword cConstant SurfaceAreaEnum
    807808syn keyword cConstant SurfaceAverageVelMisfitEnum
     
    979980syn keyword cConstant BoolInput2Enum
    980981syn keyword cConstant IntInput2Enum
     982syn keyword cConstant DoubleInput2Enum
    981983syn keyword cConstant BoolParamEnum
    982984syn keyword cConstant BoundaryEnum
     
    13531355syn keyword cType Definition
    13541356syn keyword cType DependentObject
     1357syn keyword cType DoubleInput2
    13551358syn keyword cType DoubleMatArrayParam
    13561359syn keyword cType DoubleMatParam
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r24924 r24935  
    802802        SurfaceAbsMisfitEnum,
    803803        SurfaceAbsVelMisfitEnum,
     804        AreaEnum,
    804805        SurfaceAreaEnum,
    805806        SurfaceAverageVelMisfitEnum,
     
    979980        BoolInput2Enum,
    980981        IntInput2Enum,
     982        DoubleInput2Enum,
    981983        BoolParamEnum,
    982984        BoundaryEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r24924 r24935  
    806806                case SurfaceAbsMisfitEnum : return "SurfaceAbsMisfit";
    807807                case SurfaceAbsVelMisfitEnum : return "SurfaceAbsVelMisfit";
     808                case AreaEnum : return "Area";
    808809                case SurfaceAreaEnum : return "SurfaceArea";
    809810                case SurfaceAverageVelMisfitEnum : return "SurfaceAverageVelMisfit";
     
    981982                case BoolInput2Enum : return "BoolInput2";
    982983                case IntInput2Enum : return "IntInput2";
     984                case DoubleInput2Enum : return "DoubleInput2";
    983985                case BoolParamEnum : return "BoolParam";
    984986                case BoundaryEnum : return "Boundary";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r24924 r24935  
    824824              else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum;
    825825              else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
     826              else if (strcmp(name,"Area")==0) return AreaEnum;
    826827              else if (strcmp(name,"SurfaceArea")==0) return SurfaceAreaEnum;
    827828              else if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum;
     
    874875              else if (strcmp(name,"Outputdefinition12")==0) return Outputdefinition12Enum;
    875876              else if (strcmp(name,"Outputdefinition13")==0) return Outputdefinition13Enum;
    876               else if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
     880              if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum;
     881              else if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
    881882              else if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum;
    882883              else if (strcmp(name,"Outputdefinition17")==0) return Outputdefinition17Enum;
     
    997998              else if (strcmp(name,"BasalforcingsPico")==0) return BasalforcingsPicoEnum;
    998999              else if (strcmp(name,"BeckmannGoosseFloatingMeltRate")==0) return BeckmannGoosseFloatingMeltRateEnum;
    999               else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
     1003              if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
     1004              else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
    10041005              else if (strcmp(name,"BoolInput")==0) return BoolInputEnum;
    10051006              else if (strcmp(name,"BoolInput2")==0) return BoolInput2Enum;
    10061007              else if (strcmp(name,"IntInput2")==0) return IntInput2Enum;
     1008              else if (strcmp(name,"DoubleInput2")==0) return DoubleInput2Enum;
    10071009              else if (strcmp(name,"BoolParam")==0) return BoolParamEnum;
    10081010              else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
     
    11191121              else if (strcmp(name,"IceMass")==0) return IceMassEnum;
    11201122              else if (strcmp(name,"IceMassScaled")==0) return IceMassScaledEnum;
    1121               else if (strcmp(name,"IceVolumeAboveFloatation")==0) return IceVolumeAboveFloatationEnum;
    1122               else if (strcmp(name,"IceVolumeAboveFloatationScaled")==0) return IceVolumeAboveFloatationScaledEnum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"IceVolume")==0) return IceVolumeEnum;
     1126              if (strcmp(name,"IceVolumeAboveFloatation")==0) return IceVolumeAboveFloatationEnum;
     1127              else if (strcmp(name,"IceVolumeAboveFloatationScaled")==0) return IceVolumeAboveFloatationScaledEnum;
     1128              else if (strcmp(name,"IceVolume")==0) return IceVolumeEnum;
    11271129              else if (strcmp(name,"IceVolumeScaled")==0) return IceVolumeScaledEnum;
    11281130              else if (strcmp(name,"IcefrontMassFlux")==0) return IcefrontMassFluxEnum;
     
    12421244              else if (strcmp(name,"Penpair")==0) return PenpairEnum;
    12431245              else if (strcmp(name,"Penta")==0) return PentaEnum;
    1244               else if (strcmp(name,"PentaInput")==0) return PentaInputEnum;
    1245               else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"ProfilingCurrentFlops")==0) return ProfilingCurrentFlopsEnum;
     1249              if (strcmp(name,"PentaInput")==0) return PentaInputEnum;
     1250              else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
     1251              else if (strcmp(name,"ProfilingCurrentFlops")==0) return ProfilingCurrentFlopsEnum;
    12501252              else if (strcmp(name,"ProfilingCurrentMem")==0) return ProfilingCurrentMemEnum;
    12511253              else if (strcmp(name,"ProfilingSolutionTime")==0) return ProfilingSolutionTimeEnum;
Note: See TracChangeset for help on using the changeset viewer.