Changeset 21738
- Timestamp:
- 05/22/17 21:11:02 (8 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Misfit.h
r21049 r21738 19 19 /*}}}*/ 20 20 IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum); 21 void GetVectorFromInputsx( IssmDouble** pvector,FemModel* femmodel,int name,int type); 22 21 23 22 24 class Misfit: public Object, public Definition{ … … 25 27 26 28 int definitionenum; 27 boollocal;29 int local; 28 30 int model_enum; 29 31 char* name; … … 44 46 this->weights_enum = UNDEF; 45 47 this->timeinterpolation=NULL; 46 this->local= true;48 this->local=1; 47 49 this->misfit=0; 48 50 this->lock=0; … … 50 52 } 51 53 /*}}}*/ 52 Misfit(char* in_name, int in_definitionenum, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, boolin_local, int in_weights_enum){/*{{{*/54 Misfit(char* in_name, int in_definitionenum, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_local, int in_weights_enum){/*{{{*/ 53 55 54 56 this->definitionenum=in_definitionenum; … … 133 135 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 134 136 135 if (this->local ){ /*local computation: {{{*/137 if (this->local==1){ /*area integration using elements: {{{*/ 136 138 137 139 int i; … … 167 169 /*What we return is the value of misfit / time: */ 168 170 return misfit/(time-starttime); 171 } /*}}}*/ 172 else if (this->local==2){ /*vertex by vertex computation: {{{*/ 173 174 IssmDouble* model = NULL; 175 IssmDouble* observation= NULL; 176 IssmDouble* weights= NULL; 177 178 /*Are we transient?:*/ 179 if (time==0){ 180 IssmDouble misfit_t=0.; 181 182 /*get global vectors: */ 183 GetVectorFromInputsx(&model,femmodel,model_enum,VertexSIdEnum); 184 GetVectorFromInputsx(&observation,femmodel,observation_enum,VertexSIdEnum); 185 GetVectorFromInputsx(&weights,femmodel,weights_enum,VertexSIdEnum); 186 187 int count=0; 188 for (int i=0;i<femmodel->vertices->NumberOfVertices();i++){ 189 misfit_t += pow(model[i]-observation[i],2)*weights[i]; 190 if (weights[i]!=0)count++; 191 } 192 misfit=sqrt(misfit_t)/count; 193 194 /*Free ressources:*/ 195 xDelete<IssmDouble>(model); 196 xDelete<IssmDouble>(observation); 197 xDelete<IssmDouble>(weights); 198 199 /*return value: */ 200 return misfit; 201 } 202 else{ 203 204 IssmDouble misfit_t=0.; 205 IssmDouble all_misfit_t=0.; 206 207 /*If we are locked, return time average: */ 208 if(this->lock)return misfit/(time-starttime); 209 210 /*get global vectors: */ 211 GetVectorFromInputsx(&model,femmodel,model_enum,VertexSIdEnum); 212 GetVectorFromInputsx(&observation,femmodel,observation_enum,VertexSIdEnum); 213 GetVectorFromInputsx(&weights,femmodel,weights_enum,VertexSIdEnum); 214 215 int count=0; 216 for (int i=0;i<femmodel->vertices->NumberOfVertices();i++){ 217 misfit_t += pow(model[i]-observation[i],2)*weights[i]; 218 if (weights[i]!=0)count++; 219 } 220 221 /*Add this time's contribution to curent misfit: */ 222 misfit=sqrt(misfit_t)/count; 223 misfit+=dt*misfit_t; 224 225 /*Do we lock? i.e. are we at final_time? :*/ 226 if(time==finaltime)this->lock=1; 227 228 /*Free ressources:*/ 229 xDelete<IssmDouble>(model); 230 xDelete<IssmDouble>(observation); 231 xDelete<IssmDouble>(weights); 232 233 /*What we return is the value of misfit / time: */ 234 return misfit/(time-starttime); 235 } 236 169 237 } /*}}}*/ 170 238 else{ /*global computation: {{{ */ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
r21690 r21738 96 96 97 97 /*First create a misfit object for that specific string (misfit_model_string_s[j]):*/ 98 output_definitions->AddObject(new Misfit(misfit_name_s[j],StringToEnumx(misfit_definitionstring_s[j]),StringToEnumx(misfit_model_string_s[j]),StringToEnumx(misfit_observation_string_s[j]),misfit_timeinterpolation_s[j], (bool)misfit_local_s[j],StringToEnumx(misfit_weights_string_s[j])));98 output_definitions->AddObject(new Misfit(misfit_name_s[j],StringToEnumx(misfit_definitionstring_s[j]),StringToEnumx(misfit_model_string_s[j]),StringToEnumx(misfit_observation_string_s[j]),misfit_timeinterpolation_s[j],misfit_local_s[j],StringToEnumx(misfit_weights_string_s[j]))); 99 99 100 100 /*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/ -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r21722 r21738 787 787 SealevelAbsoluteEnum, 788 788 SealevelEustaticEnum, 789 SealevelObsEnum, 790 SealevelWeightsEnum, 789 791 SealevelriseDeltathicknessEnum, 790 792 SealevelriseMaxiterEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r21722 r21738 767 767 case SealevelAbsoluteEnum : return "SealevelAbsolute"; 768 768 case SealevelEustaticEnum : return "SealevelEustatic"; 769 case SealevelObsEnum : return "SealevelObs"; 770 case SealevelWeightsEnum : return "SealevelWeights"; 769 771 case SealevelriseDeltathicknessEnum : return "SealevelriseDeltathickness"; 770 772 case SealevelriseMaxiterEnum : return "SealevelriseMaxiter"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r21722 r21738 785 785 else if (strcmp(name,"SealevelAbsolute")==0) return SealevelAbsoluteEnum; 786 786 else if (strcmp(name,"SealevelEustatic")==0) return SealevelEustaticEnum; 787 else if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum; 788 else if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum; 787 789 else if (strcmp(name,"SealevelriseDeltathickness")==0) return SealevelriseDeltathicknessEnum; 788 790 else if (strcmp(name,"SealevelriseMaxiter")==0) return SealevelriseMaxiterEnum; … … 873 875 else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum; 874 876 else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum; 875 else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;876 else if (strcmp(name,"StringParam")==0) return StringParamEnum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"Seg")==0) return SegEnum; 880 if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum; 881 else if (strcmp(name,"StringParam")==0) return StringParamEnum; 882 else if (strcmp(name,"Seg")==0) return SegEnum; 881 883 else if (strcmp(name,"SegInput")==0) return SegInputEnum; 882 884 else if (strcmp(name,"Tria")==0) return TriaEnum; … … 996 998 else if (strcmp(name,"P2xP4")==0) return P2xP4Enum; 997 999 else if (strcmp(name,"P1P1")==0) return P1P1Enum; 998 else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;999 else if (strcmp(name,"MINI")==0) return MINIEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum; 1003 if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum; 1004 else if (strcmp(name,"MINI")==0) return MINIEnum; 1005 else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum; 1004 1006 else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum; 1005 1007 else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum; -
issm/trunk-jpl/src/m/classes/misfit.m
r21049 r21738 18 18 properties (SetAccess=public) 19 19 %misfit 20 name 20 name = ''; 21 21 definitionstring = ''; %string that identifies this output definition uniquely, from 'Outputdefinition[1-10]' 22 22 model_string = ''; %string for field that is modeled … … 24 24 observation_string = ''; %string for observed field. 25 25 timeinterpolation = ''; 26 local 26 local = 1; 27 27 weights = NaN; %weight coefficients for every vertex 28 28 weights_string = ''; %string to identify this particular set of weights
Note:
See TracChangeset
for help on using the changeset viewer.