Changeset 16478
- Timestamp:
- 10/21/13 13:47:42 (11 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/control_core.cpp
r16307 r16478 98 98 /*some results not computed by steadystate_core or stressbalance_core: */ 99 99 if(!dakota_analysis){ //do not save this if we are running the control core from a qmu run! 100 f or(i=0;i<num_controls;i++) InputToResultx(femmodel,control_type[i]);100 femmodel->OutputControlsx(&femmodel->results); 101 101 102 102 #ifdef _HAVE_ADOLC_ -
issm/trunk-jpl/src/c/analyses/damage_core.cpp
r16214 r16478 34 34 if(save_results){ 35 35 if(VerboseSolution()) _printf0_(" saving results\n"); 36 InputToResultx(femmodel,DamageDEnum); 36 const char* outputs [] = {"DamageD"}; 37 femmodel->RequestedOutputsx(&femmodel->results,(char**)&outputs[0],1); 37 38 } 38 39 } -
issm/trunk-jpl/src/c/analyses/gia_core.cpp
r16158 r16478 50 50 if(save_results){ 51 51 if(VerboseSolution()) _printf0_(" saving results\n"); 52 InputToResultx(femmodel,GiaWEnum);53 InputToResultx(femmodel,GiadWdtEnum);52 const char* outputs [] = {"GiaW","GiadWdt"}; 53 femmodel->RequestedOutputsx(&femmodel->results,(char**)&outputs[0],2); 54 54 } 55 55 -
issm/trunk-jpl/src/c/analyses/hydrology_core.cpp
r16470 r16478 88 88 if(save_results && ((i+1)%output_frequency==0 || (i+1)==nsteps)){ 89 89 if(VerboseSolution()) _printf0_(" saving results \n"); 90 InputToResultx(femmodel,SedimentHeadEnum);91 InputToResultx(femmodel,SedimentHeadResidualEnum);92 90 if(isefficientlayer){ 93 91 const char* outputs [] = {"SedimentHead","SedimentHeadResidual","EplHead","HydrologydcMaskEplactive"}; -
issm/trunk-jpl/src/c/analyses/transient_core.cpp
r16470 r16478 162 162 if(save_results){ 163 163 if(VerboseSolution()) _printf0_(" saving transient results\n"); 164 InputToResultx(femmodel,SurfaceforcingsMassBalanceEnum); 165 femmodel->RequestedOutputsx(requested_outputs,numoutputs); 164 femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs); 166 165 if(isdelta18o){ 167 InputToResultx(femmodel,SurfaceforcingsMonthlytemperaturesEnum);168 InputToResultx(femmodel,SurfaceforcingsPrecipitationEnum);166 const char* outputs [] = {"SurfaceforcingsMonthlytemperatures","SurfaceforcingsPrecipitation"}; 167 femmodel->RequestedOutputsx(&femmodel->results,(char**)&outputs[0],2); 169 168 } 170 169 if(isgroundingline && (groundingline_migration==SubelementMigrationEnum || groundingline_migration==SubelementMigration2Enum)){ 171 InputToResultx(femmodel,MaskGroundediceLevelsetEnum); 170 const char* outputs [] = {"MaskGroundediceLevelset"}; 171 femmodel->RequestedOutputsx(&femmodel->results,(char**)&outputs[0],1); 172 172 } 173 173 if(VerboseSolution()) _printf0_(" saving temporary results\n"); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r16470 r16478 121 121 virtual void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0; 122 122 virtual void ControlInputScaleGradient(int enum_type, IssmDouble scale)=0; 123 virtual void ControlToVectors(Vector<IssmDouble>* vector_control, Vector<IssmDouble>* vector_gradient,int control_enum)=0; 123 124 virtual void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data)=0; 124 125 virtual void SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16474 r16478 5330 5330 grad_input=new PentaInput(GradientEnum,grad_list,P1Enum); 5331 5331 ((ControlInput*)input)->SetGradient(grad_input); 5332 5333 }/*}}}*/ 5334 /*FUNCTION Penta::ControlInputSetGradient{{{*/ 5335 void Penta::ControlToVectors(Vector<IssmDouble>* vector_control, Vector<IssmDouble>* vector_gradient,int control_enum){ 5336 5337 Input* input=NULL; 5338 5339 if(control_enum==MaterialsRheologyBbarEnum){ 5340 input=(Input*)material->inputs->GetInput(MaterialsRheologyBEnum); 5341 } 5342 else if(control_enum==DamageDbarEnum){ 5343 input=(Input*)material->inputs->GetInput(DamageDEnum); 5344 } 5345 else{ 5346 input=inputs->GetInput(control_enum); 5347 } 5348 if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found"); 5349 if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput"); 5350 5351 int sidlist[NUMVERTICES]; 5352 IssmPDouble values[NUMVERTICES]; 5353 IssmPDouble gradients[NUMVERTICES]; 5354 IssmDouble value,gradient; 5355 5356 GetVertexSidList(&sidlist[0]); 5357 5358 GaussPenta* gauss=new GaussPenta(); 5359 for (int iv=0;iv<NUMVERTICES;iv++){ 5360 gauss->GaussVertex(iv); 5361 5362 ((ControlInput*)input)->GetInputValue(&value,gauss); 5363 ((ControlInput*)input)->GetGradientValue(&gradient,gauss); 5364 5365 values[iv] = reCast<IssmPDouble>(value); 5366 gradients[iv] = reCast<IssmPDouble>(gradient); 5367 } 5368 delete gauss; 5369 5370 vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],INS_VAL); 5371 vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],INS_VAL); 5332 5372 5333 5373 }/*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16470 r16478 152 152 void ControlInputScaleGradient(int enum_type,IssmDouble scale); 153 153 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index); 154 void ControlToVectors(Vector<IssmDouble>* vector_control, Vector<IssmDouble>* vector_gradient,int control_enum); 154 155 IssmDouble RheologyBbarAbsGradient(void); 155 156 IssmDouble ThicknessAbsMisfit(void); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r16470 r16478 172 172 void ControlInputScaleGradient(int enum_type,IssmDouble scale){_error_("not implemented yet");}; 173 173 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){_error_("not implemented yet");}; 174 void ControlToVectors(Vector<IssmDouble>* vector_control, Vector<IssmDouble>* vector_gradient,int control_enum){_error_("not implemented yet");}; 174 175 IssmDouble RheologyBbarAbsGradient(void){_error_("not implemented yet");}; 175 176 IssmDouble ThicknessAbsMisfit(void){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r16474 r16478 4871 4871 4872 4872 ((ControlInput*)input)->SetGradient(grad_input); 4873 4874 }/*}}}*/ 4875 /*FUNCTION Tria::ControlInputSetGradient{{{*/ 4876 void Tria::ControlToVectors(Vector<IssmDouble>* vector_control, Vector<IssmDouble>* vector_gradient,int control_enum){ 4877 4878 Input* input=NULL; 4879 if(control_enum==MaterialsRheologyBbarEnum || control_enum==DamageDbarEnum){ 4880 input=(Input*)material->inputs->GetInput(control_enum); 4881 } 4882 else{ 4883 input=inputs->GetInput(control_enum); 4884 } 4885 if (!input) _error_("Input " << EnumToStringx(control_enum) << " not found"); 4886 if (input->ObjectEnum()!=ControlInputEnum) _error_("Input " << EnumToStringx(control_enum) << " is not a ControlInput"); 4887 4888 int sidlist[NUMVERTICES]; 4889 IssmPDouble values[NUMVERTICES]; 4890 IssmPDouble gradients[NUMVERTICES]; 4891 IssmDouble value,gradient; 4892 4893 GetVertexSidList(&sidlist[0]); 4894 4895 GaussTria* gauss=new GaussTria(); 4896 for (int iv=0;iv<NUMVERTICES;iv++){ 4897 gauss->GaussVertex(iv); 4898 4899 ((ControlInput*)input)->GetInputValue(&value,gauss); 4900 ((ControlInput*)input)->GetGradientValue(&gradient,gauss); 4901 4902 values[iv] = reCast<IssmPDouble>(value); 4903 gradients[iv] = reCast<IssmPDouble>(gradient); 4904 } 4905 delete gauss; 4906 4907 vector_control->SetValues(NUMVERTICES,&sidlist[0],&values[0],INS_VAL); 4908 vector_gradient->SetValues(NUMVERTICES,&sidlist[0],&gradients[0],INS_VAL); 4873 4909 4874 4910 }/*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16470 r16478 161 161 void ControlInputScaleGradient(int enum_type,IssmDouble scale); 162 162 void ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index); 163 void ControlToVectors(Vector<IssmDouble>* vector_control, Vector<IssmDouble>* vector_gradient,int control_enum); 163 164 IssmDouble RheologyBbarAbsGradient(void); 164 165 IssmDouble ThicknessAbsMisfit(void); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r16476 r16478 639 639 } 640 640 /*}}}*/ 641 void FemModel::RequestedOutputsx(Results **presults,int* requested_outputs, int numoutputs){/*{{{*/ 642 643 /*Convert list of enums to list of string*/ 644 char** enumlist = xNew<char*>(numoutputs); 645 for(int i=0;i<numoutputs;i++){ 646 EnumToStringx(&enumlist[i],requested_outputs[i]); 647 } 648 649 /*Call main module*/ 650 this->RequestedOutputsx(presults,enumlist,numoutputs); 651 652 653 /*clean up and return*/ 654 for(int i=0;i<numoutputs;i++) xDelete<char>(enumlist[i]); 655 xDelete<char*>(enumlist); 656 return; 657 } 658 /*}}}*/ 641 659 void FemModel::RequestedDependentsx(void){/*{{{*/ 642 660 … … 1207 1225 } 1208 1226 /*}}}*/ 1227 void FemModel::OutputControlsx(Results **presults){/*{{{*/ 1228 1229 /*parameters: */ 1230 int num_controls,step; 1231 IssmDouble time; 1232 int *control_type = NULL; 1233 1234 /*recover results*/ 1235 Results* results = *presults; 1236 if(!results) results = new Results(); 1237 1238 /*Get list of Controls*/ 1239 this->parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 1240 this->parameters->FindParam(&control_type,NULL,InversionControlParametersEnum); 1241 this->parameters->FindParam(&step,StepEnum); 1242 this->parameters->FindParam(&time,TimeEnum); 1243 1244 for(int i=0;i<num_controls;i++){ 1245 1246 int control_enum = control_type[i]; 1247 int gradient_enum; 1248 1249 switch(i){ 1250 case 0: gradient_enum = Gradient1Enum; break; 1251 case 1: gradient_enum = Gradient2Enum; break; 1252 case 2: gradient_enum = Gradient3Enum; break; 1253 default: _error_("more than 3 controls not implemented yet"); 1254 } 1255 1256 /*Allocate vector*/ 1257 Vector<IssmPDouble> *vector_control = new Vector<IssmPDouble>(this->vertices->NumberOfVertices()); 1258 Vector<IssmPDouble> *vector_gradient = new Vector<IssmPDouble>(this->vertices->NumberOfVertices()); 1259 1260 /*Fill in vector*/ 1261 for(int j=0;j<elements->Size();j++){ 1262 Element* element=(Element*)elements->GetObjectByOffset(j); 1263 element->ControlToVectors(vector_control,vector_gradient,control_enum); 1264 } 1265 vector_control->Assemble(); 1266 vector_gradient->Assemble(); 1267 1268 results->AddResult(new GenericExternalResult<Vector<IssmPDouble>*>(results->Size()+1,control_enum,vector_control ,step,time)); 1269 results->AddResult(new GenericExternalResult<Vector<IssmPDouble>*>(results->Size()+1,gradient_enum,vector_gradient,step,time)); 1270 } 1271 } 1272 /*}}}*/ 1209 1273 #endif 1210 1274 #ifdef _HAVE_DAKOTA_ -
issm/trunk-jpl/src/c/classes/FemModel.h
r16476 r16478 82 82 void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses); 83 83 #endif 84 void RequestedOutputsx(Results **presults,int* requested_outputs,int numoutputs); 84 85 void RequestedOutputsx(Results **presults,char** requested_outputs, int numoutputs); 85 86 void RequestedOutputsx(char** requested_outputs, int numoutputs); … … 88 89 void Responsex(IssmDouble* presponse,const char* response_descriptor); 89 90 #ifdef _HAVE_CONTROL_ 91 void OutputControlsx(Results **presults); 90 92 void CostFunctionx( IssmDouble* pJ); 91 93 void ThicknessAbsGradientx( IssmDouble* pJ); -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
r16382 r16478 139 139 //gradient->Extrude(); 140 140 }/*}}}*/ 141 /*FUNCTION ControlInput::GetResultInterpolation{{{*/ 142 int ControlInput::GetResultInterpolation(void){ 143 144 return values->GetResultInterpolation(); 145 146 } 147 /*}}}*/ 141 148 /*FUNCTION ControlInput::GetGradient{{{*/ 142 149 void ControlInput::GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist){ … … 245 252 values->GetInputValue(pvalue,gauss); 246 253 }/*}}}*/ 254 /*FUNCTION ControlInput::GetGradientValue(IssmDouble* pvalue,GaussTria* gauss){{{*/ 255 void ControlInput::GetGradientValue(IssmDouble* pvalue,GaussTria* gauss){ 256 gradient->GetInputValue(pvalue,gauss); 257 }/*}}}*/ 258 /*FUNCTION ControlInput::GetGradientValue(IssmDouble* pvalue,GaussPenta* gauss){{{*/ 259 void ControlInput::GetGradientValue(IssmDouble* pvalue,GaussPenta* gauss){ 260 gradient->GetInputValue(pvalue,gauss); 261 }/*}}}*/ 247 262 /*FUNCTION ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussTria* gauss){{{*/ 248 263 void ControlInput::GetInputDerivativeValue(IssmDouble* derivativevalues, IssmDouble* xyz_list, GaussTria* gauss){ -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h
r16461 r16478 48 48 /*}}}*/ 49 49 /*numerics: {{{*/ 50 void GetGradientValue(IssmDouble* pvalue,GaussTria* gauss); 51 void GetGradientValue(IssmDouble* pvalue,GaussPenta* gauss); 50 52 void SetInput(Input* in_input); 51 53 void GetInputValue(bool* pvalue); … … 90 92 void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist); 91 93 ElementResult* SpawnGradient(int step, IssmDouble time); 92 int GetResultInterpolation(void) {_error_("not implemented yet");};94 int GetResultInterpolation(void); 93 95 void GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist); 94 96 void ScaleGradient(IssmDouble scale); -
issm/trunk-jpl/src/m/classes/transient.m
r16458 r16478 26 26 27 27 %full analysis: Stressbalance, Masstransport and Thermal but no groundingline migration for now 28 obj.ismasstransport=1; 29 obj.isstressbalance=1; 30 obj.isthermal=1; 31 obj.isgroundingline=0; 32 obj.isgia=0; 33 obj.isdamage=0; 28 obj.ismasstransport = 1; 29 obj.isstressbalance = 1; 30 obj.isthermal = 1; 31 obj.isgroundingline = 0; 32 obj.isgia = 0; 33 obj.isdamage = 0; 34 35 %default output 36 obj.requested_outputs={'default'}; 37 end % }}} 38 function list = defaultoutputs(self,md) % {{{ 39 40 list = {'SurfaceforcingsMassBalance'}; 34 41 35 42 end % }}} … … 67 74 WriteData(fid,'object',obj,'fieldname','isgia','format','Boolean'); 68 75 WriteData(fid,'object',obj,'fieldname','isdamage','format','Boolean'); 69 WriteData(fid,'object',obj,'fieldname','requested_outputs','format','StringArray'); 76 77 %process requested outputs 78 outputs = obj.requested_outputs; 79 pos = find(ismember(outputs,'default')); 80 if ~isempty(pos), 81 outputs(pos) = []; %remove 'default' from outputs 82 outputs = [outputs defaultoutputs(obj,md)]; %add defaults 83 end 84 WriteData(fid,'data',outputs,'enum',TransientRequestedOutputsEnum,'format','StringArray'); 70 85 end % }}} 71 86 end -
issm/trunk-jpl/src/m/classes/transient.py
r16458 r16478 34 34 return string 35 35 #}}} 36 def defaultoutputs(self,md): # {{{ 37 38 return ['SurfaceforcingsMassBalance'] 39 40 #}}} 36 41 def setdefaultparameters(self): # {{{ 37 42 38 43 #full analysis: Stressbalance, Masstransport and Thermal but no groundingline migration for now 39 self.ismasstransport =True40 self.isstressbalance =True41 self.isthermal =True42 self.isgroundingline =False43 self.isgia =False44 self.ismasstransport = True 45 self.isstressbalance = True 46 self.isthermal = True 47 self.isgroundingline = False 48 self.isgia = False 44 49 50 #default output 51 self.requested_outputs=['default'] 45 52 return self 46 53 #}}} … … 66 73 WriteData(fid,'object',self,'fieldname','isgroundingline','format','Boolean') 67 74 WriteData(fid,'object',self,'fieldname','isgia','format','Boolean') 68 WriteData(fid,'object',self,'fieldname','requested_outputs','format','StringArray') 75 76 #process requested outputs 77 outputs = self.requested_outputs 78 indices = [i for i, x in enumerate(outputs) if x == 'default'] 79 if len(indices) > 0: 80 outputscopy=outputs[0:max(0,indices[0]-1)]+self.defaultoutputs(md)+outputs[indices[0]+1:] 81 outputs =outputscopy 82 WriteData(fid,'data',outputs,'enum',TransientRequestedOutputsEnum(),'format','StringArray') 69 83 # }}} 70
Note:
See TracChangeset
for help on using the changeset viewer.