Changeset 26073


Ignore:
Timestamp:
03/11/21 10:05:44 (4 years ago)
Author:
Eric.Larour
Message:

CHG: fixed test2001 by modifying the mass transport core. Now create inputs
directly in the core, not the MassTransportAnalysis::InputUpdateFromSolution.
Also need a new IoModel::InputToConstant routine.

Location:
issm/trunk-jpl
Files:
14 edited

Legend:

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

    r26070 r26073  
    227227
    228228        /*Initialize sea level cumulated sea level loads :*/
    229         InputUpdateFromConstantx(inputs,elements,0.,AccumulatedDeltaIceThicknessEnum);
    230         InputUpdateFromConstantx(inputs,elements,0.,OldAccumulatedDeltaIceThicknessEnum);
     229        iomodel->ConstantToInput(inputs,elements,0,AccumulatedDeltaIceThicknessEnum,P1Enum);
     230        iomodel->ConstantToInput(inputs,elements,0,OldAccumulatedDeltaIceThicknessEnum,P1Enum);
    231231
    232232        /*for Ivins deformation model, initialize history of ice thickness changes:*/
     
    860860        newthickness  = xNew<IssmDouble>(numvertices);
    861861        IssmDouble* oldthickness      = xNew<IssmDouble>(numvertices);
    862         IssmDouble* cumdeltathickness = xNew<IssmDouble>(numvertices);
    863         IssmDouble* deltathickness = xNew<IssmDouble>(numvertices);
    864862        IssmDouble* newbase           = xNew<IssmDouble>(numvertices);
    865863        IssmDouble* bed               = xNew<IssmDouble>(numvertices);
     
    877875        basalelement->GetInputListOnVertices(&phi[0],MaskOceanLevelsetEnum);
    878876        basalelement->GetInputListOnVertices(&sealevel[0],SealevelEnum);
    879         if(isgrd)basalelement->GetInputListOnVertices(&cumdeltathickness[0],AccumulatedDeltaIceThicknessEnum);
    880877
    881878        /*Do we do grounding line migration?*/
     
    883880        element->FindParam(&isgroundingline,TransientIsgroundinglineEnum);
    884881        if(isgroundingline) basalelement->GetInputListOnVertices(&bed[0],BedEnum);
    885 
    886         /*What is the delta thickness forcing the sea-level change core: cumulated over time, hence the +=:*/
    887         if(isgrd){
    888                 for(int i=0;i<numvertices;i++){
    889                         cumdeltathickness[i] += (newthickness[i]-oldthickness[i]);
    890                 }
    891         }
    892882
    893883        /*Find MasstransportHydrostaticAdjustment to figure out how to update the geometry:*/
     
    924914        element->AddBasalInput(SurfaceEnum,newsurface,P1Enum);
    925915        element->AddBasalInput(BaseEnum,newbase,P1Enum);
    926         if(isgrd){
    927                 int grdmodel;
    928 
    929                 /*accumulate ice thickness changes: */
    930                 element->AddBasalInput(AccumulatedDeltaIceThicknessEnum,cumdeltathickness,P1Enum);
    931 
    932                 /*for Ivins deformation model, keep history of ice thickness changes:*/
    933                 element->FindParam(&grdmodel,GrdModelEnum);
    934                 if(grdmodel==IvinsEnum){
    935                         int *vertexlids = NULL;
    936                         int *vertexsids= NULL;
    937                         IssmDouble time;
    938 
    939                         TransientInput* transientinput = basalelement->inputs->GetTransientInput(TransientAccumulatedDeltaIceThicknessEnum);
    940 
    941                         /*Get values and lid list and recover vertices ids needed to initialize inputs*/
    942                         vertexlids      = xNew<int>(numvertices);
    943                         vertexsids      = xNew<int>(numvertices);
    944                         element->FindParam(&time,TimeEnum);
    945                         element->GetVerticesLidList(&vertexlids[0]);
    946                         element->GetVerticesSidList(&vertexsids[0]);
    947 
    948                         /*Add the current time cumdeltathickness to the existing time series: */
    949                         switch(element->ObjectEnum()){
    950                                 case TriaEnum:  transientinput->AddTriaTimeInput( time,numvertices,vertexlids,cumdeltathickness,P1Enum); break;
    951                                 default: _error_("Not implemented yet");
    952                         }
    953                         xDelete<int>(vertexlids);
    954                         xDelete<int>(vertexsids);
    955                 }
    956                        
    957                 /*compute total ice thickness change between two sea-level solver time steps, ie. every frequency*dt:*/
    958                 if(count==frequency){
    959                         IssmDouble* oldcumdeltathickness = xNew<IssmDouble>(numvertices);
    960 
    961                         basalelement->GetInputListOnVertices(&oldcumdeltathickness[0],OldAccumulatedDeltaIceThicknessEnum);
    962                         element->AddBasalInput(OldAccumulatedDeltaIceThicknessEnum,cumdeltathickness,P1Enum);
    963                         for(int i=0;i<numvertices;i++)deltathickness[i]=cumdeltathickness[i]-oldcumdeltathickness[i];
    964                         element->AddBasalInput(DeltaIceThicknessEnum,deltathickness,P1Enum);
    965 
    966                         xDelete<IssmDouble>(oldcumdeltathickness);
    967                 }
    968 
    969         }
     916       
    970917
    971918        /*Free ressources:*/
    972919        xDelete<IssmDouble>(newthickness);
    973         xDelete<IssmDouble>(cumdeltathickness);
    974         xDelete<IssmDouble>(deltathickness);
    975920        xDelete<IssmDouble>(newbase);
    976921        xDelete<IssmDouble>(newsurface);
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r26058 r26073  
    17091709}
    17101710/*}}}*/
     1711void       Element::InputCreateP1FromConstant(Inputs* inputs,IoModel* iomodel,IssmDouble value_in,int vector_enum){/*{{{*/
     1712
     1713        const int NUM_VERTICES = this->GetNumberOfVertices();
     1714
     1715        int        vertexids[MAXVERTICES];
     1716        int        vertexlids[MAXVERTICES];
     1717        IssmDouble values[MAXVERTICES];
     1718
     1719        /*Recover vertices ids needed to initialize inputs*/
     1720        _assert_(iomodel->elements);
     1721        for(int i=0;i<NUM_VERTICES;i++){
     1722                vertexids[i] =reCast<int>(iomodel->elements[NUM_VERTICES*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
     1723                vertexlids[i]=iomodel->my_vertices_lids[vertexids[i]-1];
     1724        }
     1725
     1726        for(int i=0;i<NUM_VERTICES;i++) values[i]=value_in;
     1727        this->SetElementInput(inputs,NUM_VERTICES,vertexlids,values,vector_enum);
     1728
     1729}
     1730/*}}}*/
    17111731void       Element::ControlInputCreate(IssmDouble* vector,IssmDouble* min_vector,IssmDouble* max_vector,Inputs* inputs,IoModel* iomodel,int M,int N,IssmDouble scale,int input_enum,int id){/*{{{*/
    17121732
     
    19461966        /*update input*/
    19471967        this->SetElementInput(name,constant);
     1968}
     1969/*}}}*/
     1970void       Element::InputUpdateFromConstant(IssmDouble constant, int name, int type){/*{{{*/
     1971
     1972        /*Check that name is an element input*/
     1973        if(!IsInputEnum(name)) return;
     1974
     1975        /*update input*/
     1976        this->SetElementInput(name,constant,type);
    19481977}
    19491978/*}}}*/
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r26052 r26073  
    130130                int                Id();
    131131                void               InputCreate(IssmDouble* vector,Inputs* inputs,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
     132                void               InputCreateP1FromConstant(Inputs* inputs,IoModel* iomodel,IssmDouble value,int vector_enum);
    132133                void               ControlInputCreate(IssmDouble* doublearray,IssmDouble* independents_min,IssmDouble* independents_max,Inputs*inputs,IoModel* iomodel,int M,int N,IssmDouble scale,int input_enum,int id);
    133134                void                                     DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs* inputs,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code,int input_enum);
     
    135136                void               InputUpdateFromConstant(int constant, int name);
    136137                void               InputUpdateFromConstant(bool constant, int name);
     138                void               InputUpdateFromConstant(IssmDouble constant, int name, int type);
    137139
    138140                bool               IsFloating();
     
    331333                virtual void       ResetHooks()=0;
    332334                virtual void       RignotMeltParameterization(void){_error_("not implemented yet");};
    333                 virtual void       SetElementInput(int enum_in,IssmDouble values){_error_("not implemented yet");};
     335                virtual void       SetElementInput(int enum_in,IssmDouble value){_error_("not implemented yet");};
     336                virtual void       SetElementInput(int enum_in,IssmDouble value, int type)=0;
    334337                virtual void       SetElementInput(Inputs* inputs,int enum_in,IssmDouble values){_error_("not implemented yet");};
    335338                virtual void       SetElementInput(Inputs* inputs,int numindices,int* indices,IssmDouble* values,int enum_in){_error_("not implemented yet");};
  • issm/trunk-jpl/src/c/classes/Elements/Penta.h

    r26052 r26073  
    165165                void           ResetHooks();
    166166                void                            RignotMeltParameterization();
    167                 void           SetElementInput(int enum_in,IssmDouble values);
    168                 void           SetElementInput(Inputs* inputs,int enum_in,IssmDouble values);
     167                void           SetElementInput(int enum_in,IssmDouble value);
     168                void           SetElementInput(int enum_in,IssmDouble value,int type){_error_("not implemented yet");};
     169                void           SetElementInput(Inputs* inputs,int enum_in,IssmDouble value);
     170                void           SetElementInput(Inputs* inputs,int enum_in,IssmDouble value,int type){_error_("not implemented yet");};
    169171                void           SetElementInput(Inputs* inputs,int numindices,int* indices,IssmDouble* values,int enum_in);
    170172                void           SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset, int M,int N);
  • issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r26052 r26073  
    139139           Element*    SpawnBasalElement(bool depthaverage_materials){_error_("not implemented yet");};
    140140                Element*    SpawnTopElement(void){_error_("not implemented yet");};
     141                void       SetElementInput(int enum_in,IssmDouble value, int type){_error_("not implemented yet");};
    141142                IssmDouble  StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){_error_("not implemented yet");};
    142143                void        StabilizationParameterAnisotropic(IssmDouble* tau_parameter_anisotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy,  IssmDouble hz, IssmDouble kappa){_error_("not implemented yet");};
  • issm/trunk-jpl/src/c/classes/Elements/Tetra.h

    r26052 r26073  
    143143                void        SetCurrentConfiguration(Elements* elements,Loads* loads,Nodes* nodes,Materials* materials,Parameters* parameters);
    144144                void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
     145                void        SetElementInput(Inputs* inputs,int enum_in,IssmDouble value,int type){_error_("not implemented yet");};
     146                void        SetElementInput(int enum_in, IssmDouble value, int type){_error_("not implemented yet");};
    145147           Element*    SpawnBasalElement(bool depthaverage_materials);
    146148                Element*    SpawnTopElement(void);
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r26069 r26073  
    41774177        inputs->SetTriaInput(enum_in,P0Enum,this->lid,value);
    41784178
     4179}
     4180/*}}}*/
     4181void       Tria::SetElementInput(int enum_in,IssmDouble value,int type){/*{{{*/
     4182
     4183        if(type==P0Enum){
     4184                this->inputs->SetTriaInput(enum_in,P0Enum,this->lid,value);
     4185        }
     4186        else if(type==P1Enum){
     4187                IssmDouble values[3];
     4188                for(int i=0;i<3;i++)values[i]=value;
     4189                int lidlist[3];
     4190                this->GetVerticesLidList(&lidlist[0]);
     4191                this->inputs->SetTriaInput(enum_in,P1Enum,3,&lidlist[0],&values[0]);
     4192        }
     4193        else _error_("interpolation type not supported yet");
    41794194}
    41804195/*}}}*/
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r26052 r26073  
    126126                void        ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments);
    127127                void        RignotMeltParameterization();
    128                 void        SetElementInput(int enum_in,IssmDouble values);
    129                 void        SetElementInput(Inputs* inputs,int enum_in,IssmDouble values);
     128                void        SetElementInput(int enum_in,IssmDouble value);
     129                void        SetElementInput(int enum_in,IssmDouble value,int type);
     130                void        SetElementInput(Inputs* inputs,int enum_in,IssmDouble value);
    130131                void        SetElementInput(Inputs* inputs,int numindices,int* indices,IssmDouble* values,int enum_in);
    131132                void        SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index,int offset,int M,int N);
  • issm/trunk-jpl/src/c/classes/IoModel.cpp

    r26047 r26073  
    447447
    448448        return NULL;
     449}
     450/*}}}*/
     451void  IoModel::ConstantToInput(Inputs* inputs,Elements* elements,IssmDouble value, int vector_enum,int type){/*{{{*/
     452
     453        if (type==P1Enum){
     454                for(Object* & object : elements->objects){
     455                        Element* element=xDynamicCast<Element*>(object);
     456                        element->InputCreateP1FromConstant(inputs,this,value,vector_enum);
     457                }
     458        }
     459        else _error_("not supported yet!");
     460        return;
    449461}
    450462/*}}}*/
  • issm/trunk-jpl/src/c/classes/IoModel.h

    r25425 r26073  
    123123                void        CheckFile(void);
    124124                Param      *CopyConstantObject(const char* constant_name,int param_enum);
     125                void        ConstantToInput(Inputs* inputs,Elements* elements,IssmDouble value, int vector_enum,int type);
    125126                IssmDouble *Data(const char* data_name);
    126127                void        DeclareIndependents(bool trace,IssmPDouble* X);
  • issm/trunk-jpl/src/c/cores/masstransport_core.cpp

    r26047 r26073  
    99#include "../modules/modules.h"
    1010#include "../solutionsequences/solutionsequences.h"
     11#include "../classes/Inputs/TransientInput.h"
     12void SolidEarthUpdates(FemModel* femmodel);
    1113
    12 void masstransport_core(FemModel* femmodel){
     14void masstransport_core(FemModel* femmodel){ /*{{{*/
    1315
    1416        /*Start profiler*/
     
    7577                        //}
    7678                }
     79                SolidEarthUpdates(femmodel);
     80               
    7781                femmodel->parameters->SetParam(ThicknessEnum,InputToExtrudeEnum);
    7882                extrudefrombase_core(femmodel);
     
    8185                femmodel->parameters->SetParam(SurfaceEnum,InputToExtrudeEnum);
    8286                extrudefrombase_core(femmodel);
     87               
    8388        }
    8489
     
    9499        /*profiler*/
    95100        femmodel->profiler->Stop(MASSTRANSPORTCORE);
    96 }
     101} /*}}}*/
     102void SolidEarthUpdates(FemModel* femmodel){ /*{{{*/
     103
     104        int isgrd;
     105        int grdmodel;
     106        IssmDouble time;
     107        int frequency,count;
     108
     109        /*retrieve parameters:*/
     110        femmodel->parameters->FindParam(&isgrd,SolidearthSettingsGRDEnum);
     111        femmodel->parameters->FindParam(&grdmodel,GrdModelEnum);
     112        femmodel->parameters->FindParam(&time,TimeEnum);
     113        femmodel->parameters->FindParam(&frequency,SolidearthSettingsRunFrequencyEnum);
     114        femmodel->parameters->FindParam(&count,SealevelchangeRunCountEnum);
     115       
     116        /*early return?:*/
     117        if(!isgrd)return;
     118
     119        /*From old and new thickness, create delta thickness  and accumulate:*/
     120        femmodel->inputs->AXPY(-1, ThicknessOldEnum,ThicknessEnum,DeltaIceThicknessEnum);
     121        femmodel->inputs->AXPY(+1, DeltaIceThicknessEnum,AccumulatedDeltaIceThicknessEnum,DummyEnum);
     122        femmodel->inputs->DuplicateInput(DummyEnum,AccumulatedDeltaIceThicknessEnum);
     123
     124        /*for Ivins deformation model, keep history of ice thickness changes inside TransientAccumulatedDeltaIceThicknessEnum:*/
     125        if(grdmodel==IvinsEnum){
     126
     127                TransientInput* transientinput = femmodel->inputs->GetTransientInput(TransientAccumulatedDeltaIceThicknessEnum);
     128
     129                for(Object* & object : femmodel->elements->objects){
     130                        int *vertexlids = NULL;
     131                        int *vertexsids= NULL;
     132                        Element*   element=xDynamicCast<Element*>(object);
     133                        const int numvertices = element->GetNumberOfVertices();
     134                        IssmDouble* cumdeltathickness=NULL;
     135
     136                        /*Get values and lid list and recover vertices ids needed to initialize inputs*/
     137                        vertexlids      = xNew<int>(numvertices);
     138                        vertexsids      = xNew<int>(numvertices);
     139                        cumdeltathickness=xNew<IssmDouble>(numvertices);
     140                        element->GetVerticesLidList(&vertexlids[0]);
     141                        element->GetVerticesSidList(&vertexsids[0]);
     142                        element->GetInputListOnVertices(&cumdeltathickness[0],AccumulatedDeltaIceThicknessEnum);
     143
     144                        /*Add the current time cumdeltathickness to the existing time series: */
     145                        switch(element->ObjectEnum()){
     146                                case TriaEnum:  transientinput->AddTriaTimeInput( time,numvertices,vertexlids,cumdeltathickness,P1Enum); break;
     147                                default: _error_("Not implemented yet");
     148                        }
     149                        xDelete<int>(vertexlids);
     150                        xDelete<int>(vertexsids);
     151                        xDelete<IssmDouble>(cumdeltathickness);
     152                }
     153        }       
     154
     155        /*compute total ice thickness change between two sea-level solver time steps, ie. every frequency*dt:*/
     156        if(count==frequency){
     157                femmodel->inputs->AXPY(-1, OldAccumulatedDeltaIceThicknessEnum,AccumulatedDeltaIceThicknessEnum,DeltaIceThicknessEnum);
     158                femmodel->inputs->DuplicateInput(AccumulatedDeltaIceThicknessEnum,OldAccumulatedDeltaIceThicknessEnum);
     159        }
     160        return;
     161}/*}}}*/
  • issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp

    r25539 r26073  
    2727        }
    2828}
     29
     30
     31
    2932void InputUpdateFromConstantx(FemModel* femmodel,IssmDouble constant, int name){
    3033
     
    6063        }
    6164}
     65
     66void InputUpdateFromConstantx(Inputs* inputs,Elements* elements,IssmDouble constant, int name,int type){
     67
     68        if(type==P0Enum) InputUpdateFromConstantx(inputs, elements, constant,name);
     69        else if(type==P1Enum){
     70
     71                if(VerboseModule()) _printf0_("   Input updates from constant (P1 version)\n");
     72
     73                /*Elements and loads drive the update: */
     74                if(IsInputEnum(name)){
     75                        for(Object* & object : elements->objects){
     76                                Element* element = xDynamicCast<Element*>(object);
     77                                element->InputUpdateFromConstant(constant,name,P1Enum);
     78                        }
     79                }
     80                else{
     81                        _error_("not supported yet");
     82                }
     83        }
     84        else _error_("InputUpdateFromConstantx error message: type not supported yet!");
     85
     86       
     87}
    6288void InputUpdateFromConstantx(Inputs* inputs,Elements* elements,bool constant, int name){
    6389
  • issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h

    r25379 r26073  
    1717#endif
    1818void InputUpdateFromConstantx(Inputs* inputs,Elements* elements,IssmDouble constant,int name);
     19void InputUpdateFromConstantx(Inputs* inputs,Elements* elements,IssmDouble constant,int name, int type);
    1920void InputUpdateFromConstantx(Inputs* inputs,Elements* elements,bool       constant,int name);
    2021
  • issm/trunk-jpl/test/NightlyRun/test2001.m

    r26059 r26073  
    77%GIA Ivins, 2 layer model.
    88md.solidearth.settings.grdmodel=2;
     9md.solidearth.settings.isgrd=1;
    910
    1011md.materials=materials('litho','ice');
     
    2223md.timestepping.start_time=-2400000; %4,800 kyr :: EVALUATION TIME
    2324md.timestepping.time_step= 2400000; %2,400 kyr :: EVALUATION TIME
    24 % to get rid of default final_time, make sure final_time > start_time
    25 md.timestepping.final_time=2400000; %2,400 kyr
     25% to get rid of default final_time: make sure final_time>start_time
     26md.timestepping.final_time=2400000; %2,500 kyr
    2627md.masstransport.spcthickness=[...
    2728        [md.geometry.thickness; 0],...
     
    4950
    5051%Fields and tolerances to track changes
    51 field_names     ={'UGrd'};
    52 field_tolerances={1e-13};
     52field_names     ={'UGia','UGiaRate'};
     53field_tolerances={1e-13,1e-13};
    5354field_values={...
    54         (md.results.TransientSolution(1).SealevelUGrd)
     55        (md.results.TransientSolution(2).SealevelUGrd),
     56        (md.results.TransientSolution(2).SealevelUGrd)
    5557        };
Note: See TracChangeset for help on using the changeset viewer.