source:
issm/oecreview/Archive/24684-25833/ISSM-24789-24790.diff
Last change on this file was 25834, checked in by , 4 years ago | |
---|---|
File size: 34.0 KB |
-
../trunk-jpl/src/c/cores/smb_core.cpp
54 54 55 55 /*if yes compute necessary intermediaries and start looping*/ 56 56 if (dtslices>1){ 57 int substep ;57 int substep,smb_averaging; 58 58 IssmDouble global_time,subtime,yts; 59 59 IssmDouble dt,subdt; 60 60 … … 61 61 femmodel->parameters->FindParam(&global_time,TimeEnum); 62 62 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 63 63 femmodel->parameters->FindParam(&yts,ConstantsYtsEnum); 64 femmodel->parameters->FindParam(&smb_averaging,SmbAveragingEnum); 64 65 65 66 subtime=global_time-dt; //getting the time back to the start of the timestep 66 67 subdt=dt/dtslices; //computing substep from dt and a divider … … 82 83 } 83 84 delete analysis; 84 85 /*averaging the transient input*/ 85 femmodel->AverageTransientInputx(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput );86 femmodel->AverageTransientInputx(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput,smb_averaging); 86 87 /*and reset timesteping variables to original*/ 87 88 femmodel->parameters->SetParam(global_time,TimeEnum); 88 89 femmodel->parameters->SetParam(dt,TimesteppingTimeStepEnum); -
../trunk-jpl/src/c/cores/hydrology_core.cpp
62 62 femmodel->parameters->FindParam(&dtslices,HydrologyStepsPerStepEnum); 63 63 64 64 if(dtslices>1){ 65 int substep, numaveragedinput ;65 int substep, numaveragedinput, hydro_averaging; 66 66 IssmDouble global_time, subtime, yts; 67 67 IssmDouble dt, subdt; 68 68 … … 69 69 femmodel->parameters->FindParam(&global_time,TimeEnum); 70 70 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 71 71 femmodel->parameters->FindParam(&yts,ConstantsYtsEnum); 72 femmodel->parameters->FindParam(&hydro_averaging,HydrologyAveragingEnum); 72 73 73 74 subtime=global_time-dt; //getting the time back to the start of the timestep 74 75 subdt=dt/dtslices; //computing hydro dt from dt and a divider … … 116 117 femmodel->StackTransientInputx(&substepinput[0],&transientinput[0],subtime,numaveragedinput); 117 118 } 118 119 /*averaging the stack*/ 119 femmodel->AverageTransientInputx(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput );120 femmodel->AverageTransientInputx(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput,hydro_averaging); 120 121 121 122 /*And reseting to global time*/ 122 123 femmodel->parameters->SetParam(dt,TimesteppingTimeStepEnum); -
../trunk-jpl/src/c/classes/FemModel.h
175 175 void UpdateConstraintsL2ProjectionEPLx(IssmDouble* pL2count); 176 176 void InitTransientInputx(int* transientinput_enum,int numoutputs); 177 177 void StackTransientInputx(int* input_enum,int* transientinput_enum,IssmDouble hydrotime,int numoutputs); 178 void AverageTransientInputx(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs );178 void AverageTransientInputx(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs,int averaging_method); 179 179 void UpdateConstraintsx(void); 180 180 int UpdateVertexPositionsx(void); 181 181 -
../trunk-jpl/src/c/classes/Inputs2/TriaInput2.h
37 37 TriaInput2* GetTriaInput(){return this;}; 38 38 void GetInputValue(IssmDouble* pvalue,Gauss* gauss); 39 39 void Scale(IssmDouble scalar); 40 void Pow(IssmDouble scalar); 40 41 void AXPY(Input2* xinput,IssmDouble scalar); 42 void PointWiseMult(Input2* xinput); 41 43 void Serve(int numindices,int* indices); 42 44 void Serve(int row,int numindices); 43 45 void ServeCollapsed(int row,int id0,int in1); -
../trunk-jpl/src/c/classes/Inputs2/PentaInput2.cpp
154 154 void PentaInput2::SetInput(int interp_in,int row,IssmDouble value_in){/*{{{*/ 155 155 156 156 _assert_(this); 157 _assert_(row>=0); 158 _assert_(row<this->M); 157 _assert_(row>=0); 158 _assert_(row<this->M); 159 159 _assert_(this->N==1); 160 160 161 161 this->values[row] = value_in; … … 169 169 _assert_(this->N==1); 170 170 for(int i=0;i<numindices;i++){ 171 171 int row = indices[i]; 172 _assert_(row>=0); 173 _assert_(row<this->M); 172 _assert_(row>=0); 173 _assert_(row<this->M); 174 174 this->values[row] = values_in[i]; 175 175 } 176 176 } … … 178 178 this->Reset(interp_in); 179 179 for(int i=0;i<numindices;i++){ 180 180 int row = indices[i]; 181 _assert_(row>=0); 182 _assert_(row<this->M); 181 _assert_(row>=0); 182 _assert_(row<this->M); 183 183 this->values[row] = values_in[i]; 184 184 } 185 185 } … … 212 212 213 213 for(int i=0;i<numindices;i++){ 214 214 int row = indices[i]; 215 _assert_(row>=0); 216 _assert_(row<this->M); 215 _assert_(row>=0); 216 _assert_(row<this->M); 217 217 this->element_values[i] = this->values[row]; 218 218 } 219 219 … … 388 388 for(int i=0;i<PentaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*this->element_values[i]; 389 389 } 390 390 /*}}}*/ 391 void PentaInput2::Pow(IssmDouble alpha){/*{{{*/ 392 393 for(int i=0;i<this->M*this->N;i++) this->values[i] = pow(this->values[i],alpha); 394 for(int i=0;i<PentaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = pow(this->element_values[i],alpha); 395 } 396 /*}}}*/ 391 397 void PentaInput2::AXPY(Input2* xinput,IssmDouble alpha){/*{{{*/ 392 398 393 399 /*xinput is of the same type, so cast it: */ … … 400 406 for(int i=0;i<PentaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*xpentainput->element_values[i] + this->element_values[i]; 401 407 } 402 408 /*}}}*/ 409 void PentaInput2::PointWiseMult(Input2* xinput){/*{{{*/ 403 410 411 /*xinput is of the same type, so cast it: */ 412 if(xinput->ObjectEnum()!=PentaInput2Enum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 413 PentaInput2* xpentainput=xDynamicCast<PentaInput2*>(xinput); 414 if(xpentainput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 415 416 /* we need to check that the vector sizes are identical*/ 417 if(xpentainput->M!=this->M||xpentainput->N!=this->N) _error_("Operation not permitted because the inputs have different sizes"); 418 419 /*Carry out the pointwise operation depending on type:*/ 420 for(int i=0;i<this->M*this->N;i++) this->values[i] = xpentainput->values[i] * this->values[i]; 421 for(int i=0;i<PentaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = xpentainput->element_values[i] * this->element_values[i]; 422 } 423 /*}}}*/ 424 404 425 /*Object functions*/ -
../trunk-jpl/src/c/classes/Inputs2/Inputs2.h
53 53 SegInput2* GetSegInput(int enum_type); 54 54 TriaInput2* GetTriaInput(int enum_type); 55 55 TriaInput2* GetTriaInput(int enum_type,IssmDouble time); 56 TriaInput2* GetTriaInput(int enum_in,IssmDouble start_time,IssmDouble end_time );56 TriaInput2* GetTriaInput(int enum_in,IssmDouble start_time,IssmDouble end_time,int averaging_method); 57 57 PentaInput2* GetPentaInput(int enum_type); 58 58 PentaInput2* GetPentaInput(int enum_type,IssmDouble time); 59 59 TransientInput2* GetTransientInput(int enum_type); -
../trunk-jpl/src/c/classes/Inputs2/PentaInput2.h
36 36 PentaInput2* GetPentaInput(){return this;}; 37 37 void GetInputValue(IssmDouble* pvalue,Gauss* gauss); 38 38 void Scale(IssmDouble scalar); 39 void Pow(IssmDouble scalar); 39 40 void AXPY(Input2* xinput,IssmDouble scalar); 41 void PointWiseMult(Input2* xinput); 40 42 void Serve(int numindices,int* indices); 41 43 void Serve(int row,int numindices); 42 44 void ServeCollapsed(int row,int state); -
../trunk-jpl/src/c/classes/Inputs2/TransientInput2.h
49 49 void GetAllTimes(IssmDouble** ptimesteps,int* pnumtimesteps); 50 50 TriaInput2* GetTriaInput(); 51 51 TriaInput2* GetTriaInput(IssmDouble time); 52 TriaInput2* GetTriaInput(IssmDouble start_time,IssmDouble end_time );52 TriaInput2* GetTriaInput(IssmDouble start_time,IssmDouble end_time,int averaging_method); 53 53 TriaInput2* GetTriaInput(int offset); 54 54 PentaInput2* GetPentaInput(); 55 55 PentaInput2* GetPentaInput(IssmDouble time); … … 58 58 IssmDouble GetTimeByOffset(int offset); 59 59 int GetTimeInputOffset(IssmDouble time); 60 60 void SetCurrentTimeInput(IssmDouble time); 61 void SetAverageAsCurrentTimeInput(IssmDouble start_time,IssmDouble end_time );61 void SetAverageAsCurrentTimeInput(IssmDouble start_time,IssmDouble end_time,int averaging_method); 62 62 /*numerics:*/ 63 63 64 64 }; -
../trunk-jpl/src/c/classes/Inputs2/SegInput2.cpp
136 136 void SegInput2::SetInput(int interp_in,int row,IssmDouble value_in){/*{{{*/ 137 137 138 138 _assert_(this); 139 _assert_(row>=0); 140 _assert_(row<this->M); 139 _assert_(row>=0); 140 _assert_(row<this->M); 141 141 _assert_(this->N==1); 142 142 143 143 this->values[row] = value_in; … … 151 151 _assert_(this->N==1); 152 152 for(int i=0;i<numindices;i++){ 153 153 int row = indices[i]; 154 _assert_(row>=0); 155 _assert_(row<this->M); 154 _assert_(row>=0); 155 _assert_(row<this->M); 156 156 this->values[row] = values_in[i]; 157 157 } 158 158 } … … 160 160 _assert_(this->N==1); 161 161 for(int i=0;i<numindices;i++){ 162 162 int row = indices[i]; 163 _assert_(row>=0); 164 _assert_(row<this->M); 163 _assert_(row>=0); 164 _assert_(row<this->M); 165 165 this->values[row] = values_in[i]; 166 166 } 167 167 } … … 169 169 this->Reset(interp_in); 170 170 for(int i=0;i<numindices;i++){ 171 171 int row = indices[i]; 172 _assert_(row>=0); 173 _assert_(row<this->M); 172 _assert_(row>=0); 173 _assert_(row<this->M); 174 174 this->values[row] = values_in[i]; 175 175 } 176 176 } … … 201 201 202 202 for(int i=0;i<numindices;i++){ 203 203 int row = indices[i]; 204 _assert_(row>=0); 205 _assert_(row<this->M); 204 _assert_(row>=0); 205 _assert_(row<this->M); 206 206 this->element_values[i] = this->values[row]; 207 207 } 208 208 … … 308 308 for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*this->element_values[i]; 309 309 } 310 310 /*}}}*/ 311 void SegInput2::Pow(IssmDouble alpha){/*{{{*/ 312 313 for(int i=0;i<this->M*this->N;i++) this->values[i] = pow(this->values[i],alpha); 314 for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = pow(this->element_values[i],alpha); 315 } 316 /*}}}*/ 311 317 void SegInput2::AXPY(Input2* xinput,IssmDouble alpha){/*{{{*/ 312 318 313 319 /*xinput is of the same type, so cast it: */ 314 320 if(xinput->ObjectEnum()!=SegInput2Enum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 315 SegInput2* x triainput=xDynamicCast<SegInput2*>(xinput);316 if(x triainput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));321 SegInput2* xseginput=xDynamicCast<SegInput2*>(xinput); 322 if(xseginput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 317 323 318 324 /*Carry out the AXPY operation depending on type:*/ 319 for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*x triainput->values[i] + this->values[i];320 for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*x triainput->element_values[i] + this->element_values[i];325 for(int i=0;i<this->M*this->N;i++) this->values[i] = alpha*xseginput->values[i] + this->values[i]; 326 for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*xseginput->element_values[i] + this->element_values[i]; 321 327 } 322 328 /*}}}*/ 329 void SegInput2::PointWiseMult(Input2* xinput){/*{{{*/ 323 330 331 /*xinput is of the same type, so cast it: */ 332 if(xinput->ObjectEnum()!=SegInput2Enum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 333 SegInput2* xseginput=xDynamicCast<SegInput2*>(xinput); 334 if(xseginput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 335 336 /* we need to check that the vector sizes are identical*/ 337 if(xseginput->M!=this->M||xseginput->N!=this->N) _error_("Operation not permitted because the inputs have different sizes"); 338 339 /*Carry out the AXPY operation depending on type:*/ 340 for(int i=0;i<this->M*this->N;i++) this->values[i] = xseginput->values[i] * this->values[i]; 341 for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = xseginput->element_values[i] * this->element_values[i]; 342 } 343 /*}}}*/ 344 324 345 /*Object functions*/ -
../trunk-jpl/src/c/classes/Inputs2/SegInput2.h
34 34 SegInput2* GetSegInput(){return this;}; 35 35 void GetInputValue(IssmDouble* pvalue,Gauss* gauss); 36 36 void Scale(IssmDouble scalar); 37 void Pow(IssmDouble scalar); 37 38 void AXPY(Input2* xinput,IssmDouble scalar); 39 void PointWiseMult(Input2* xinput); 38 40 void Serve(int numindices,int* indices); 39 41 void Serve(int row,int numindices); 40 42 int GetResultArraySize(void); -
../trunk-jpl/src/c/classes/Inputs2/TriaInput2.cpp
141 141 void TriaInput2::SetInput(int interp_in,int row,IssmDouble value_in){/*{{{*/ 142 142 143 143 _assert_(this); 144 _assert_(row>=0); 145 _assert_(row<this->M); 144 _assert_(row>=0); 145 _assert_(row<this->M); 146 146 _assert_(this->N==1); 147 147 148 148 this->values[row] = value_in; … … 156 156 _assert_(this->N==1); 157 157 for(int i=0;i<numindices;i++){ 158 158 int row = indices[i]; 159 _assert_(row>=0); 160 _assert_(row<this->M); 159 _assert_(row>=0); 160 _assert_(row<this->M); 161 161 this->values[row] = values_in[i]; 162 162 } 163 163 } … … 165 165 _assert_(this->N==1); 166 166 for(int i=0;i<numindices;i++){ 167 167 int row = indices[i]; 168 _assert_(row>=0); 169 _assert_(row<this->M); 168 _assert_(row>=0); 169 _assert_(row<this->M); 170 170 this->values[row] = values_in[i]; 171 171 } 172 172 } … … 174 174 this->Reset(interp_in); 175 175 for(int i=0;i<numindices;i++){ 176 176 int row = indices[i]; 177 _assert_(row>=0); 178 _assert_(row<this->M); 177 _assert_(row>=0); 178 _assert_(row<this->M); 179 179 this->values[row] = values_in[i]; 180 180 } 181 181 } … … 206 206 207 207 for(int i=0;i<numindices;i++){ 208 208 int row = indices[i]; 209 _assert_(row>=0); 210 _assert_(row<this->M); 209 _assert_(row>=0); 210 _assert_(row<this->M); 211 211 this->element_values[i] = this->values[row]; 212 212 } 213 213 … … 363 363 for(int i=0;i<TriaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*this->element_values[i]; 364 364 } 365 365 /*}}}*/ 366 void TriaInput2::Pow(IssmDouble alpha){/*{{{*/ 367 368 for(int i=0;i<this->M*this->N;i++) this->values[i] = pow(this->values[i],alpha); 369 for(int i=0;i<TriaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = pow(this->element_values[i],alpha); 370 } 371 /*}}}*/ 366 372 void TriaInput2::AXPY(Input2* xinput,IssmDouble alpha){/*{{{*/ 367 373 368 374 /*xinput is of the same type, so cast it: */ … … 375 381 for(int i=0;i<TriaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*xtriainput->element_values[i] + this->element_values[i]; 376 382 } 377 383 /*}}}*/ 384 void TriaInput2::PointWiseMult(Input2* xinput){/*{{{*/ 378 385 386 /*xinput is of the same type, so cast it: */ 387 if(xinput->ObjectEnum()!=TriaInput2Enum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 388 TriaInput2* xtriainput=xDynamicCast<TriaInput2*>(xinput); 389 if(xtriainput->GetInterpolation()!=this->interpolation) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 390 391 /* we need to check that the vector sizes are identical*/ 392 if(xtriainput->M!=this->M||xtriainput->N!=this->N) _error_("Operation not permitted because the inputs have different sizes"); 393 394 /*Carry out the AXPY operation depending on type:*/ 395 for(int i=0;i<this->M*this->N;i++) this->values[i] = xtriainput->values[i] * this->values[i]; 396 for(int i=0;i<TriaRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = xtriainput->element_values[i] * this->element_values[i]; 397 } 398 /*}}}*/ 399 379 400 /*Object functions*/ -
../trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp
343 343 return input->GetTriaInput(); 344 344 } 345 345 }/*}}}*/ 346 TriaInput2* Inputs2::GetTriaInput(int enum_in,IssmDouble start_time,IssmDouble end_time ){/*{{{*/346 TriaInput2* Inputs2::GetTriaInput(int enum_in,IssmDouble start_time,IssmDouble end_time,int averaging_method){/*{{{*/ 347 347 348 348 /*Get input id*/ 349 349 int id = EnumToIndex(enum_in); … … 353 353 if(!input) return NULL; 354 354 355 355 if(input->ObjectEnum()==TransientInput2Enum){ 356 return xDynamicCast<TransientInput2*>(input)->GetTriaInput(start_time,end_time );356 return xDynamicCast<TransientInput2*>(input)->GetTriaInput(start_time,end_time,averaging_method); 357 357 } 358 358 else{ 359 359 _error_("Input "<<EnumToStringx(enum_in)<<" is not an TransientInput2"); -
../trunk-jpl/src/c/classes/Elements/Tria.h
177 177 void AddInput2(int input_enum, IssmDouble* values, int interpolation_enum); 178 178 void AddControlInput(int input_enum,Inputs2* inputs2,IoModel* iomodel,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id); 179 179 void DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,Inputs2* inputs2,IoModel* iomodel,int input_enum); 180 void CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble init_time,IssmDouble end_time );180 void CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int averaging_method); 181 181 void GetInputAveragesUpToCurrentTime(int input_enum,IssmDouble** pvalues, IssmDouble** ptimes, int* pnumtimes, IssmDouble currenttime); 182 182 IssmDouble GetArea(void); 183 183 IssmDouble GetHorizontalSurfaceArea(void); … … 188 188 int GetElementType(void); 189 189 Input2* GetInput2(int enumtype); 190 190 Input2* GetInput2(int enumtype,IssmDouble time); 191 Input2* GetInput2(int inputenum,IssmDouble start_time, IssmDouble end_time);191 Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time,int averaging_method); 192 192 DatasetInput2* GetDatasetInput2(int inputenum); 193 193 void GetInputValue(IssmDouble* pvalue,Node* node,int enumtype); 194 194 void GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype); -
../trunk-jpl/src/c/classes/Elements/Penta.cpp
1007 1007 this->AddInput2(distanceenum,&ls[0],P1Enum); 1008 1008 } 1009 1009 /*}}}*/ 1010 void Penta::CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble start_time,IssmDouble end_time ){/*{{{*/1010 void Penta::CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble start_time,IssmDouble end_time,int averaging_method){/*{{{*/ 1011 1011 1012 1012 _assert_(end_time>start_time); 1013 1013 … … 1016 1016 IssmDouble current_values[NUMVERTICES]; 1017 1017 IssmDouble dt; 1018 1018 int found,start_offset,end_offset; 1019 int averaging_method=0;1020 1019 1021 1022 1020 /*Get transient input time steps*/ 1023 1021 int numtimesteps; 1024 1022 IssmDouble *timesteps = NULL; -
../trunk-jpl/src/c/classes/Elements/Penta.h
67 67 void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum); 68 68 void CreateDistanceInputFromSegmentlist(IssmDouble* distances,int distanceenum); 69 69 ElementMatrix* CreateBasalMassMatrix(void); 70 void CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble start_time,IssmDouble end_time );70 void CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble start_time,IssmDouble end_time,int averaging_method); 71 71 void ElementResponse(IssmDouble* presponse,int response_enum); 72 72 void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz); 73 73 int FiniteElement(void); … … 85 85 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum); 86 86 Input2* GetInput2(int enumtype); 87 87 Input2* GetInput2(int enumtype,IssmDouble time); 88 Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time ){_error_("not implemented yet!");};88 Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time,int averaging_method){_error_("not implemented yet!");}; 89 89 void GetInputListOnVertices(IssmDouble* pvalue,Input2* input,IssmDouble default_value); 90 90 void GetInputListOnNodes(IssmDouble* pvalue,Input2* input,IssmDouble default_value); 91 91 DatasetInput2* GetDatasetInput2(int inputenum); -
../trunk-jpl/src/c/classes/Elements/Seg.h
64 64 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum); 65 65 Input2* GetInput2(int enumtype); 66 66 Input2* GetInput2(int enumtype,IssmDouble time); 67 Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time ){_error_("not implemented yet!");};67 Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time,int averaging_method){_error_("not implemented yet!");}; 68 68 void GetInputListOnVertices(IssmDouble* pvalue,Input2* input,IssmDouble default_value); 69 69 void GetInputListOnNodes(IssmDouble* pvalue,Input2* input,IssmDouble default_value); 70 70 void GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype){_error_("not implemented yet");}; -
../trunk-jpl/src/c/classes/Elements/Tetra.h
68 68 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");}; 69 69 Input2* GetInput2(int enumtype); 70 70 Input2* GetInput2(int enumtype,IssmDouble time); 71 Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time ){_error_("not implemented yet!");};71 Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time,int averaging_method){_error_("not implemented yet!");}; 72 72 void GetInputListOnVertices(IssmDouble* pvalue,Input2* input,IssmDouble default_value); 73 73 void GetInputListOnNodes(IssmDouble* pvalue,Input2* input,IssmDouble default_value); 74 74 void GetInputValue(IssmDouble* pvalue,Node* node,int enumtype); -
../trunk-jpl/src/c/classes/Elements/Element.h
233 233 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0; 234 234 virtual void ControlToVectors(Vector<IssmPDouble>* vector_control, Vector<IssmPDouble>* vector_gradient,int control_enum)=0; 235 235 virtual void CreateDistanceInputFromSegmentlist(IssmDouble* distances,int distanceenum){_error_("not implemented yet");}; 236 virtual void CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble init_time,IssmDouble end_time ){_error_("not implemented yet "<<this->ObjectEnum());};236 virtual void CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int averaging_method){_error_("not implemented yet "<<this->ObjectEnum());}; 237 237 virtual void ElementResponse(IssmDouble* presponse,int response_enum)=0; 238 238 virtual void ElementSizes(IssmDouble* phx,IssmDouble* phy,IssmDouble* phz)=0; 239 239 virtual int FiniteElement(void)=0; … … 249 249 virtual DatasetInput2* GetDatasetInput2(int inputenum){_error_("not implemented");}; 250 250 virtual Input2* GetInput2(int inputenum)=0; 251 251 virtual Input2* GetInput2(int inputenum,IssmDouble time)=0; 252 virtual Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time )=0;252 virtual Input2* GetInput2(int inputenum,IssmDouble start_time,IssmDouble end_time,int averaging_method)=0; 253 253 virtual void GetInputValue(IssmDouble* pvalue,Vertex* vertex,int enumtype){_error_("not implemented yet");}; 254 254 virtual void GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){_error_("not implemented yet");}; 255 255 virtual void GetInputListOnVertices(IssmDouble* pvalue,Input2* input,IssmDouble default_value)=0; -
../trunk-jpl/src/c/classes/Inputs2/TransientInput2.cpp
289 289 290 290 } 291 291 /*}}}*/ 292 TriaInput2* TransientInput2::GetTriaInput(IssmDouble start_time, IssmDouble end_time ){/*{{{*/292 TriaInput2* TransientInput2::GetTriaInput(IssmDouble start_time, IssmDouble end_time, int averaging_method){/*{{{*/ 293 293 294 294 /*Set current time input*/ 295 this->SetAverageAsCurrentTimeInput(start_time,end_time );295 this->SetAverageAsCurrentTimeInput(start_time,end_time,averaging_method); 296 296 _assert_(this->current_input); 297 297 298 298 /*Cast and return*/ … … 420 420 } 421 421 422 422 }/*}}}*/ 423 void TransientInput2::SetAverageAsCurrentTimeInput(IssmDouble start_time,IssmDouble end_time ){/*{{{*/423 void TransientInput2::SetAverageAsCurrentTimeInput(IssmDouble start_time,IssmDouble end_time, int averaging_method){/*{{{*/ 424 424 425 IssmDouble dt ;425 IssmDouble dt,durinv; 426 426 IssmPDouble eps=1.0e-6; 427 427 IssmDouble dtsum=0; 428 428 int found,start_offset,end_offset; 429 int averaging_method = 0;430 429 431 430 /*go through the timesteps, and grab offset for start and end*/ 432 431 IssmDouble temp = start_time-eps; … … 462 461 } 463 462 break; 464 463 case 1: /*Geometric mean*/ 465 _error_("Geometric not implemented yet"); 464 if(offset==start_offset){ 465 this->current_input = stepinput->copy(); 466 this->current_input->Scale(dt); 467 } 468 else{ 469 this->stepinput->Scale(dt); 470 this->current_input->PointWiseMult(stepinput) 471 } 472 break; 466 473 case 2: /*Harmonic mean*/ 467 _error_("Harmonic not implemented yet"); 474 if(offset==start_offset){ 475 this->current_input = stepinput->copy(); 476 this->current_input->Pow(-1); 477 this->current_input->Scale(dt); 478 } 479 else{ 480 this->stepinput->Pow(-1); 481 this->current_input->AXPY(stepinput,dt); 482 } 468 483 default: 469 484 _error_("averaging method is not recognised"); 470 485 } … … 471 486 dtsum+=dt; 472 487 offset+=1; 473 488 } 474 /*Integration done, now normalize*/ 489 _assert_(dtsum>0); 490 durinv=1./dtsum; 491 /*Integration done, now normalize*/ 475 492 switch(averaging_method){ 476 493 case 0: //Arithmetic mean 477 this->current_input->Scale( 1/(dtsum));494 this->current_input->Scale(durinv); 478 495 break; 479 496 case 1: /*Geometric mean*/ 480 _error_("Geometric not implemented yet"); 497 this->current_input->Pow(durinv); 498 break; 481 499 case 2: /*Harmonic mean*/ 482 _error_("Harmonic not implemented yet"); 500 this->current_input->Scale(durinv); 501 this->current_input->Pow(-1); 483 502 default: 484 503 _error_("averaging method is not recognised"); 485 504 } -
../trunk-jpl/src/c/classes/FemModel.cpp
5274 5274 } 5275 5275 } 5276 5276 /*}}}*/ 5277 void FemModel::AverageTransientInputx(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs ){ /*{{{*/5277 void FemModel::AverageTransientInputx(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs,int averaging_method){ /*{{{*/ 5278 5278 5279 5279 for(int i=0;i<numoutputs;i++){ 5280 5280 for(int j=0;j<this->elements->Size();j++){ 5281 5281 Element* element = xDynamicCast<Element*>(elements->GetObjectByOffset(j)); 5282 element->CreateInputTimeAverage(transientinput_enum[i],averagedinput_enum[i],init_time,end_time );5282 element->CreateInputTimeAverage(transientinput_enum[i],averagedinput_enum[i],init_time,end_time,averaging_method); 5283 5283 } 5284 5284 } 5285 5285 }/*}}}*/ -
../trunk-jpl/src/c/classes/Elements/Tria.cpp
1912 1912 return input; 1913 1913 } 1914 1914 }/*}}}*/ 1915 Input2* Tria::GetInput2(int inputenum,IssmDouble start_time, IssmDouble end_time ){/*{{{*/1915 Input2* Tria::GetInput2(int inputenum,IssmDouble start_time, IssmDouble end_time, int averaging_method){/*{{{*/ 1916 1916 1917 1917 /*Get Input from dataset*/ 1918 1918 if(this->iscollapsed){ … … 1919 1919 _error_("Get Average input not implemented in Penta yet"); 1920 1920 } 1921 1921 else{ 1922 TriaInput2* input = this->inputs2->GetTriaInput(inputenum,start_time, end_time );1922 TriaInput2* input = this->inputs2->GetTriaInput(inputenum,start_time, end_time, int averaging_method); 1923 1923 if(!input) return input; 1924 1924 1925 1925 this->InputServe(input); … … 2108 2108 2109 2109 return datasetinput; 2110 2110 }/*}}}*/ 2111 void Tria::CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble start_time,IssmDouble end_time ){/*{{{*/2111 void Tria::CreateInputTimeAverage(int transientinput_enum,int averagedinput_enum,IssmDouble start_time,IssmDouble end_time, int averaging_method){/*{{{*/ 2112 2112 2113 2113 _assert_(end_time>start_time); 2114 2114 … … 2117 2117 IssmDouble current_values[NUMVERTICES]; 2118 2118 IssmDouble dt; 2119 2119 int found,start_offset,end_offset; 2120 int averaging_method=0;2121 2120 2122 2123 2121 /*Get transient input time steps*/ 2124 2122 int numtimesteps; 2125 2123 IssmDouble *timesteps = NULL; … … 2212 2210 for(int iv=0;iv<NUMVERTICES;iv++) averaged_values[iv] = pow(averaged_values[iv], 1./(end_time - start_time)); 2213 2211 break; 2214 2212 case 2: /*Harmonic mean*/ 2215 for(int iv=0;iv<NUMVERTICES;iv++) averaged_values[iv] = 1./(averaged_values[iv]/(end_time - start_time));2213 for(int iv=0;iv<NUMVERTICES;iv++) averaged_values[iv] = (end_time - start_time)/(averaged_values[iv]; 2216 2214 break; 2217 2215 default: 2218 2216 _error_("averaging method is not recognised"); -
../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
335 335 int smb_model; 336 336 int smbsubstepping; 337 337 int hydrologysubstepping; 338 int smb_averaging; 338 339 IssmDouble dt,scalar,sediment_storing; 339 340 IssmDouble water_head,sediment_transmitivity; 340 341 IssmDouble water_load,runoff_value,transfer; … … 358 359 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 359 360 basalelement->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum); 360 361 basalelement->FindParam(&smb_model,SmbEnum); 362 basalelement->FindParam(&smb_averaging,SmbAveragingEnum); 361 363 362 364 Input2* sed_head_input = basalelement->GetInput2(SedimentHeadSubstepEnum); 363 365 Input2* epl_head_input = basalelement->GetInput2(EplHeadSubstepEnum); … … 383 385 dummy_input = basalelement->GetInput2(SmbRunoffTransientEnum, time); _assert_(dummy_input); 384 386 } 385 387 else{ 386 dummy_input = basalelement->GetInput2(SmbRunoffTransientEnum,time-dt,time ); _assert_(dummy_input);388 dummy_input = basalelement->GetInput2(SmbRunoffTransientEnum,time-dt,time,smb_averaging); _assert_(dummy_input); 387 389 } 388 390 surface_runoff_input=xDynamicCast<Input2*>(dummy_input); _assert_(surface_runoff_input); 389 391 }
Note:
See TracBrowser
for help on using the repository browser.