Changeset 27721
- Timestamp:
- 05/03/23 13:41:37 (23 months ago)
- Location:
- issm/trunk-jpl/src/c/classes
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Cfsurfacesquaretransient.cpp
r27709 r27721 32 32 this->datatimes = NULL; 33 33 this->passedflags = NULL; 34 } 35 /*}}}*/ 36 Cfsurfacesquaretransient::Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum, int in_num_datatimes, IssmDouble* in_datatimes, bool* in_passedflags){/*{{{*/ 34 this->J = 0.; 35 } 36 /*}}}*/ 37 Cfsurfacesquaretransient::Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum, int in_num_datatimes, IssmDouble* in_datatimes, bool* in_passedflags, IssmDouble in_J){/*{{{*/ 37 38 38 39 this->definitionenum=in_definitionenum; … … 50 51 xMemCpy<IssmDouble>(this->datatimes,in_datatimes,this->num_datatimes); 51 52 xMemCpy<bool>(this->passedflags,in_passedflags,this->num_datatimes); 53 54 this->J = in_J; 52 55 } 53 56 /*}}}*/ … … 70 73 /*initialize passedtimes to false*/ 71 74 for(int i=0;i<this->num_datatimes;i++) this->passedflags[i]= false; 75 this->J = 0; 72 76 } 73 77 /*}}}*/ … … 81 85 /*Object virtual function resolutoin: */ 82 86 Object* Cfsurfacesquaretransient::copy() {/*{{{*/ 83 Cfsurfacesquaretransient* output = new Cfsurfacesquaretransient(this->name,this->definitionenum, this->model_enum, this->num_datatimes, this->datatimes,this->passedflags );87 Cfsurfacesquaretransient* output = new Cfsurfacesquaretransient(this->name,this->definitionenum, this->model_enum, this->num_datatimes, this->datatimes,this->passedflags, this->J); 84 88 return (Object*)output; 85 89 } … … 110 114 marshallhandle->call(this->datatimes,this->num_datatimes); 111 115 marshallhandle->call(this->passedflags,this->num_datatimes); 116 marshallhandle->call(this->J); 112 117 } 113 118 /*}}}*/ … … 130 135 /*}}}*/ 131 136 IssmDouble Cfsurfacesquaretransient::Response(FemModel* femmodel){/*{{{*/ 132 _error_("Not implemented yet"); 133 134 } 135 /*}}}*/ 137 138 /*recover model time parameters: */ 139 IssmDouble time; 140 femmodel->parameters->FindParam(&time,TimeEnum); 141 142 /*Find closest datatime that is less than time*/ 143 int pos=-1; 144 for(int i=0;i<this->num_datatimes;i++){ 145 if(this->datatimes[i]<=time){ 146 pos = i; 147 } 148 else{ 149 break; 150 } 151 } 152 153 /*if pos=-1, time is earlier than the first data observation in this dataset*/ 154 if(pos==-1){ 155 _assert_(this->J==0.); 156 return 0.; 157 } 158 159 /*Check that we have not yet calculated this cost function*/ 160 if(this->passedflags[pos]){ 161 return 0.; 162 //return this->J; //FIXME 163 } 164 165 /*Calculate cost function for this time slice*/ 166 IssmDouble J_part=0.; 167 for(Object* & object : femmodel->elements->objects){ 168 Element* element=xDynamicCast<Element*>(object); 169 J_part+=this->Cfsurfacesquaretransient_Calculation(element,model_enum); 170 } 171 172 /*Sum across partition*/ 173 IssmDouble J_sum; 174 ISSM_MPI_Allreduce( (void*)&J_part,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm()); 175 ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 176 177 /*Record this cost function so that we do not recalculate it later*/ 178 this->passedflags[pos]= true; 179 this->J += J_sum; 180 181 /*Return full cost function this far*/ 182 //return this->J; //FIXME 183 return J_sum; 184 }/*}}}*/ 136 185 IssmDouble Cfsurfacesquaretransient::Cfsurfacesquaretransient_Calculation(Element* element, int model_enum){/*{{{*/ 137 186 138 _error_("not implemented"); 187 IssmDouble Jelem=0.; 188 IssmDouble misfit,Jdet; 189 IssmDouble model,obs,weight; 190 IssmDouble* xyz_list = NULL; 191 192 /*Get basal element*/ 193 if(!element->IsOnSurface()) return 0.; 194 195 /*If on water, return 0: */ 196 if(!element->IsIceInElement()) return 0.; 197 198 /*Spawn surface element*/ 199 Element* topelement = element->SpawnTopElement(); 200 201 /* Get node coordinates*/ 202 topelement->GetVerticesCoordinates(&xyz_list); 203 204 /*Retrieve all inputs we will be needing: */ 205 DatasetInput *datasetinput = topelement->GetDatasetInput(definitionenum); _assert_(datasetinput); 206 Input *model_input = topelement->GetInput(model_enum); _assert_(model_input); 207 208 /* Start looping on the number of gaussian points: */ 209 Gauss* gauss=topelement->NewGauss(2); 210 while(gauss->next()){ 211 212 /* Get Jacobian determinant: */ 213 topelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 214 215 /*Get all parameters at gaussian point*/ 216 datasetinput->GetInputValue(&weight,gauss,WeightsSurfaceObservationEnum); 217 datasetinput->GetInputValue(&obs,gauss,SurfaceObservationEnum); 218 model_input->GetInputValue(&model,gauss); 219 220 /*Compute Misfit 221 * 222 * 1 [ 2 ] 223 * J = --- | (x - x ) | 224 * 2 [ obs ] 225 **/ 226 misfit=0.5*(model-obs)*(model-obs); 227 228 /*Add to cost function*/ 229 Jelem+=misfit*weight*Jdet*gauss->weight; 230 } 231 232 /*clean up and Return: */ 233 if(topelement->IsSpawnedElement()){topelement->DeleteMaterials(); delete topelement;}; 234 xDelete<IssmDouble>(xyz_list); 235 delete gauss; 236 return Jelem; 139 237 }/*}}}*/ -
issm/trunk-jpl/src/c/classes/Cfsurfacesquaretransient.h
r27709 r27721 22 22 IssmDouble *datatimes; 23 23 bool *passedflags; 24 IssmDouble J; 24 25 25 26 /*Cfsurfacesquaretransient constructors, destructors :*/ 26 27 Cfsurfacesquaretransient(); 27 28 Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum,int num_datatimes, IssmDouble* in_datatime); 28 Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum,int num_datatimes, IssmDouble* in_datatime, bool* in_timepassedflag );29 Cfsurfacesquaretransient(char* in_name, int in_definitionenum, int in_model_enum,int num_datatimes, IssmDouble* in_datatime, bool* in_timepassedflag, IssmDouble in_J); 29 30 ~Cfsurfacesquaretransient(); 30 31
Note:
See TracChangeset
for help on using the changeset viewer.