Ignore:
Timestamp:
05/22/17 21:11:02 (8 years ago)
Author:
Eric.Larour
Message:

CHG: introducing new way of computing misfit (local==2) in a discretized way.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Misfit.h

    r21049 r21738  
    1919/*}}}*/
    2020IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
     21void    GetVectorFromInputsx( IssmDouble** pvector,FemModel* femmodel,int name,int type);
     22
    2123
    2224class Misfit: public Object, public Definition{
     
    2527
    2628                int         definitionenum;
    27                 bool        local;     
     29                int         local;     
    2830                int         model_enum;
    2931                char*       name;
     
    4446                        this->weights_enum = UNDEF;
    4547                        this->timeinterpolation=NULL;
    46                         this->local=true;
     48                        this->local=1;
    4749                        this->misfit=0;
    4850                        this->lock=0;
     
    5052                }
    5153                /*}}}*/
    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){/*{{{*/
     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){/*{{{*/
    5355
    5456                        this->definitionenum=in_definitionenum;
     
    133135                         femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
    134136
    135                          if (this->local){ /*local computation: {{{*/
     137                         if (this->local==1){ /*area integration using elements: {{{*/
    136138
    137139                                 int i;
     
    167169                                 /*What we return is the value of misfit / time: */
    168170                                 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
    169237                         } /*}}}*/
    170238                         else{ /*global computation: {{{ */
Note: See TracChangeset for help on using the changeset viewer.