Changeset 16793


Ignore:
Timestamp:
11/15/13 16:18:54 (11 years ago)
Author:
Eric.Larour
Message:

CHG: finished implementing an arbitrary misfit routine, which returns the temporally and spatially averaged misfit
of the model with resepct to observations.

File:
1 edited

Legend:

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

    r16787 r16793  
    1313#include "./Elements/Elements.h"
    1414#include "./FemModel.h"
     15#include "../modules/SurfaceAreax/SurfaceAreax.h"
     16#include "../classes/Params/Parameters.h"
    1517/*}}}*/
    1618
     
    2527                char*       timeinterpolation;
    2628               
     29                IssmDouble  misfit; //value carried over in time.
     30                int         lock; // if lock is on, we just return the value stored in "misfit".  this is used so we don't compute misfit past the final_time
     31               
    2732                /*Misfit constructors, destructors :*/
    2833                /*FUNCTION Misfit() {{{*/
     
    3439                        this->weights_enum = UNDEF;
    3540                        this->timeinterpolation=NULL;
     41                        this->misfit=0;
     42                        this->lock=0;
    3643
    3744                }
     
    4956                        this->observation_enum=in_observation_enum;
    5057                        this->weights_enum=in_weights_enum;
     58                       
     59                        this->misfit=0;
     60                        this->lock=0;
    5161                }
    5262                /*}}}*/
     
    5565                        if(this->name)xDelete(this->name);
    5666                        if(this->timeinterpolation)xDelete(this->timeinterpolation);
     67                        this->misfit=0;
     68                        this->lock=0;
    5769                }
    5870                /*}}}*/
     
    101113
    102114                         int i;
    103                          IssmDouble response=0;
    104                          IssmDouble all_response=0;
     115                         IssmDouble misfit_t=0;
     116                         IssmDouble all_misfit_t=0;
     117                         IssmDouble dt;
     118                         IssmDouble area;
     119                         IssmDouble time,starttime,finaltime;
     120
     121                         femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
     122                         femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
     123                         femmodel->parameters->FindParam(&time,TimeEnum);
     124
     125                         /*If we are locked, return time average: */
     126                         if(this->lock)return misfit/(time-starttime);
    105127
    106128                         for(i=0;i<femmodel->elements->Size();i++){
    107129                                 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
    108                                  response+=element->Misfit(model_enum,observation_enum,weights_enum);
     130                                 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);
    109131                         }
     132
     133                         ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
     134                         misfit_t=all_misfit_t;
    110135                         
    111                          ISSM_MPI_Allreduce ( (void*)&response,(void*)&all_response,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
    112                          return all_response;
     136                         /*Divide by surface area: */
     137                         SurfaceAreax(&area,femmodel);
     138                         misfit_t=misfit_t/area;
     139
     140                         /*Recover delta_t: */
     141                         femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
     142
     143                         /*Add this time's contribution to curent misfit: */
     144                         misfit+=dt*misfit_t;
     145
     146                         /*Do we lock? i.e. are we at final_time? :*/
     147                         if(time==finaltime)this->lock=1;
     148
     149                         /*What we return is the value of misfit / time: */
     150                         return misfit/(time-starttime);
    113151                 }
    114152                        /*}}}*/
Note: See TracChangeset for help on using the changeset viewer.