source: issm/trunk/src/c/classes/Misfit.h@ 18301

Last change on this file since 18301 was 18301, checked in by Mathieu Morlighem, 11 years ago

merged trunk-jpl and trunk for revision 18299

File size: 4.4 KB
RevLine 
[16787]1/*!\file Misfit.h
2 * \brief: header file for Misfit object
3 */
4
5#ifndef _MISFIT_H_
6#define _MISFIT_H_
7
8/*Headers:*/
9/*{{{*/
10#include "./Definition.h"
11#include "../datastructures/datastructures.h"
12#include "./Elements/Element.h"
13#include "./Elements/Elements.h"
14#include "./FemModel.h"
[16793]15#include "../modules/SurfaceAreax/SurfaceAreax.h"
16#include "../classes/Params/Parameters.h"
[16787]17/*}}}*/
18
19class Misfit: public Object, public Definition{
20
21 public:
22
23 char* name;
24 int model_enum;
25 int observation_enum;
26 int weights_enum;
27 char* timeinterpolation;
28
[16793]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
[16787]32 /*Misfit constructors, destructors :*/
[18301]33 Misfit(){/*{{{*/
[16787]34
35 this->name = NULL;
36 this->model_enum = UNDEF;
37 this->observation_enum = UNDEF;
38 this->weights_enum = UNDEF;
39 this->timeinterpolation=NULL;
[16793]40 this->misfit=0;
41 this->lock=0;
[16787]42
43 }
44 /*}}}*/
[18301]45 Misfit(char* in_name, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_weights_enum){/*{{{*/
[16787]46
47 this->name = xNew<char>(strlen(in_name)+1);
48 xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
49
50 this->timeinterpolation = xNew<char>(strlen(in_timeinterpolation)+1);
51 xMemCpy<char>(this->timeinterpolation,in_timeinterpolation,strlen(in_timeinterpolation)+1);
52
53 this->model_enum=in_model_enum;
54 this->observation_enum=in_observation_enum;
55 this->weights_enum=in_weights_enum;
[16793]56
57 this->misfit=0;
58 this->lock=0;
[16787]59 }
60 /*}}}*/
[18301]61 ~Misfit(){/*{{{*/
[16787]62 if(this->name)xDelete(this->name);
63 if(this->timeinterpolation)xDelete(this->timeinterpolation);
[16793]64 this->misfit=0;
65 this->lock=0;
[16787]66 }
67 /*}}}*/
68 /*Object virtual function resolutoin: */
[18301]69 void Echo(void){/*{{{*/
[16787]70 _printf_(" Misfit: " << name << "\n");
71 _printf_(" model_enum: " << model_enum << " " << EnumToStringx(model_enum) << "\n");
72 _printf_(" observation_enum: " << observation_enum << " " << EnumToStringx(observation_enum) << "\n");
73 _printf_(" weights_enum: " << weights_enum << " " << EnumToStringx(weights_enum) << "\n");
74 _printf_(" timeinterpolation: " << timeinterpolation << "\n");
75 }
76 /*}}}*/
[18301]77 void DeepEcho(void){/*{{{*/
[16787]78 this->Echo();
79 }
80 /*}}}*/
[18301]81 int Id(void){/*{{{*/
[16787]82 return -1;
83 }
84 /*}}}*/
[18301]85 int ObjectEnum(void){/*{{{*/
[16787]86 return MisfitEnum;
87 }
88 /*}}}*/
[18301]89 Object* copy() {/*{{{*/
90 Misfit* mf = new Misfit(this->name,this->model_enum,this->observation_enum,this->timeinterpolation,this->weights_enum);
91 mf->misfit=this->misfit;
92 mf->lock=this->lock;
93 return (Object*) mf;
[16787]94 }
95 /*}}}*/
96 /*Definition virtual function resolutoin: */
[18301]97 char* Name(){/*{{{*/
[16787]98
99 char* name2=xNew<char>(strlen(this->name)+1);
100 xMemCpy(name2,this->name,strlen(this->name)+1);
101
102 return name2;
103 }
104 /*}}}*/
[18301]105 IssmDouble Response(FemModel* femmodel){/*{{{*/
[16787]106
107 int i;
[17294]108 IssmDouble misfit_t=0.;
109 IssmDouble all_misfit_t=0.;
[16793]110 IssmDouble dt;
[17294]111 IssmDouble area_t=0.;
[17048]112 IssmDouble all_area_t;
[16793]113 IssmDouble time,starttime,finaltime;
[16787]114
[16793]115 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
116 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
117 femmodel->parameters->FindParam(&time,TimeEnum);
118
119 /*If we are locked, return time average: */
120 if(this->lock)return misfit/(time-starttime);
121
[17048]122
[16787]123 for(i=0;i<femmodel->elements->Size();i++){
124 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
[16793]125 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);
[17048]126 area_t+=element->MisfitArea(weights_enum);
[16787]127 }
[16793]128
129 ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
[17048]130 ISSM_MPI_Allreduce ( (void*)&area_t,(void*)&all_area_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
131 area_t=all_area_t;
[16793]132 misfit_t=all_misfit_t;
[16787]133
[17068]134 /*Divide by surface area if not nill!: */
135 if (area_t!=0) misfit_t=misfit_t/area_t;
[16793]136
137 /*Recover delta_t: */
138 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
139
140 /*Add this time's contribution to curent misfit: */
141 misfit+=dt*misfit_t;
142
143 /*Do we lock? i.e. are we at final_time? :*/
144 if(time==finaltime)this->lock=1;
145
146 /*What we return is the value of misfit / time: */
147 return misfit/(time-starttime);
[16787]148 }
149 /*}}}*/
150};
151
152#endif /* _MISFIT_H_ */
Note: See TracBrowser for help on using the repository browser.