source:
issm/oecreview/Archive/24684-25833/ISSM-25488-25489.diff
Last change on this file was 25834, checked in by , 4 years ago | |
---|---|
File size: 14.7 KB |
-
../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
35 35 /*Assign output pointers:*/ 36 36 *pvector=vector; 37 37 } /*}}}*/ 38 void GetVectoronBaseFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){ /*{{{*/ 39 40 int i, domaintype; 41 Vector<IssmDouble>* vector=NULL; 42 43 switch(type){ 44 case ElementSIdEnum: 45 vector=new Vector<IssmDouble>(femmodel->elements->NumberOfElements()); 46 break; 47 case VertexPIdEnum: case VertexSIdEnum: 48 vector=new Vector<IssmDouble>(femmodel->vertices->NumberOfVertices()); 49 break; 50 case NodesEnum:case NodeSIdEnum: 51 vector=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes()); 52 break; 53 default: 54 _error_("vector type: " << EnumToStringx(type) << " not supported yet!"); 55 } 56 57 /*Look up in elements*/ 58 for(i=0;i<femmodel->elements->Size();i++){ 59 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 60 element->FindParam(&domaintype,DomainTypeEnum); 61 switch(domaintype){ 62 case Domain2DhorizontalEnum: 63 element->GetVectorFromInputs(vector,name,type); 64 break; 65 case Domain3DEnum: 66 if(!element->IsOnBase()) continue; 67 element->GetVectorFromInputs(vector,name,type); 68 break; 69 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 70 } 71 } 72 vector->Assemble(); 73 /*Assign output pointers:*/ 74 *pvector=vector; 75 } /*}}}*/ 38 76 void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type,IssmDouble time){/*{{{*/ 39 77 40 78 int i; … … 78 116 /*Assign output pointers:*/ 79 117 *pvector=vector; 80 118 }/*}}}*/ 119 void GetVectoronBaseFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name, int type){/*{{{*/ 120 121 /*output: */ 122 IssmDouble* vector=NULL; 123 124 /*intermediary: */ 125 Vector<IssmDouble>* vec_vector=NULL; 126 127 GetVectoronBaseFromInputsx(&vec_vector,femmodel,name,type); 128 vector=vec_vector->ToMPISerial(); 129 130 /*Free ressources:*/ 131 delete vec_vector; 132 133 /*Assign output pointers:*/ 134 *pvector=vector; 135 }/*}}}*/ 81 136 void GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name){ /*{{{*/ 82 137 83 138 int interpolation_type; 84 /*this one is special: we don't specify the type, but let the nature of the inputs dictace. 139 /*this one is special: we don't specify the type, but let the nature of the inputs dictace. 85 140 * P0 -> ElementSIdEnum, P1 ->VertexSIdEnum: */ 86 141 87 142 /*We go find the input of the first element, and query its interpolation type: */ 88 143 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(0)); 89 Input* input=element->GetInput(name); 144 Input* input=element->GetInput(name); 90 145 if (!input) _error_("could not find input: " << name); 91 146 92 interpolation_type=input->GetInputInterpolationType(); 147 interpolation_type=input->GetInputInterpolationType(); 93 148 if(interpolation_type==P0Enum){ 94 149 *pvector_size=femmodel->elements->NumberOfElements(); 95 150 GetVectorFromInputsx(pvector,femmodel,name, ElementSIdEnum); -
../trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.h
1 1 /*!\file: GetVectorFromInputsx.h 2 */ 2 */ 3 3 4 4 #ifndef _GETVECTORFROMINPUTSXX_H 5 5 #define _GETVECTORFROMINPUTSXX_H … … 7 7 #include "../../classes/classes.h" 8 8 9 9 /* local prototypes: */ 10 void GetVectorFromInputsx( Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type); 11 void GetVectorFromInputsx( IssmDouble** pvector,FemModel* femmodel,int name,int type); 12 void GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name); 13 void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type,IssmDouble time); 10 void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type); 11 void GetVectoronBaseFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type); 12 void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type,IssmDouble time); 13 void GetVectorFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name,int type); 14 void GetVectoronBaseFromInputsx(IssmDouble** pvector,FemModel* femmodel,int name,int type); 15 void GetVectorFromInputsx(IssmDouble** pvector,int* pvector_size, FemModel* femmodel,int name); 14 16 17 15 18 #endif /* _GETVECTORFROMINPUTSXX_H */ -
../trunk-jpl/src/c/cores/hydrology_core.cpp
115 115 /*Proceed now to heads computations*/ 116 116 solutionsequence_hydro_nonlinear(femmodel); 117 117 /*If we have a sub-timestep we store the substep inputs in a transient input here*/ 118 femmodel->StackTransientInput x(&substepinput[0],&transientinput[0],subtime,numaveragedinput);118 femmodel->StackTransientInputonBasex(&substepinput[0],&transientinput[0],subtime,numaveragedinput); 119 119 } 120 120 /*averaging the stack*/ 121 femmodel->AverageTransientInput x(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput,hydro_averaging);121 femmodel->AverageTransientInputonBasex(&transientinput[0],&averagedinput[0],global_time-dt,subtime,numaveragedinput,hydro_averaging); 122 122 /*And reseting to global time*/ 123 123 femmodel->parameters->SetParam(dt,TimesteppingTimeStepEnum); 124 124 femmodel->parameters->SetParam(global_time,TimeEnum); -
../trunk-jpl/src/c/classes/FemModel.h
178 178 void UpdateConstraintsL2ProjectionEPLx(IssmDouble* pL2count); 179 179 void InitTransientInputx(int* transientinput_enum,int numoutputs); 180 180 void StackTransientInputx(int* input_enum,int* transientinput_enum,IssmDouble hydrotime,int numoutputs); 181 void StackTransientInputonBasex(int* input_enum,int* transientinput_enum,IssmDouble hydrotime,int numoutputs); 181 182 void AverageTransientInputx(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs,int averaging_method); 183 void AverageTransientInputonBasex(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs,int averaging_method); 182 184 void UpdateConstraintsx(void); 183 185 int UpdateVertexPositionsx(void); 184 186 -
../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
687 687 688 688 bool element_active; 689 689 Element* element=NULL; 690 691 for(int i=0;i< femmodel->elements->Size();i++){690 int elementssize=femmodel->elements->Size(); 691 for(int i=0;i<elementssize;i++){ 692 692 element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 693 693 694 694 Input* input=element->GetInput(HydrologydcMaskEplactiveNodeEnum); _assert_(input); … … 747 747 748 748 bool element_active; 749 749 Element* element=NULL; 750 751 for(int i=0;i< femmodel->elements->Size();i++){750 int elementssize = femmodel->elements->Size(); 751 for(int i=0;i<elementssize;i++){ 752 752 element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 753 753 754 754 Input* input=element->GetInput(HydrologydcMaskThawedNodeEnum); _assert_(input); -
../trunk-jpl/src/c/classes/FemModel.cpp
48 48 #include "../modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h" 49 49 #include "../modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h" 50 50 #include "../modules/NodalValuex/NodalValuex.h" 51 #include "../modules/GetVectorFromInputsx/GetVectorFromInputsx.h"52 51 #include "../modules/AverageOntoPartitionx/AverageOntoPartitionx.h" 53 52 /*}}}*/ 54 53 … … 4542 4541 int npart; 4543 4542 4544 4543 /*retrieve partition vectors for responses that are scaled:*/ 4545 this->parameters->FindParam(&response_partitions,&response_partitions_num,NULL,NULL,QmuResponsePartitionsEnum); 4546 this->parameters->FindParam(&response_partitions_npart,NULL,NULL,QmuResponsePartitionsNpartEnum); 4547 4544 this->parameters->FindParam(&response_partitions,&response_partitions_num,NULL,NULL,QmuResponsePartitionsEnum); 4545 this->parameters->FindParam(&response_partitions_npart,NULL,NULL,QmuResponsePartitionsNpartEnum); 4546 4548 4547 /*retrieve my_rank: */ 4549 4548 my_rank=IssmComm::GetRank(); 4550 4549 … … 5020 5019 recurence=new Vector<IssmDouble>(numnodes); 5021 5020 this->parameters->FindParam(&eplzigzag_counter,NULL,EplZigZagCounterEnum); 5022 5021 this->parameters->FindParam(&eplflip_lock,HydrologydcEplflipLockEnum); 5023 GetVector FromInputsx(&old_active,this,HydrologydcMaskEplactiveNodeEnum,NodeSIdEnum);5022 GetVectoronBaseFromInputsx(&old_active,this,HydrologydcMaskEplactiveNodeEnum,NodeSIdEnum); 5024 5023 5025 5024 for (int i=0;i<elements->Size();i++){ 5026 5025 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); … … 5067 5066 5068 5067 /*Update node activation accordingly*/ 5069 5068 int counter = 0; //this is probably not acurate but we are only interested in positivity 5069 Element* basalelement=NULL; 5070 5070 for(int i=0;i<elements->Size();i++){ 5071 5071 Element *element = xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 5072 int numnodes = element->GetNumberOfNodes(); 5072 switch(domaintype){ 5073 case Domain2DhorizontalEnum: 5074 basalelement = element; 5075 break; 5076 case Domain3DEnum: 5077 if(!element->IsOnBase()) continue; 5078 basalelement = element->SpawnBasalElement(); 5079 break; 5080 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 5081 } 5082 5083 int numnodes = basalelement->GetNumberOfNodes(); 5073 5084 IssmDouble *base = xNew<IssmDouble>(numnodes); 5074 element->GetInputListOnNodes(&base[0],BaseEnum);5085 basalelement->GetInputListOnNodes(&base[0],BaseEnum); 5075 5086 for(int in=0;in<numnodes;in++){ 5076 Node* node= element->GetNode(in);5087 Node* node=basalelement->GetNode(in); 5077 5088 if(serial_active[node->Sid()]==1.){ 5078 5089 node->Activate(); 5079 5090 if(!node->IsClone()) counter++; … … 5084 5095 } 5085 5096 } 5086 5097 xDelete<IssmDouble>(base); 5098 if(domaintype!=Domain2DhorizontalEnum){ 5099 basalelement->DeleteMaterials(); 5100 delete basalelement; 5101 } 5087 5102 } 5088 5103 xDelete<IssmDouble>(serial_active); 5089 5104 delete effanalysis; … … 5133 5148 } 5134 5149 /*for other cases we just grab the mask from the initialisation value*/ 5135 5150 else{ 5136 GetVector FromInputsx(&serial_mask,this,HydrologydcMaskThawedNodeEnum,NodeSIdEnum);5151 GetVectoronBaseFromInputsx(&serial_mask,this,HydrologydcMaskThawedNodeEnum,NodeSIdEnum); 5137 5152 } 5138 5153 /*Update Mask and elementize*/ 5139 5154 InputUpdateFromVectorx(this,serial_mask,HydrologydcMaskThawedNodeEnum,NodeSIdEnum); … … 5280 5295 } 5281 5296 } 5282 5297 /*}}}*/ 5298 void FemModel::StackTransientInputonBasex(int* input_enum,int* transientinput_enum,IssmDouble subtime,int numoutputs){ /*{{{*/ 5299 5300 Element* basalelement=NULL; 5301 int domaintype; 5302 this->parameters->FindParam(&domaintype,DomainTypeEnum); 5303 5304 for(int i=0;i<numoutputs;i++){ 5305 if(input_enum[i]<0){ 5306 _error_("Can't deal with non enum fields for result Stack"); 5307 } 5308 else{ 5309 for(int j=0;j<elements->Size();j++){ 5310 /*Get the right transient input*/ 5311 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j)); 5312 /*Get basal element*/ 5313 switch(domaintype){ 5314 case Domain2DhorizontalEnum: 5315 break; 5316 case Domain3DEnum: 5317 if(!element->IsOnBase()) continue; 5318 break; 5319 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 5320 } 5321 /*Get values and lid list*/ 5322 TransientInput* transientinput = this->inputs->GetTransientInput(transientinput_enum[i]); 5323 const int numvertices = element->GetNumberOfVertices(); 5324 IssmDouble* values = xNew<IssmDouble>(numvertices); 5325 int *vertexlids = xNew<int>(numvertices); 5326 switch(domaintype){ 5327 case Domain2DhorizontalEnum: 5328 element->GetInputListOnVertices(&values[0],input_enum[i]); //this is the enum to stack 5329 element->GetVerticesLidList(vertexlids); 5330 transientinput->AddTriaTimeInput(subtime,numvertices,vertexlids,values,P1Enum); 5331 break; 5332 case Domain3DEnum:{ 5333 element->GetInputListOnVertices(&values[0],input_enum[i]); //this is the enum to stack 5334 element->GetVerticesLidList(vertexlids); 5335 Penta* penta=xDynamicCast<Penta*>(elements->GetObjectByOffset(j)); 5336 for(;;){ 5337 transientinput->AddPentaTimeInput(subtime,numvertices,vertexlids,values,P1Enum); 5338 if (penta->IsOnSurface()) break; 5339 penta=penta->GetUpperPenta(); _assert_(penta->Id()!=element->id); 5340 penta->GetVerticesLidList(vertexlids); 5341 } 5342 break; 5343 } 5344 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 5345 } 5346 xDelete<IssmDouble>(values); 5347 xDelete<int>(vertexlids); 5348 } 5349 } 5350 } 5351 } 5352 /*}}}*/ 5283 5353 void FemModel::AverageTransientInputx(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs, int averaging_method){ /*{{{*/ 5284 5354 5285 5355 for(int i=0;i<numoutputs;i++){ … … 5289 5359 } 5290 5360 } 5291 5361 }/*}}}*/ 5362 void FemModel::AverageTransientInputonBasex(int* transientinput_enum,int* averagedinput_enum,IssmDouble init_time,IssmDouble end_time,int numoutputs, int averaging_method){ /*{{{*/ 5363 5364 int domaintype; 5365 this->parameters->FindParam(&domaintype,DomainTypeEnum); 5366 5367 for(int i=0;i<numoutputs;i++){ 5368 for(int j=0;j<this->elements->Size();j++){ 5369 Element* element = xDynamicCast<Element*>(elements->GetObjectByOffset(j)); 5370 /*Get basal element*/ 5371 switch(domaintype){ 5372 case Domain2DhorizontalEnum: 5373 element->CreateInputTimeAverage(transientinput_enum[i],averagedinput_enum[i],init_time,end_time,averaging_method);; 5374 break; 5375 case Domain3DEnum: 5376 if(!element->IsOnBase()) continue; 5377 element->CreateInputTimeAverage(transientinput_enum[i],averagedinput_enum[i],init_time,end_time,averaging_method); 5378 break; 5379 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 5380 } 5381 } 5382 } 5383 }/*}}}*/ 5292 5384 #ifdef _HAVE_JAVASCRIPT_ 5293 5385 FemModel::FemModel(IssmDouble* buffer, int buffersize, char* toolkits, char* solution, char* modelname,ISSM_MPI_Comm incomm, bool trace){ /*{{{*/ 5294 5386 /*configuration: */
Note:
See TracBrowser
for help on using the repository browser.