Changeset 21738 for issm/trunk-jpl/src/c/classes/Misfit.h
- Timestamp:
- 05/22/17 21:11:02 (8 years ago)
- File:
-
- 1 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: {{{ */
Note:
See TracChangeset
for help on using the changeset viewer.