Changeset 17100
- Timestamp:
- 01/13/14 13:45:05 (11 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 1 added
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r17094 r17100 153 153 return shelf; 154 154 }/*}}}*/ 155 void Element::ResultInterpolation(int* pinterpolation,int output_enum){/*{{{*/155 void Element::ResultInterpolation(int* pinterpolation,int* pnodesperelement,int output_enum){/*{{{*/ 156 156 157 157 Input* input=this->inputs->GetInput(output_enum); … … 194 194 195 195 /*Assign output pointer*/ 196 *pinterpolation = input->GetResultInterpolation(); 196 *pinterpolation = input->GetResultInterpolation(); 197 *pnodesperelement = input->GetResultNumberOfNodes(); 197 198 }/*}}}*/ 198 199 void Element::ResultToVector(Vector<IssmDouble>* vector,int output_enum){/*{{{*/ … … 242 243 } 243 244 } /*}}}*/ 245 void Element::ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum){/*{{{*/ 246 247 Input* input=this->inputs->GetInput(output_enum); 248 if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element"); 249 250 input->ResultToPatch(values,nodesperelement,this->Sid()); 251 252 } /*}}}*/ 244 253 IssmDouble Element::TMeltingPoint(IssmDouble pressure){/*{{{*/ 245 254 _assert_(matpar); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r17047 r17100 65 65 void GetVerticesConnectivityList(int* connectivitylist); 66 66 bool IsFloating(); 67 void ResultInterpolation(int* pinterpolation,int output_enum);67 void ResultInterpolation(int* pinterpolation,int*nodesperelement,int output_enum); 68 68 void ResultToVector(Vector<IssmDouble>* vector,int output_enum); 69 void ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum); 69 70 void StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); 70 71 void StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r17064 r17100 22 22 #include "../modules/ConfigureObjectsx/ConfigureObjectsx.h" 23 23 #include "../modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.h" 24 #include "../modules/OutputResultsx/OutputResultsx.h"25 24 #include "../modules/GetVectorFromInputsx/GetVectorFromInputsx.h" 26 25 #include "../modules/InputUpdateFromVectorx/InputUpdateFromVectorx.h" … … 471 470 472 471 /*Intermediaries*/ 473 bool isvec ;472 bool isvec,results_on_nodes; 474 473 int step,output_enum; 475 474 IssmDouble time; … … 484 483 parameters->FindParam(&step,StepEnum); 485 484 parameters->FindParam(&time,TimeEnum); 485 parameters->FindParam(&results_on_nodes,SettingsResultsOnNodesEnum); 486 486 487 487 /*Go through all requested output*/ … … 541 541 542 542 /*Vector layout*/ 543 int interpolation, size;543 int interpolation,nodesperelement,size; 544 544 545 545 /*Get interpolation (and compute input if necessary)*/ 546 546 for(int j=0;j<elements->Size();j++){ 547 547 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(j)); 548 element->ResultInterpolation(&interpolation, output_enum);548 element->ResultInterpolation(&interpolation,&nodesperelement,output_enum); 549 549 } 550 550 551 /*Allocate vector depending on interpolation*/ 552 switch(interpolation){ 553 case P0Enum: size = this->elements->NumberOfElements(); break; 554 case P1Enum: size = this->vertices->NumberOfVertices(); break; 555 default: _error_("Interpolation "<<EnumToStringx(interpolation)<<" not supported yet"); 551 if(results_on_nodes){ 552 553 /*Allocate matrices*/ 554 int nbe = this->elements->NumberOfElements(); 555 IssmDouble* values = xNew<IssmDouble>(nbe*nodesperelement); 556 IssmDouble* allvalues = xNew<IssmDouble>(nbe*nodesperelement); 557 558 /*Fill-in matrix*/ 559 for(int j=0;j<elements->Size();j++){ 560 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(j)); 561 element->ResultToPatch(values,nodesperelement,output_enum); 562 } 563 564 /*Gather from all cpus*/ 565 MPI_Allreduce((void*)values,(void*)allvalues,nbe*nodesperelement,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); 566 xDelete<IssmDouble>(values); 567 568 if(save_results)results->AddResult(new GenericExternalResult<IssmDouble*>(results->Size()+1,output_enum,allvalues,nbe,nodesperelement,step,time)); 556 569 557 570 } 558 Vector<IssmDouble> *vector_result = new Vector<IssmDouble>(size); 559 560 /*Fill in vector*/ 561 for(int j=0;j<elements->Size();j++){ 562 Element* element=(Element*)elements->GetObjectByOffset(j); 563 element->ResultToVector(vector_result,output_enum); 571 else{ 572 573 /*Allocate vector depending on interpolation*/ 574 switch(interpolation){ 575 case P0Enum: size = this->elements->NumberOfElements(); break; 576 case P1Enum: size = this->vertices->NumberOfVertices(); break; 577 default: _error_("Interpolation "<<EnumToStringx(interpolation)<<" not supported yet"); 578 579 } 580 Vector<IssmDouble> *vector_result = new Vector<IssmDouble>(size); 581 582 /*Fill in vector*/ 583 for(int j=0;j<elements->Size();j++){ 584 Element* element=(Element*)elements->GetObjectByOffset(j); 585 element->ResultToVector(vector_result,output_enum); 586 } 587 vector_result->Assemble(); 588 589 if(save_results)results->AddResult(new GenericExternalResult<Vector<IssmDouble>*>(results->Size()+1,output_enum,vector_result,step,time)); 564 590 } 565 vector_result->Assemble();566 567 if (save_results)results->AddResult(new GenericExternalResult<Vector<IssmDouble>*>(results->Size()+1,output_enum,vector_result,step,time));568 591 isvec = true; 569 592 break; -
issm/trunk-jpl/src/c/classes/Inputs/BoolInput.h
r17094 r17100 36 36 Input* PointwiseMax(Input* inputB){_error_("not implemented yet");}; 37 37 int GetResultInterpolation(void){return P0Enum;}; 38 int GetResultNumberOfNodes(void){return 1;}; 39 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 38 40 void Configure(Parameters* parameters); 39 41 void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");}; -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
r16818 r17100 146 146 } 147 147 /*}}}*/ 148 /*FUNCTION ControlInput::GetResultNumberOfNodes{{{*/ 149 int ControlInput::GetResultNumberOfNodes(void){ 150 151 return values->GetResultNumberOfNodes(); 152 153 } 154 /*}}}*/ 148 155 /*FUNCTION ControlInput::GetGradient{{{*/ 149 156 void ControlInput::GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist){ -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h
r17094 r17100 77 77 void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist); 78 78 int GetResultInterpolation(void); 79 int GetResultNumberOfNodes(void); 80 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 79 81 void GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist); 80 82 void ScaleGradient(IssmDouble scale); -
issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h
r17094 r17100 72 72 void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){_error_("not implemented yet");}; 73 73 int GetResultInterpolation(void){_error_("not implemented yet");}; 74 int GetResultNumberOfNodes(void){_error_("not implemented yet");}; 75 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 74 76 void GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist){_error_("not implemented yet");}; 75 77 void ScaleGradient(IssmDouble scale){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.h
r17094 r17100 39 39 Input* PointwiseMax(Input* inputB); 40 40 int GetResultInterpolation(void){return P0Enum;}; 41 int GetResultNumberOfNodes(void){return 1;}; 42 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 41 43 void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");}; 42 44 void Configure(Parameters* parameters); -
issm/trunk-jpl/src/c/classes/Inputs/Input.h
r17094 r17100 46 46 virtual IssmDouble Max(void)=0; 47 47 virtual IssmDouble Min(void)=0; 48 virtual void Set(IssmDouble setvalue)=0;48 virtual void Set(IssmDouble setvalue)=0; 49 49 virtual void Scale(IssmDouble scale_factor)=0; 50 50 virtual void AXPY(Input* xinput,IssmDouble scalar)=0; … … 59 59 virtual Input* PointwiseMax(Input* inputmax)=0; 60 60 virtual Input* PointwiseMin(Input* inputmin)=0; 61 virtual int GetResultInterpolation(void)=0; 61 virtual int GetResultInterpolation(void)=0; 62 virtual int GetResultNumberOfNodes(void)=0; 63 virtual void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 62 64 }; 63 65 #endif -
issm/trunk-jpl/src/c/classes/Inputs/IntInput.h
r17094 r17100 40 40 Input* PointwiseMax(Input* inputB){_error_("not implemented yet");}; 41 41 int GetResultInterpolation(void){return P0Enum;}; 42 int GetResultNumberOfNodes(void){return 1;}; 43 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 42 44 void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");}; 43 45 void Configure(Parameters* parameters); -
issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp
r17094 r17100 135 135 } 136 136 /*}}}*/ 137 /*FUNCTION PentaInput::GetResultNumberOfNodes{{{*/ 138 int PentaInput::GetResultNumberOfNodes(void){ 139 140 return this->NumberofNodes();; 141 142 } 143 /*}}}*/ 137 144 138 145 /*Object functions*/ -
issm/trunk-jpl/src/c/classes/Inputs/PentaInput.h
r17094 r17100 40 40 Input* PointwiseMax(Input* inputB); 41 41 int GetResultInterpolation(void); 42 int GetResultNumberOfNodes(void); 43 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 42 44 void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");}; 43 45 void Configure(Parameters* parameters); -
issm/trunk-jpl/src/c/classes/Inputs/SegInput.h
r17094 r17100 40 40 Input* PointwiseMax(Input* inputB){_error_("not supported yet");}; 41 41 int GetResultInterpolation(void){_error_("not implemented");}; 42 int GetResultNumberOfNodes(void){_error_("not implemented");}; 43 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 42 44 void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");}; 43 45 void Configure(Parameters* parameters); -
issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp
r16799 r17100 352 352 } 353 353 /*}}}*/ 354 /*FUNCTION TransientInput::GetResultNumberOfNodes{{{*/ 355 int TransientInput::GetResultNumberOfNodes(void){ 356 357 IssmDouble time; 358 int output; 359 360 parameters->FindParam(&time,TimeEnum); 361 Input* input=GetTimeInput(time); 362 output = input->GetResultNumberOfNodes(); 363 364 /*Clean up and return*/ 365 delete input; 366 return output; 367 368 } 369 /*}}}*/ 354 370 /*FUNCTION TransientInput::Extrude{{{*/ 355 371 void TransientInput::Extrude(void){ -
issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h
r17094 r17100 46 46 Input* PointwiseMax(Input* forcingB){_error_("not implemented yet");}; 47 47 int GetResultInterpolation(void); 48 int GetResultNumberOfNodes(void); 49 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");}; 48 50 void Configure(Parameters* parameters); 49 51 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp
r17094 r17100 122 122 } 123 123 /*}}}*/ 124 /*FUNCTION TriaInput::GetResultNumberOfNodes{{{*/ 125 int TriaInput::GetResultNumberOfNodes(void){ 126 127 return this->NumberofNodes(); 128 129 } 130 /*}}}*/ 131 /*FUNCTION TriaInput::ResultToPatch{{{*/ 132 void TriaInput::ResultToPatch(IssmDouble* values,int nodesperelement,int sid){ 133 134 int numnodes = this->NumberofNodes(); 135 136 /*Some checks*/ 137 _assert_(values); 138 _assert_(numnodes==nodesperelement); 139 140 /*Fill in arrays*/ 141 for(int i=0;i<numnodes;i++){ 142 values[sid*numnodes + i] = this->values[i]; 143 } 144 145 146 147 } 148 /*}}}*/ 124 149 125 150 /*Object functions*/ -
issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h
r17094 r17100 40 40 Input* PointwiseMax(Input* inputB); 41 41 int GetResultInterpolation(void); 42 int GetResultNumberOfNodes(void); 43 void ResultToPatch(IssmDouble* values,int nodesperelement,int sid); 42 44 void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");}; 43 45 void Configure(Parameters* parameters); -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r17085 r17100 60 60 parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofelementsEnum)); 61 61 parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofverticesEnum)); 62 parameters->AddObject(iomodel->CopyConstantObject(SettingsResultsOnNodesEnum)); 62 63 parameters->AddObject(iomodel->CopyConstantObject(SettingsIoGatherEnum)); 63 64 parameters->AddObject(iomodel->CopyConstantObject(GroundinglineMigrationEnum)); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r17098 r17100 233 233 RiftsNumriftsEnum, 234 234 RiftsRiftstructEnum, 235 SettingsResultsOnNodesEnum, 235 236 SettingsIoGatherEnum, 236 237 SettingsLowmemEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r17098 r17100 241 241 case RiftsNumriftsEnum : return "RiftsNumrifts"; 242 242 case RiftsRiftstructEnum : return "RiftsRiftstruct"; 243 case SettingsResultsOnNodesEnum : return "SettingsResultsOnNodes"; 243 244 case SettingsIoGatherEnum : return "SettingsIoGather"; 244 245 case SettingsLowmemEnum : return "SettingsLowmem"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r17098 r17100 244 244 else if (strcmp(name,"RiftsNumrifts")==0) return RiftsNumriftsEnum; 245 245 else if (strcmp(name,"RiftsRiftstruct")==0) return RiftsRiftstructEnum; 246 else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum; 246 247 else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum; 247 248 else if (strcmp(name,"SettingsLowmem")==0) return SettingsLowmemEnum; … … 259 260 else if (strcmp(name,"Surface")==0) return SurfaceEnum; 260 261 else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum; 261 else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;262 262 else stage=3; 263 263 } 264 264 if(stage==3){ 265 if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum; 265 if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum; 266 else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum; 266 267 else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum; 267 268 else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum; … … 382 383 else if (strcmp(name,"BoolInput")==0) return BoolInputEnum; 383 384 else if (strcmp(name,"BoolParam")==0) return BoolParamEnum; 384 else if (strcmp(name,"Contour")==0) return ContourEnum;385 385 else stage=4; 386 386 } 387 387 if(stage==4){ 388 if (strcmp(name,"ControlInput")==0) return ControlInputEnum; 388 if (strcmp(name,"Contour")==0) return ContourEnum; 389 else if (strcmp(name,"ControlInput")==0) return ControlInputEnum; 389 390 else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum; 390 391 else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum; … … 505 506 else if (strcmp(name,"ThicknessAbsGradient")==0) return ThicknessAbsGradientEnum; 506 507 else if (strcmp(name,"ThicknessAlongGradient")==0) return ThicknessAlongGradientEnum; 507 else if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum; 511 if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum; 512 else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum; 512 513 else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum; 513 514 else if (strcmp(name,"DragCoefficientAbsGradient")==0) return DragCoefficientAbsGradientEnum; … … 628 629 else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum; 629 630 else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum; 630 else if (strcmp(name,"XY")==0) return XYEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"XYZ")==0) return XYZEnum; 634 if (strcmp(name,"XY")==0) return XYEnum; 635 else if (strcmp(name,"XYZ")==0) return XYZEnum; 635 636 else if (strcmp(name,"Dense")==0) return DenseEnum; 636 637 else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum; -
issm/trunk-jpl/src/m/classes/settings.m
r16764 r17100 6 6 classdef settings 7 7 properties (SetAccess=public) 8 results_on_nodes = 0; 8 9 io_gather = 0; 9 10 lowmem = 0; … … 49 50 function md = checkconsistency(obj,md,solution,analyses) % {{{ 50 51 52 md = checkfield(md,'fieldname','settings.results_on_nodes','numel',[1],'values',[0 1]); 51 53 md = checkfield(md,'fieldname','settings.io_gather','numel',[1],'values',[0 1]); 52 54 md = checkfield(md,'fieldname','settings.lowmem','numel',[1],'values',[0 1]); … … 58 60 disp(sprintf(' general settings parameters:')); 59 61 62 fielddisplay(obj,'results_on_nodes','results are output for all the nodes of each element'); 60 63 fielddisplay(obj,'io_gather','I/O gathering strategy for result outputs (default 1)'); 61 64 fielddisplay(obj,'lowmem','is the memory limited ? (0 or 1)'); … … 70 73 end % }}} 71 74 function marshall(obj,md,fid) % {{{ 75 WriteData(fid,'object',obj,'fieldname','results_on_nodes','format','Boolean'); 72 76 WriteData(fid,'object',obj,'fieldname','io_gather','format','Boolean'); 73 77 WriteData(fid,'object',obj,'fieldname','lowmem','format','Boolean'); -
issm/trunk-jpl/src/m/classes/settings.py
r16764 r17100 13 13 14 14 def __init__(self): # {{{ 15 self.results_on_nodes = 0 15 16 self.io_gather = 0 16 17 self.lowmem = 0 … … 25 26 string=" general settings parameters:" 26 27 28 string="%s\n%s"%(string,fielddisplay(self,"results_on_nodes","results are output for all the nodes of each element")) 27 29 string="%s\n%s"%(string,fielddisplay(self,"io_gather","I/O gathering strategy for result outputs (default 1)")) 28 30 string="%s\n%s"%(string,fielddisplay(self,"lowmem","is the memory limited ? (0 or 1)")) … … 51 53 #}}} 52 54 def checkconsistency(self,md,solution,analyses): # {{{ 55 md = checkfield(md,'fieldname','settings.results_on_nodes','numel',[1],'values',[0,1]) 53 56 md = checkfield(md,'fieldname','settings.io_gather','numel',[1],'values',[0,1]) 54 57 md = checkfield(md,'fieldname','settings.lowmem','numel',[1],'values',[0,1]) … … 59 62 # }}} 60 63 def marshall(self,md,fid): # {{{ 64 WriteData(fid,'object',self,'fieldname','results_on_nodes','format','Boolean') 61 65 WriteData(fid,'object',self,'fieldname','io_gather','format','Boolean') 62 66 WriteData(fid,'object',self,'fieldname','lowmem','format','Boolean') -
issm/trunk-jpl/src/m/enum/EnumDefinitions.py
r17098 r17100 233 233 def RiftsNumriftsEnum(): return StringToEnum("RiftsNumrifts")[0] 234 234 def RiftsRiftstructEnum(): return StringToEnum("RiftsRiftstruct")[0] 235 def SettingsResultsOnNodesEnum(): return StringToEnum("SettingsResultsOnNodes")[0] 235 236 def SettingsIoGatherEnum(): return StringToEnum("SettingsIoGather")[0] 236 237 def SettingsLowmemEnum(): return StringToEnum("SettingsLowmem")[0]
Note:
See TracChangeset
for help on using the changeset viewer.