Changeset 19063
- Timestamp:
- 02/02/15 14:46:37 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Misfit.h
r18885 r19063 15 15 #include "../modules/SurfaceAreax/SurfaceAreax.h" 16 16 #include "../classes/Params/Parameters.h" 17 #include "../classes/Inputs/Input.h" 18 #include "../classes/gauss/Gauss.h" 17 19 /*}}}*/ 20 IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum); 18 21 19 22 class Misfit: public Object, public Definition{ … … 27 30 int weights_enum; 28 31 char* timeinterpolation; 32 bool local; 29 33 30 34 IssmDouble misfit; //value carried over in time. … … 40 44 this->weights_enum = UNDEF; 41 45 this->timeinterpolation=NULL; 46 this->local=true; 42 47 this->misfit=0; 43 48 this->lock=0; … … 45 50 } 46 51 /*}}}*/ 47 Misfit(char* in_name, int in_definitionenum, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_weights_enum){/*{{{*/52 Misfit(char* in_name, int in_definitionenum, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, bool in_local, int in_weights_enum){/*{{{*/ 48 53 49 54 this->definitionenum=in_definitionenum; … … 57 62 this->observation_enum=in_observation_enum; 58 63 this->weights_enum=in_weights_enum; 64 this->local=in_local; 59 65 60 66 this->misfit=0; … … 76 82 _printf_(" weights_enum: " << weights_enum << " " << EnumToStringx(weights_enum) << "\n"); 77 83 _printf_(" timeinterpolation: " << timeinterpolation << "\n"); 84 _printf_(" local: " << local << "\n"); 78 85 } 79 86 /*}}}*/ … … 91 98 /*}}}*/ 92 99 Object* copy() {/*{{{*/ 93 Misfit* mf = new Misfit(this->name,this->definitionenum, this->model_enum,this->observation_enum,this->timeinterpolation,this-> weights_enum);100 Misfit* mf = new Misfit(this->name,this->definitionenum, this->model_enum,this->observation_enum,this->timeinterpolation,this->local,this->weights_enum); 94 101 mf->misfit=this->misfit; 95 102 mf->lock=this->lock; … … 112 119 /*}}}*/ 113 120 IssmDouble Response(FemModel* femmodel){/*{{{*/ 114 115 int i; 116 IssmDouble misfit_t=0.; 117 IssmDouble all_misfit_t=0.; 121 122 /*diverse: */ 123 IssmDouble time,starttime,finaltime; 118 124 IssmDouble dt; 119 IssmDouble area_t=0.; 120 IssmDouble all_area_t; 121 IssmDouble time,starttime,finaltime; 122 125 126 /*recover time parameters: */ 123 127 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 124 128 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum); 125 129 femmodel->parameters->FindParam(&time,TimeEnum); 126 127 /*If we are locked, return time average: */128 if(this->lock)return misfit/(time-starttime);129 130 131 for(i=0;i<femmodel->elements->Size();i++){132 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);133 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);134 area_t+=element->MisfitArea(weights_enum);135 }136 137 ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());138 ISSM_MPI_Allreduce ( (void*)&area_t,(void*)&all_area_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());139 area_t=all_area_t;140 misfit_t=all_misfit_t;141 142 /*Divide by surface area if not nill!: */143 if (area_t!=0) misfit_t=misfit_t/area_t;144 145 /*Recover delta_t: */146 130 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 147 131 148 /*Add this time's contribution to curent misfit: */ 149 misfit+=dt*misfit_t; 132 if (this->local){ /*local computation: {{{*/ 150 133 151 /*Do we lock? i.e. are we at final_time? :*/ 152 if(time==finaltime)this->lock=1; 134 int i; 135 IssmDouble misfit_t=0.; 136 IssmDouble all_misfit_t=0.; 137 IssmDouble area_t=0.; 138 IssmDouble all_area_t; 153 139 154 /*What we return is the value of misfit / time: */ 155 return misfit/(time-starttime); 140 141 /*If we are locked, return time average: */ 142 if(this->lock)return misfit/(time-starttime); 143 144 for(i=0;i<femmodel->elements->Size();i++){ 145 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i); 146 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum); 147 area_t+=element->MisfitArea(weights_enum); 148 } 149 150 ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm()); 151 ISSM_MPI_Allreduce ( (void*)&area_t,(void*)&all_area_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm()); 152 area_t=all_area_t; 153 misfit_t=all_misfit_t; 154 155 /*Divide by surface area if not nill!: */ 156 if (area_t!=0) misfit_t=misfit_t/area_t; 157 158 /*Add this time's contribution to curent misfit: */ 159 misfit+=dt*misfit_t; 160 161 /*Do we lock? i.e. are we at final_time? :*/ 162 if(time==finaltime)this->lock=1; 163 164 /*What we return is the value of misfit / time: */ 165 return misfit/(time-starttime); 166 } /*}}}*/ 167 else{ /*global computation: {{{ */ 168 169 IssmDouble model, observation; 170 171 /*If we are locked, return time average: */ 172 if(this->lock)return misfit/(time-starttime); 173 174 /*First, the global model response: */ 175 model=OutputDefinitionsResponsex(femmodel,this->model_enum); 176 /*Now, the observation is buried inside the elements, go fish it in the first element (cludgy, needs fixing): */ 177 Element* element=(Element*)femmodel->elements->GetObjectByOffset(0); _assert_(element); 178 Input* input = element->GetInput(observation_enum); _assert_(input); 179 input->GetInputAverage(&observation); 180 181 /*Add this time's contribution to curent misfit: */ 182 misfit+=dt*(model-observation); 183 184 /*Do we lock? i.e. are we at final_time? :*/ 185 if(time==finaltime)this->lock=1; 186 187 /*What we return is the value of misfit / time: */ 188 return misfit/(time-starttime); 189 } /*}}}*/ 190 156 191 } 157 192 /*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.