Changeset 17969
- Timestamp:
- 05/09/14 10:22:13 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
r17700 r17969 208 208 /*Intermediaries */ 209 209 bool incomplete_adjoint; 210 int dim,epssize; 210 211 IssmDouble Jdet,mu_prime; 211 212 IssmDouble eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij,eps3dotdphii,eps3dotdphij; … … 213 214 IssmDouble *xyz_list = NULL; 214 215 216 /*Get problem dimension*/ 217 element->FindParam(&dim,DomainDimensionEnum); 218 if(dim==2) epssize = 3; 219 else epssize = 6; 220 215 221 /*Fetch number of nodes and dof for this finite element*/ 216 222 int vnumnodes = element->NumberofNodesVelocity(); 217 223 int pnumnodes = element->NumberofNodesPressure(); 218 int numdof = vnumnodes* 3+ pnumnodes;224 int numdof = vnumnodes*dim + pnumnodes; 219 225 220 226 /*Initialize Jacobian with regular FS (first part of the Gateau derivative)*/ … … 229 235 Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input); 230 236 Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input); 231 Input* vz_input = element->GetInput(VzEnum);_assert_(vz_input); 237 Input* vz_input = NULL; 238 if(dim==3){ 239 vz_input = element->GetInput(VzEnum); 240 } 241 else{ 242 _error_("Not implemented yet"); 243 } 232 244 233 245 /*Allocate dbasis*/ 234 IssmDouble* dbasis = xNew<IssmDouble>( 3*vnumnodes);246 IssmDouble* dbasis = xNew<IssmDouble>(dim*vnumnodes); 235 247 236 248 /* Start looping on the number of gaussian points: */ … … 376 388 for(i=0;i<vnumnodes;i++){ 377 389 dux=vxobs-vx; 378 duy=vyobs-vy;379 390 pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 380 pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 391 if(dim==3){ 392 duy=vyobs-vy; 393 pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 394 } 381 395 } 382 396 break; … … 415 429 */ 416 430 for(i=0;i<vnumnodes;i++){ 417 velocity_mag =sqrt(pow(vx, 2)+pow(vy, 2))+epsvel; 418 obs_velocity_mag=sqrt(pow(vxobs,2)+pow(vyobs,2))+epsvel; 419 scale=-8*pow(meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag); 420 dux=scale*vx; 421 duy=scale*vy; 422 pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 423 pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 431 if(dim==3){ 432 velocity_mag =sqrt(vx*vx+vy*vy)+epsvel; 433 obs_velocity_mag=sqrt(vxobs*vxobs+vyobs*vyobs)+epsvel; 434 scale=-8.*meanvel*meanvel/(velocity_mag*velocity_mag)*log(velocity_mag/obs_velocity_mag); 435 dux=scale*vx; 436 duy=scale*vy; 437 pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 438 pe->values[i*dim+1]+=duy*weight*Jdet*gauss->weight*vbasis[i]; 439 } 440 else{ 441 velocity_mag =fabs(vx)+epsvel; 442 obs_velocity_mag=fabs(vxobs)+epsvel; 443 scale=-8.*meanvel*meanvel/(velocity_mag*velocity_mag)*log(velocity_mag/obs_velocity_mag); 444 dux=scale*vx; 445 pe->values[i*dim+0]+=dux*weight*Jdet*gauss->weight*vbasis[i]; 446 } 424 447 } 425 448 break; -
issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
r16314 r17969 21 21 for (i=0;i<elements->Size();i++){ 22 22 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 23 J+= element->SurfaceAbsVelMisfit();23 J+=SurfaceAbsVelMisfit(element); 24 24 } 25 25 … … 32 32 *pJ=J; 33 33 } 34 35 IssmDouble SurfaceAbsVelMisfit(Element* element){ 36 37 int domaintype,numcomponents; 38 bool surfaceintegral; 39 IssmDouble Jelem=0.; 40 IssmDouble misfit,Jdet; 41 IssmDouble vx,vy,vxobs,vyobs,weight; 42 IssmDouble* xyz_list_top = NULL; 43 44 /*Get basal element*/ 45 if(!element->IsOnSurface()) return 0.; 46 47 /*If on water, return 0: */ 48 if(!element->IsIceInElement()) return 0.; 49 50 /*Get problem dimension*/ 51 element->FindParam(&domaintype,DomainTypeEnum); 52 switch(domaintype){ 53 case Domain2DverticalEnum: 54 surfaceintegral = true; 55 numcomponents = 1; 56 break; 57 case Domain3DEnum: 58 surfaceintegral = true; 59 numcomponents = 2; 60 break; 61 case Domain2DhorizontalEnum: 62 surfaceintegral = false; 63 numcomponents = 2; 64 break; 65 default: _error_("not supported yet"); 66 } 67 68 /* Get node coordinates*/ 69 if(surfaceintegral) element->GetVerticesCoordinatesTop(&xyz_list_top); 70 else element->GetVerticesCoordinates(&xyz_list_top); 71 72 /*Retrieve all inputs we will be needing: */ 73 Input* weights_input=element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input); 74 Input* vx_input =element->GetInput(VxEnum); _assert_(vx_input); 75 Input* vxobs_input =element->GetInput(InversionVxObsEnum); _assert_(vxobs_input); 76 Input* vy_input = NULL; 77 Input* vyobs_input = NULL; 78 if(numcomponents==2){ 79 vy_input =element->GetInput(VyEnum); _assert_(vy_input); 80 vyobs_input =element->GetInput(InversionVyObsEnum); _assert_(vyobs_input); 81 } 82 83 /* Start looping on the number of gaussian points: */ 84 Gauss* gauss=NULL; 85 if(surfaceintegral) gauss=element->NewGaussTop(2); 86 else gauss=element->NewGauss(2); 87 for(int ig=gauss->begin();ig<gauss->end();ig++){ 88 89 gauss->GaussPoint(ig); 90 91 /* Get Jacobian determinant: */ 92 if(surfaceintegral) element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss); 93 else element->JacobianDeterminant(&Jdet,xyz_list_top,gauss); 94 95 /*Get all parameters at gaussian point*/ 96 weights_input->GetInputValue(&weight,gauss,SurfaceAbsVelMisfitEnum); 97 vx_input->GetInputValue(&vx,gauss); 98 vxobs_input->GetInputValue(&vxobs,gauss); 99 if(numcomponents==2){ 100 vy_input->GetInputValue(&vy,gauss); 101 vyobs_input->GetInputValue(&vyobs,gauss); 102 } 103 104 /*Compute SurfaceAbsVelMisfitEnum: 105 * 106 * 1 [ 2 2 ] 107 * J = --- | (u - u ) + (v - v ) | 108 * 2 [ obs obs ] 109 * 110 */ 111 misfit=0.5*(vx-vxobs)*(vx-vxobs); 112 if(numcomponents==2) misfit+=0.5*(vy-vyobs)*(vy-vyobs); 113 114 /*Add to cost function*/ 115 Jelem+=misfit*weight*Jdet*gauss->weight; 116 } 117 118 /*clean up and Return: */ 119 delete gauss; 120 return Jelem; 121 } -
issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h
r16314 r17969 10 10 /* local prototypes: */ 11 11 void SurfaceAbsVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters); 12 IssmDouble SurfaceAbsVelMisfit(Element* element); 12 13 13 14 #endif
Note:
See TracChangeset
for help on using the changeset viewer.