Changeset 23546


Ignore:
Timestamp:
12/13/18 07:05:22 (6 years ago)
Author:
bdef
Message:

CHG:clean up of old hydro substeping and change in reset of inactive EPL

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

Legend:

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

    r23532 r23546  
    198198        /*Check that all nodes are active, else return empty matrix*/
    199199        if(!active_element) {
    200         if(domaintype!=Domain2DhorizontalEnum){
     200                if(domaintype!=Domain2DhorizontalEnum){
    201201                        basalelement->DeleteMaterials();
    202202                        delete basalelement;
     
    435435        IssmDouble* eplHeads    = xNew<IssmDouble>(numnodes);
    436436        IssmDouble* basevalue    = xNew<IssmDouble>(numnodes);
    437         IssmDouble* initvalue    = xNew<IssmDouble>(numnodes);
    438437        basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
    439438
     
    452451        }
    453452        else{
    454                 //tradeof between keeping initial condition and not getting to far from head at deactivation
     453                //Fixing epl head at bedrock elevation when deactivating
    455454                basalelement->GetInputListOnVertices(&basevalue[0],BaseEnum);
    456                 basalelement->GetInputListOnVertices(&initvalue[0],EplHeadHydrostepEnum);
    457455                for(int i=0;i<numnodes;i++){
    458                         eplHeads[i]=max(basevalue[i],initvalue[i]);
     456                        eplHeads[i]=basevalue[i];
    459457                        if(xIsNan<IssmDouble>(eplHeads[i])) _error_("NaN found in solution vector");
    460458                        if(xIsInf<IssmDouble>(eplHeads[i])) _error_("Inf found in solution vector");
     
    466464        xDelete<IssmDouble>(eplHeads);
    467465        xDelete<IssmDouble>(basevalue);
    468         xDelete<IssmDouble>(initvalue);
    469466        xDelete<int>(doflist);
    470467        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
  • TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp

    r23532 r23546  
    205205        /*Check that all nodes are active, else return empty matrix*/
    206206        if(!thawed_element) {
    207         if(domaintype!=Domain2DhorizontalEnum){
     207                if(domaintype!=Domain2DhorizontalEnum){
    208208                        basalelement->DeleteMaterials();
    209209                        delete basalelement;
  • TabularUnified issm/trunk-jpl/src/c/classes/FemModel.cpp

    r23544 r23546  
    48214821}
    48224822/*}}}*/
    4823 void FemModel::InitTransientOutputx(int* stackedinput_enum,int numoutputs){ /*{{{*/
    4824 
    4825   for(int i=0;i<numoutputs;i++){
    4826                 if(stackedinput_enum[i]<0){
    4827                         _error_("Can't deal with non enum fields for result Stack");
    4828                 }
    4829                 else{
    4830                         for(int j=0;j<elements->Size();j++){
    4831                                 TransientInput* transient_input = new TransientInput(stackedinput_enum[i]);
    4832                                 /*Intermediaries*/
    4833                                 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
    4834                                 //transient_input->Configure(element->parameters);
    4835                                 element->inputs->AddInput(transient_input);
    4836                         }
    4837                 }
    4838         }
    4839 }
    4840 /*}}}*/
    4841 void FemModel::StackTransientOutputx(int* input_enum,int* stackedinput_enum,IssmDouble hydrotime,int numoutputs){ /*{{{*/
    4842 
    4843   for(int i=0;i<numoutputs;i++){
    4844                 if(input_enum[i]<0){
    4845                         _error_("Can't deal with non enum fields for result Stack");
    4846                 }
    4847                 else{
    4848                         for(int j=0;j<elements->Size();j++){
    4849                                 /*Intermediaries*/
    4850                                 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
    4851                                 TransientInput* stacking_input=NULL;
    4852                                 Input* input=element->inputs->GetInput(stackedinput_enum[i]); _assert_(input); //this is the enum stack
    4853                                 stacking_input=dynamic_cast<TransientInput*>(input);
    4854 
    4855                                 int  numvertices = element->GetNumberOfVertices();
    4856                                 IssmDouble* N=xNew<IssmDouble>(numvertices);
    4857                                 element->GetInputListOnVertices(&N[0],input_enum[i]);   //this is the enum to stack
    4858                                 switch(element->ObjectEnum()){
    4859                                 case TriaEnum:
    4860                                         stacking_input->AddTimeInput(new TriaInput(stackedinput_enum[i],&N[0],P1Enum),hydrotime);
    4861                                         break;
    4862                                 case PentaEnum:
    4863                                         stacking_input->AddTimeInput(new PentaInput(stackedinput_enum[i],&N[0],P1Enum),hydrotime);
    4864                                         break;
    4865                                 case TetraEnum:
    4866                                         stacking_input->AddTimeInput(new TetraInput(stackedinput_enum[i],&N[0],P1Enum),hydrotime);
    4867                                         break;
    4868                                 default: _error_("Not implemented yet");
    4869                                 }
    4870                                 xDelete<IssmDouble>(N);
    4871                         }
    4872                 }
    4873         }
    4874 }
    4875 /*}}}*/
    4876 void FemModel::AverageTransientOutputx(int* stackedinput_enum,int* averagedinput_enum,IssmDouble init_time,int numoutputs){ /*{{{*/
    4877 
    4878   for(int i=0;i<numoutputs;i++){
    4879                 if(stackedinput_enum[i]<0){
    4880                         _error_("Can't deal with non enum fields for result Stack");
    4881                 }
    4882                 else{
    4883                         for(int j=0;j<elements->Size();j++){
    4884                                 /*Intermediaries*/
    4885                                 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
    4886                                 int  numvertices = element->GetNumberOfVertices();
    4887                                 IssmDouble* time_averaged=NULL;
    4888 
    4889                                 Input* input=element->inputs->GetInput(stackedinput_enum[i]); _assert_(input);
    4890                                 TransientInput* stacking_input=NULL;
    4891                                 stacking_input=dynamic_cast<TransientInput*>(input);
    4892                                 stacking_input->GetInputAverageOnTimes(&time_averaged,init_time);
    4893 
    4894                                 element->AddInput(averagedinput_enum[i],&time_averaged[0],P1Enum);
    4895                                 xDelete<IssmDouble>(time_averaged);
    4896                         }
    4897                 }
    4898         }
    4899 }
    4900 /*}}}*/
    49014823void FemModel::InitMeanOutputx(int* stackedinput_enum,int numoutputs){ /*{{{*/
    49024824
  • TabularUnified issm/trunk-jpl/src/c/classes/FemModel.h

    r23544 r23546  
    157157                void UpdateConstraintsExtrudeFromTopx();
    158158                void UpdateConstraintsL2ProjectionEPLx(IssmDouble* pL2count);
    159                 void InitTransientOutputx(int* input_enum, int numoutputs);
    160                 void StackTransientOutputx(int* input_enum,int* stackedinput_enum, IssmDouble hydrotime, int numoutputs);
    161                 void AverageTransientOutputx(int* stackedinput_enum,int* averagedinput_enum,IssmDouble init_time,int numoutputs);
    162159                void InitMeanOutputx(int* stackedinput_enum,int numoutputs);
    163160                void SumOutputx(int* input_enum,int* stackedinput_enum,int numoutputs);
  • TabularUnified issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp

    r22740 r23546  
    8787        _printf_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")\n");
    8888        _printf_("   numtimesteps: " << this->numtimesteps << "\n");
    89         _printf_("---inputs: \n"); 
     89        _printf_("---inputs: \n");
    9090        for(i=0;i<this->numtimesteps;i++){
    9191                _printf_("   time: " << this->timesteps[i]<<"  ");
     
    313313}
    314314/*}}}*/
    315 void TransientInput::GetInputAverageOnTimes(IssmDouble** pvalues, IssmDouble init_time){/*{{{*/
    316 
    317         int                                     numnodes;
    318         IssmDouble  subtimestep;
    319         IssmDouble* values= NULL;
    320         Input* input=NULL;
    321 
    322         /*Initialize numnode from transientinput out of time loop*/
    323         for(int i=0;i<this->numtimesteps;i++){
    324                 /*First compute the lengt of the sub-timestep*/
    325                 if(i==0){
    326                         subtimestep = this->timesteps[i]-init_time;
    327                 }
    328                 else{
    329                         subtimestep = this->timesteps[i]-this->timesteps[i-1];
    330                 }       
    331                 /*Figure out type of input and get it*/
    332                 input = xDynamicCast<Input*>(this->inputs->GetObjectByOffset(i)); _assert_(input);
    333                 switch(input->ObjectEnum()){
    334                 case TriaInputEnum:{
    335                         TriaInput* triainput = (TriaInput*)this->inputs->GetObjectByOffset(i); _assert_(triainput);
    336                         if(i==0){
    337                                 numnodes= triainput->NumberofNodes(triainput->interpolation_type);
    338                                 values=xNewZeroInit<IssmDouble>(numnodes);
    339                         }
    340                         /*Sum the values weighted by their respective sub-timestep*/
    341                         for(int j=0;j<numnodes;j++){
    342                                 values[j]+=(triainput->values[j]*subtimestep);
    343                         }
    344                         break;
    345                 }
    346                 case PentaInputEnum:{
    347                         PentaInput*     pentainput = (PentaInput*)this->inputs->GetObjectByOffset(i); _assert_(pentainput);
    348                         if(i==0){
    349                                 numnodes= pentainput->NumberofNodes(pentainput->interpolation_type);
    350                                 values=xNewZeroInit<IssmDouble>(numnodes);
    351                         }
    352                         /*Sum the values weighted by their respective sub-timestep*/
    353                         for(int j=0;j<numnodes;j++){
    354                                 values[j]+=(pentainput->values[j]*subtimestep);
    355                         }
    356                         break;
    357                 }
    358                 case TetraInputEnum:{
    359                         TetraInput*     tetrainput = (TetraInput*)this->inputs->GetObjectByOffset(i); _assert_(tetrainput);
    360                         if(i==0){
    361                                 numnodes= tetrainput->NumberofNodes(tetrainput->interpolation_type);
    362                                 values=xNewZeroInit<IssmDouble>(numnodes);
    363                         }
    364                         /*Sum the values weighted by their respective sub-timestep*/
    365                         for(int j=0;j<numnodes;j++){
    366                                 values[j]+=(tetrainput->values[j]*subtimestep);
    367                         }
    368                         break;
    369                 }
    370                 default: _error_("not implemented yet");
    371                 }
    372         }
    373         /*Compute the average based on the length of the full timestep*/
    374         for(int j=0;j<numnodes;j++){
    375                 values[j]=values[j]/(this->timesteps[this->numtimesteps-1]-init_time);
    376         }
    377         *pvalues=values;
    378 }
    379 /*}}}*/
    380315
    381316/*Intermediary*/
     
    476411        Input *input2 = NULL;
    477412
    478         /*go through the timesteps, and figure out which interval we 
     413        /*go through the timesteps, and figure out which interval we
    479414         *fall within. Then interpolate the values on this interval: */
    480415        found=binary_search(&offset,intime,this->timesteps,this->numtimesteps);
     
    498433                alpha1=(1.0-alpha2);
    499434
    500                 input1=(Input*)this->inputs->GetObjectByOffset(offset); 
     435                input1=(Input*)this->inputs->GetObjectByOffset(offset);
    501436                input2=(Input*)this->inputs->GetObjectByOffset(offset+1);
    502437
  • TabularUnified issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h

    r22519 r23546  
    1 /*! \file TransientInput.h 
     1/*! \file TransientInput.h
    22 *  \brief: header file for transientinput object
    33 */
     
    6464                void GetInputValue(IssmDouble* pvalue,Gauss* gauss ,int index){_error_("not implemented yet");};
    6565                void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime);
    66                 void GetInputAverageOnTimes(IssmDouble** pvalues, IssmDouble init_time);
    6766                int  GetInputInterpolationType(){_error_("not implemented yet!");};
    6867                IssmDouble  GetTimeByOffset(int offset);
  • TabularUnified issm/trunk-jpl/src/c/cores/hydrology_core.cpp

    r23544 r23546  
    7575                                        int stackedinput[4]={EffectivePressureStackedEnum,SedimentHeadStackedEnum,EplHeadStackedEnum,HydrologydcEplThicknessStackedEnum};
    7676                                        int averagedinput[4]={EffectivePressureEnum,SedimentHeadEnum,EplHeadEnum,HydrologydcEplThicknessEnum};
    77                                         //femmodel->InitTransientOutputx(&stackedinput[0],4);
    7877                                        femmodel->InitMeanOutputx(&stackedinput[0],4);
    7978                                        while(hydrotime<time-(yts*DBL_EPSILON)){ //loop on hydro dts
     
    8988                                                solutionsequence_hydro_nonlinear(femmodel);
    9089                                                /*If we have a sub-timestep we stack the variables here*/
    91                                                 //femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,4);
    9290                                                femmodel->SumOutputx(&inputtostack[0],&stackedinput[0],4);
    9391                                        }
    94                                         //femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,4);
    9592                                        femmodel->AverageSumOutputx(&stackedinput[0],&averagedinput[0],4);
    9693                                }
     
    9996                                        int stackedinput[2]={EffectivePressureStackedEnum,SedimentHeadStackedEnum};
    10097                                        int averagedinput[2]={EffectivePressureEnum,SedimentHeadEnum};
    101                                         //femmodel->InitTransientOutputx(&stackedinput[0],2);
    10298                                        femmodel->InitMeanOutputx(&stackedinput[0],2);
    10399                                        while(hydrotime<time-(yts*DBL_EPSILON)){ //loop on hydro dts
     
    108104                                                solutionsequence_hydro_nonlinear(femmodel);
    109105                                                /*If we have a sub-timestep we stack the variables here*/
    110                                                 //femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,2);
    111106                                                femmodel->SumOutputx(&inputtostack[0],&stackedinput[0],2);
    112107                                        }
    113                                         //femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,2);
    114108                                        femmodel->AverageSumOutputx(&stackedinput[0],&averagedinput[0],2);
    115109                                }
Note: See TracChangeset for help on using the changeset viewer.