Changeset 23544


Ignore:
Timestamp:
12/13/18 06:13:08 (6 years ago)
Author:
bdef
Message:

CHG:change in the treatment of substep results in hydrology to improve memory usage

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

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r23532 r23544  
    48214821}
    48224822/*}}}*/
    4823 void FemModel::InitTransientOutputx(int* input_enum,int numoutputs){ /*{{{*/
     4823void FemModel::InitTransientOutputx(int* stackedinput_enum,int numoutputs){ /*{{{*/
    48244824
    48254825  for(int i=0;i<numoutputs;i++){
    4826                 if(input_enum[i]<0){
     4826                if(stackedinput_enum[i]<0){
    48274827                        _error_("Can't deal with non enum fields for result Stack");
    48284828                }
    48294829                else{
    48304830                        for(int j=0;j<elements->Size();j++){
    4831                                 TransientInput* transient_input = new TransientInput(input_enum[i]);
     4831                                TransientInput* transient_input = new TransientInput(stackedinput_enum[i]);
    48324832                                /*Intermediaries*/
    48334833                                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
     
    48504850                                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
    48514851                                TransientInput* stacking_input=NULL;
    4852                                 Input* input=element->inputs->GetInput(stackedinput_enum[i]); _assert_(input);
    4853                                 Input* input_to_stack=element->GetInput(input_enum[i]); _assert_(input_to_stack);
     4852                                Input* input=element->inputs->GetInput(stackedinput_enum[i]); _assert_(input); //this is the enum stack
    48544853                                stacking_input=dynamic_cast<TransientInput*>(input);
    48554854
    48564855                                int  numvertices = element->GetNumberOfVertices();
    48574856                                IssmDouble* N=xNew<IssmDouble>(numvertices);
    4858                                 element->GetInputListOnVertices(&N[0],input_enum[i]);
     4857                                element->GetInputListOnVertices(&N[0],input_enum[i]);   //this is the enum to stack
    48594858                                switch(element->ObjectEnum()){
    48604859                                case TriaEnum:
     
    48754874}
    48764875/*}}}*/
    4877 void FemModel::AverageTransientOutputx(int* input_enum,int* averagedinput_enum,IssmDouble init_time,int numoutputs){ /*{{{*/
     4876void FemModel::AverageTransientOutputx(int* stackedinput_enum,int* averagedinput_enum,IssmDouble init_time,int numoutputs){ /*{{{*/
    48784877
    48794878  for(int i=0;i<numoutputs;i++){
    4880                 if(input_enum[i]<0){
     4879                if(stackedinput_enum[i]<0){
    48814880                        _error_("Can't deal with non enum fields for result Stack");
    48824881                }
     
    48884887                                IssmDouble* time_averaged=NULL;
    48894888
    4890                                 Input* input=element->inputs->GetInput(input_enum[i]); _assert_(input);
     4889                                Input* input=element->inputs->GetInput(stackedinput_enum[i]); _assert_(input);
    48914890                                TransientInput* stacking_input=NULL;
    48924891                                stacking_input=dynamic_cast<TransientInput*>(input);
     
    48954894                                element->AddInput(averagedinput_enum[i],&time_averaged[0],P1Enum);
    48964895                                xDelete<IssmDouble>(time_averaged);
     4896                        }
     4897                }
     4898        }
     4899}
     4900/*}}}*/
     4901void FemModel::InitMeanOutputx(int* stackedinput_enum,int numoutputs){ /*{{{*/
     4902
     4903  for(int i=0;i<numoutputs;i++){
     4904                if(stackedinput_enum[i]<0){
     4905                        _error_("Can't deal with non enum fields for result Stack");
     4906                }
     4907                else{
     4908                        for(int j=0;j<elements->Size();j++){
     4909                                /*Intermediaries*/
     4910                                Element*   element            =xDynamicCast<Element*>(elements->GetObjectByOffset(j));
     4911                                int        numvertices        =element->GetNumberOfVertices();
     4912                                IssmDouble zeros[numvertices] ={0.0};
     4913                                switch(element->ObjectEnum()){
     4914                                case TriaEnum:
     4915                                        element->inputs->AddInput(new TriaInput(stackedinput_enum[i],&zeros[0],P1Enum));
     4916                                        break;
     4917                                case PentaEnum:
     4918                                        element->inputs->AddInput(new PentaInput(stackedinput_enum[i],&zeros[0],P1Enum));
     4919                                        break;
     4920                                case TetraEnum:
     4921                                        element->inputs->AddInput(new TetraInput(stackedinput_enum[i],&zeros[0],P1Enum));
     4922                                        break;
     4923                                default: _error_("Not implemented yet");
     4924                                }
     4925                        }
     4926                }
     4927        }
     4928}
     4929/*}}}*/
     4930void FemModel::SumOutputx(int* input_enum,int* stackedinput_enum,int numoutputs){ /*{{{*/
     4931
     4932        //First get sub-timestep
     4933        IssmDouble hydrodt;
     4934        this->parameters->FindParam(&hydrodt,HydrologydtEnum);
     4935
     4936  for(int i=0;i<numoutputs;i++){
     4937                if(input_enum[i]<0){
     4938                        _error_("Can't deal with non enum fields for result Stack");
     4939                }
     4940                else{
     4941                        for(int j=0;j<elements->Size();j++){
     4942                                /*Intermediaries*/
     4943                                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
     4944                                int  numvertices = element->GetNumberOfVertices();
     4945                                IssmDouble* values_to_add=xNew<IssmDouble>(numvertices);
     4946                                IssmDouble* existing_values=xNew<IssmDouble>(numvertices);
     4947                                element->GetInputListOnVertices(&values_to_add[0],input_enum[i]); //those are the values to add
     4948                                element->GetInputListOnVertices(&existing_values[0],stackedinput_enum[i]); //those are the values to add
     4949                                for(int k=0;k<numvertices;k++){
     4950                                        existing_values[k]+=values_to_add[k]*hydrodt;
     4951                                }
     4952                                element->AddInput(stackedinput_enum[i],&existing_values[0],P1Enum);
     4953                                xDelete<IssmDouble>(existing_values);
     4954                                xDelete<IssmDouble>(values_to_add);
     4955                        }
     4956                }
     4957        }
     4958}
     4959/*}}}*/
     4960void FemModel::AverageSumOutputx(int* stackedinput_enum,int* averagedinput_enum,int numoutputs){ /*{{{*/
     4961
     4962        //First get timestep
     4963        IssmDouble maindt;
     4964        this->parameters->FindParam(&maindt,TimesteppingTimeStepEnum);
     4965  for(int i=0;i<numoutputs;i++){
     4966                if(stackedinput_enum[i]<0){
     4967                        _error_("Can't deal with non enum fields for result Stack");
     4968                }
     4969                else{
     4970                        for(int j=0;j<elements->Size();j++){
     4971                                /*Intermediaries*/
     4972                                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
     4973                                int  numvertices = element->GetNumberOfVertices();
     4974                                IssmDouble* time_averaged=xNew<IssmDouble>(numvertices);
     4975                                IssmDouble* existing_values=xNew<IssmDouble>(numvertices);
     4976                                element->GetInputListOnVertices(&existing_values[0],stackedinput_enum[i]); //those are the values to add
     4977
     4978                                for(int k=0;k<numvertices;k++){
     4979                                        time_averaged[k]=existing_values[k]/maindt;
     4980                                }
     4981
     4982                                element->AddInput(averagedinput_enum[i],&time_averaged[0],P1Enum);
     4983                                xDelete<IssmDouble>(time_averaged);
     4984                                xDelete<IssmDouble>(existing_values);
    48974985                        }
    48984986                }
  • issm/trunk-jpl/src/c/classes/FemModel.h

    r23532 r23544  
    141141                #endif
    142142                #ifdef _HAVE_ESA_
    143                 void EsaGeodetic2D(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pX, Vector<IssmDouble>* pY, IssmDouble* xx, IssmDouble* yy); 
    144                 void EsaGeodetic3D(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz); 
     143                void EsaGeodetic2D(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pX, Vector<IssmDouble>* pY, IssmDouble* xx, IssmDouble* yy);
     144                void EsaGeodetic3D(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz);
    145145                #endif
    146146                #ifdef _HAVE_SEALEVELRISE_
     
    148148                void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo, Vector<IssmDouble>* pSg_old, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius,bool verboseconvolution,int loop);
    149149                void SealevelriseRotationalFeedback(Vector<IssmDouble>* pRSLgo_rot, Vector<IssmDouble>* pRSLg_old, IssmDouble* pIxz, IssmDouble* pIyz, IssmDouble* pIzz, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius);
    150                 void SealevelriseElastic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pSg_old, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz,int loop,int horiz); 
     150                void SealevelriseElastic(Vector<IssmDouble>* pUp, Vector<IssmDouble>* pNorth, Vector<IssmDouble>* pEast, Vector<IssmDouble>* pSg_old, IssmDouble* latitude, IssmDouble* longitude, IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz,int loop,int horiz);
    151151                IssmDouble SealevelriseOceanAverage(Vector<IssmDouble>* Sg);
    152152                #endif
     
    159159                void InitTransientOutputx(int* input_enum, int numoutputs);
    160160                void StackTransientOutputx(int* input_enum,int* stackedinput_enum, IssmDouble hydrotime, int numoutputs);
    161                 void AverageTransientOutputx(int* input_enum,int* averagedinput_enum,IssmDouble hydrotime,int numoutputs);
     161                void AverageTransientOutputx(int* stackedinput_enum,int* averagedinput_enum,IssmDouble init_time,int numoutputs);
     162                void InitMeanOutputx(int* stackedinput_enum,int numoutputs);
     163                void SumOutputx(int* input_enum,int* stackedinput_enum,int numoutputs);
     164                void AverageSumOutputx(int* stackedinput_enum,int* averagedinput_enum,int numoutputs);
    162165                void UpdateConstraintsx(void);
    163166                int  UpdateVertexPositionsx(void);
  • issm/trunk-jpl/src/c/cores/hydrology_core.cpp

    r23528 r23544  
    7575                                        int stackedinput[4]={EffectivePressureStackedEnum,SedimentHeadStackedEnum,EplHeadStackedEnum,HydrologydcEplThicknessStackedEnum};
    7676                                        int averagedinput[4]={EffectivePressureEnum,SedimentHeadEnum,EplHeadEnum,HydrologydcEplThicknessEnum};
    77                                         femmodel->InitTransientOutputx(&stackedinput[0],4);
     77                                        //femmodel->InitTransientOutputx(&stackedinput[0],4);
     78                                        femmodel->InitMeanOutputx(&stackedinput[0],4);
    7879                                        while(hydrotime<time-(yts*DBL_EPSILON)){ //loop on hydro dts
    7980                                                hydrostep+=1;
     
    8889                                                solutionsequence_hydro_nonlinear(femmodel);
    8990                                                /*If we have a sub-timestep we stack the variables here*/
    90                                                 femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,4);
     91                                                //femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,4);
     92                                                femmodel->SumOutputx(&inputtostack[0],&stackedinput[0],4);
    9193                                        }
    92                                         femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,4);
     94                                        //femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,4);
     95                                        femmodel->AverageSumOutputx(&stackedinput[0],&averagedinput[0],4);
    9396                                }
    9497                                else{
     
    9699                                        int stackedinput[2]={EffectivePressureStackedEnum,SedimentHeadStackedEnum};
    97100                                        int averagedinput[2]={EffectivePressureEnum,SedimentHeadEnum};
    98                                         femmodel->InitTransientOutputx(&stackedinput[0],2);
     101                                        //femmodel->InitTransientOutputx(&stackedinput[0],2);
     102                                        femmodel->InitMeanOutputx(&stackedinput[0],2);
    99103                                        while(hydrotime<time-(yts*DBL_EPSILON)){ //loop on hydro dts
    100104                                                hydrotime+=hydrodt;
     
    104108                                                solutionsequence_hydro_nonlinear(femmodel);
    105109                                                /*If we have a sub-timestep we stack the variables here*/
    106                                                 femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,2);
     110                                                //femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,2);
     111                                                femmodel->SumOutputx(&inputtostack[0],&stackedinput[0],2);
    107112                                        }
    108                                         femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,2);
     113                                        //femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,2);
     114                                        femmodel->AverageSumOutputx(&stackedinput[0],&averagedinput[0],2);
    109115                                }
    110116                        }
Note: See TracChangeset for help on using the changeset viewer.