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
Line 
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"
15#include "../modules/SurfaceAreax/SurfaceAreax.h"
16#include "../classes/Params/Parameters.h"
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
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
32 /*Misfit constructors, destructors :*/
33 Misfit(){/*{{{*/
34
35 this->name = NULL;
36 this->model_enum = UNDEF;
37 this->observation_enum = UNDEF;
38 this->weights_enum = UNDEF;
39 this->timeinterpolation=NULL;
40 this->misfit=0;
41 this->lock=0;
42
43 }
44 /*}}}*/
45 Misfit(char* in_name, int in_model_enum, int in_observation_enum, char* in_timeinterpolation, int in_weights_enum){/*{{{*/
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;
56
57 this->misfit=0;
58 this->lock=0;
59 }
60 /*}}}*/
61 ~Misfit(){/*{{{*/
62 if(this->name)xDelete(this->name);
63 if(this->timeinterpolation)xDelete(this->timeinterpolation);
64 this->misfit=0;
65 this->lock=0;
66 }
67 /*}}}*/
68 /*Object virtual function resolutoin: */
69 void Echo(void){/*{{{*/
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 /*}}}*/
77 void DeepEcho(void){/*{{{*/
78 this->Echo();
79 }
80 /*}}}*/
81 int Id(void){/*{{{*/
82 return -1;
83 }
84 /*}}}*/
85 int ObjectEnum(void){/*{{{*/
86 return MisfitEnum;
87 }
88 /*}}}*/
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;
94 }
95 /*}}}*/
96 /*Definition virtual function resolutoin: */
97 char* Name(){/*{{{*/
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 /*}}}*/
105 IssmDouble Response(FemModel* femmodel){/*{{{*/
106
107 int i;
108 IssmDouble misfit_t=0.;
109 IssmDouble all_misfit_t=0.;
110 IssmDouble dt;
111 IssmDouble area_t=0.;
112 IssmDouble all_area_t;
113 IssmDouble time,starttime,finaltime;
114
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
122
123 for(i=0;i<femmodel->elements->Size();i++){
124 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
125 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);
126 area_t+=element->MisfitArea(weights_enum);
127 }
128
129 ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
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;
132 misfit_t=all_misfit_t;
133
134 /*Divide by surface area if not nill!: */
135 if (area_t!=0) misfit_t=misfit_t/area_t;
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);
148 }
149 /*}}}*/
150};
151
152#endif /* _MISFIT_H_ */
Note: See TracBrowser for help on using the repository browser.