Changeset 23546
- Timestamp:
- 12/13/18 07:05:22 (6 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp ¶
r23532 r23546 198 198 /*Check that all nodes are active, else return empty matrix*/ 199 199 if(!active_element) { 200 if(domaintype!=Domain2DhorizontalEnum){200 if(domaintype!=Domain2DhorizontalEnum){ 201 201 basalelement->DeleteMaterials(); 202 202 delete basalelement; … … 435 435 IssmDouble* eplHeads = xNew<IssmDouble>(numnodes); 436 436 IssmDouble* basevalue = xNew<IssmDouble>(numnodes); 437 IssmDouble* initvalue = xNew<IssmDouble>(numnodes);438 437 basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 439 438 … … 452 451 } 453 452 else{ 454 // tradeof between keeping initial condition and not getting to far from head at deactivation453 //Fixing epl head at bedrock elevation when deactivating 455 454 basalelement->GetInputListOnVertices(&basevalue[0],BaseEnum); 456 basalelement->GetInputListOnVertices(&initvalue[0],EplHeadHydrostepEnum);457 455 for(int i=0;i<numnodes;i++){ 458 eplHeads[i]= max(basevalue[i],initvalue[i]);456 eplHeads[i]=basevalue[i]; 459 457 if(xIsNan<IssmDouble>(eplHeads[i])) _error_("NaN found in solution vector"); 460 458 if(xIsInf<IssmDouble>(eplHeads[i])) _error_("Inf found in solution vector"); … … 466 464 xDelete<IssmDouble>(eplHeads); 467 465 xDelete<IssmDouble>(basevalue); 468 xDelete<IssmDouble>(initvalue);469 466 xDelete<int>(doflist); 470 467 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; -
TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp ¶
r23532 r23546 205 205 /*Check that all nodes are active, else return empty matrix*/ 206 206 if(!thawed_element) { 207 if(domaintype!=Domain2DhorizontalEnum){207 if(domaintype!=Domain2DhorizontalEnum){ 208 208 basalelement->DeleteMaterials(); 209 209 delete basalelement; -
TabularUnified issm/trunk-jpl/src/c/classes/FemModel.cpp ¶
r23544 r23546 4821 4821 } 4822 4822 /*}}}*/ 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 stack4853 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 stack4858 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 /*}}}*/4901 4823 void FemModel::InitMeanOutputx(int* stackedinput_enum,int numoutputs){ /*{{{*/ 4902 4824 -
TabularUnified issm/trunk-jpl/src/c/classes/FemModel.h ¶
r23544 r23546 157 157 void UpdateConstraintsExtrudeFromTopx(); 158 158 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);162 159 void InitMeanOutputx(int* stackedinput_enum,int numoutputs); 163 160 void SumOutputx(int* input_enum,int* stackedinput_enum,int numoutputs); -
TabularUnified issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp ¶
r22740 r23546 87 87 _printf_(" enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")\n"); 88 88 _printf_(" numtimesteps: " << this->numtimesteps << "\n"); 89 _printf_("---inputs: \n"); 89 _printf_("---inputs: \n"); 90 90 for(i=0;i<this->numtimesteps;i++){ 91 91 _printf_(" time: " << this->timesteps[i]<<" "); … … 313 313 } 314 314 /*}}}*/ 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 /*}}}*/380 315 381 316 /*Intermediary*/ … … 476 411 Input *input2 = NULL; 477 412 478 /*go through the timesteps, and figure out which interval we 413 /*go through the timesteps, and figure out which interval we 479 414 *fall within. Then interpolate the values on this interval: */ 480 415 found=binary_search(&offset,intime,this->timesteps,this->numtimesteps); … … 498 433 alpha1=(1.0-alpha2); 499 434 500 input1=(Input*)this->inputs->GetObjectByOffset(offset); 435 input1=(Input*)this->inputs->GetObjectByOffset(offset); 501 436 input2=(Input*)this->inputs->GetObjectByOffset(offset+1); 502 437 -
TabularUnified issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h ¶
r22519 r23546 1 /*! \file TransientInput.h 1 /*! \file TransientInput.h 2 2 * \brief: header file for transientinput object 3 3 */ … … 64 64 void GetInputValue(IssmDouble* pvalue,Gauss* gauss ,int index){_error_("not implemented yet");}; 65 65 void GetInputUpToCurrentTimeAverages(IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime); 66 void GetInputAverageOnTimes(IssmDouble** pvalues, IssmDouble init_time);67 66 int GetInputInterpolationType(){_error_("not implemented yet!");}; 68 67 IssmDouble GetTimeByOffset(int offset); -
TabularUnified issm/trunk-jpl/src/c/cores/hydrology_core.cpp ¶
r23544 r23546 75 75 int stackedinput[4]={EffectivePressureStackedEnum,SedimentHeadStackedEnum,EplHeadStackedEnum,HydrologydcEplThicknessStackedEnum}; 76 76 int averagedinput[4]={EffectivePressureEnum,SedimentHeadEnum,EplHeadEnum,HydrologydcEplThicknessEnum}; 77 //femmodel->InitTransientOutputx(&stackedinput[0],4);78 77 femmodel->InitMeanOutputx(&stackedinput[0],4); 79 78 while(hydrotime<time-(yts*DBL_EPSILON)){ //loop on hydro dts … … 89 88 solutionsequence_hydro_nonlinear(femmodel); 90 89 /*If we have a sub-timestep we stack the variables here*/ 91 //femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,4);92 90 femmodel->SumOutputx(&inputtostack[0],&stackedinput[0],4); 93 91 } 94 //femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,4);95 92 femmodel->AverageSumOutputx(&stackedinput[0],&averagedinput[0],4); 96 93 } … … 99 96 int stackedinput[2]={EffectivePressureStackedEnum,SedimentHeadStackedEnum}; 100 97 int averagedinput[2]={EffectivePressureEnum,SedimentHeadEnum}; 101 //femmodel->InitTransientOutputx(&stackedinput[0],2);102 98 femmodel->InitMeanOutputx(&stackedinput[0],2); 103 99 while(hydrotime<time-(yts*DBL_EPSILON)){ //loop on hydro dts … … 108 104 solutionsequence_hydro_nonlinear(femmodel); 109 105 /*If we have a sub-timestep we stack the variables here*/ 110 //femmodel->StackTransientOutputx(&inputtostack[0],&stackedinput[0],hydrotime,2);111 106 femmodel->SumOutputx(&inputtostack[0],&stackedinput[0],2); 112 107 } 113 //femmodel->AverageTransientOutputx(&stackedinput[0],&averagedinput[0],init_time,2);114 108 femmodel->AverageSumOutputx(&stackedinput[0],&averagedinput[0],2); 115 109 }
Note:
See TracChangeset
for help on using the changeset viewer.