Changeset 24790
- Timestamp:
- 05/05/20 06:20:58 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
r24565 r24790 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; … … 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); … … 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); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r24716 r24790 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; … … 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");}; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r24711 r24790 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); … … 1017 1017 IssmDouble dt; 1018 1018 int found,start_offset,end_offset; 1019 int averaging_method=0;1020 1021 1019 1022 1020 /*Get transient input time steps*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r24711 r24790 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); … … 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); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r24565 r24790 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); -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r24565 r24790 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); -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r24750 r24790 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*/ … … 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 … … 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); … … 2118 2118 IssmDouble dt; 2119 2119 int found,start_offset,end_offset; 2120 int averaging_method=0;2121 2122 2120 2123 2121 /*Get transient input time steps*/ … … 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: -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r24565 r24790 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); … … 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); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r24656 r24790 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 } -
issm/trunk-jpl/src/c/classes/FemModel.h
r24565 r24790 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); -
issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.cpp
r24565 r24790 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*/ … … 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{ -
issm/trunk-jpl/src/c/classes/Inputs2/Inputs2.h
r24565 r24790 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); -
issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.cpp
r24556 r24790 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 … … 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 } … … 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 } … … 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 } … … 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 … … 401 407 } 402 408 /*}}}*/ 409 void PentaInput2::PointWiseMult(Input2* xinput){/*{{{*/ 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 /*}}}*/ 403 424 404 425 /*Object functions*/ -
issm/trunk-jpl/src/c/classes/Inputs2/PentaInput2.h
r24335 r24790 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); -
issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.cpp
r24335 r24790 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 … … 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 } … … 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 } … … 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 } … … 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 } … … 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*xtriainput->values[i] + this->values[i]; 320 for(int i=0;i<SegRef::NumberofNodes(this->interpolation);i++) this->element_values[i] = alpha*xtriainput->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]; 327 } 328 /*}}}*/ 329 void SegInput2::PointWiseMult(Input2* xinput){/*{{{*/ 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]; 321 342 } 322 343 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Inputs2/SegInput2.h
r24335 r24790 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); -
issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.cpp
r24711 r24790 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 … … 421 421 422 422 }/*}}}*/ 423 void TransientInput2::SetAverageAsCurrentTimeInput(IssmDouble start_time,IssmDouble end_time ){/*{{{*/424 425 IssmDouble dt ;423 void TransientInput2::SetAverageAsCurrentTimeInput(IssmDouble start_time,IssmDouble end_time, int averaging_method){/*{{{*/ 424 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*/ … … 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"); … … 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"); -
issm/trunk-jpl/src/c/classes/Inputs2/TransientInput2.h
r24565 r24790 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(); … … 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 -
issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.cpp
r24360 r24790 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 … … 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 } … … 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 } … … 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 } … … 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 } … … 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 … … 376 382 } 377 383 /*}}}*/ 384 void TriaInput2::PointWiseMult(Input2* xinput){/*{{{*/ 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 /*}}}*/ 378 399 379 400 /*Object functions*/ -
issm/trunk-jpl/src/c/classes/Inputs2/TriaInput2.h
r24335 r24790 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); -
issm/trunk-jpl/src/c/cores/hydrology_core.cpp
r24565 r24790 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; … … 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 … … 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*/ -
issm/trunk-jpl/src/c/cores/smb_core.cpp
r24656 r24790 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; … … 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 … … 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);
Note:
See TracChangeset
for help on using the changeset viewer.