Changeset 18393


Ignore:
Timestamp:
08/14/14 16:15:31 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added dJ/dnux for the velocities

Location:
issm/trunk-jpl/src/c
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/AdjointBalancethickness2Analysis.cpp

    r18391 r18393  
    234234        /*Intermediaries*/
    235235        IssmDouble Jdet,weight;
    236         IssmDouble vxobs,vyobs;
    237         IssmDouble nux,nuy,dphi[2];
     236        IssmDouble vxobs,vyobs,thicknessobs;
     237        IssmDouble nux,nuy,dphi[2],dphinorm2,nuvobs2;
    238238        IssmDouble *xyz_list= NULL;
    239239
     
    255255        Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
    256256        Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
     257        Input* thicknessobs_input=element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
    257258
    258259        Gauss* gauss=element->NewGauss(2);
     
    268269                nuy_input->GetInputValue(&nuy,gauss);
    269270                potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
     271                thicknessobs_input->GetInputValue(&thicknessobs,gauss);
     272
     273                dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
     274                nuvobs2   = nux*vxobs*nux*vxobs + nuy*vyobs*nuy*vyobs;
    270275
    271276                /*Build gradient vector (actually -dJ/da): */
    272277                for(int i=0;i<numvertices;i++){
    273                         ge[i]+= - weight*Jdet*gauss->weight*(-vxobs)*dphi[1]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
     278                        //ge[i]+= - weight*Jdet*gauss->weight*(-vxobs)*dphi[1]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i]; //THIS IS FOR Q//V
     279                        ge[i]+= - weight*Jdet*gauss->weight*basis[i]*(
     280                                                -2.*nux*vxobs*vxobs*(
     281                                                        dphinorm2*dphinorm2 - thicknessobs*thicknessobs*dphinorm2*nuvobs2
     282                                                        )/ ( (pow(nux,6)+pow(nuy,6))*pow(vxobs,6) + 3*(nux*vxobs*nuy*vyobs)*(nux*vxobs*nuy*vyobs)*nuvobs2)
     283                                                );
    274284                        _assert_(!xIsNan<IssmDouble>(ge[i]));
    275285                }
     
    291301        /*Intermediaries*/
    292302        IssmDouble Jdet,weight;
    293         IssmDouble vxobs,vyobs;
    294         IssmDouble nux,nuy,dphi[2];
     303        IssmDouble vxobs,vyobs,thicknessobs;
     304        IssmDouble nux,nuy,dphi[2],dphinorm2,nuvobs2;
    295305        IssmDouble *xyz_list= NULL;
    296306
     
    306316        element->GetVerticesCoordinates(&xyz_list);
    307317        element->GradientIndexing(&vertexpidlist[0],control_index);
    308         Input* weights_input   = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
    309         Input* vxobs_input     = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
    310         Input* vyobs_input     = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
    311         Input* nux_input       = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
    312         Input* nuy_input       = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
    313         Input* potential_input = element->GetInput(PotentialEnum);             _assert_(potential_input);
     318        Input* weights_input      = element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
     319        Input* vxobs_input        = element->GetInput(BalancethicknessVxObsEnum); _assert_(vxobs_input);
     320        Input* vyobs_input        = element->GetInput(BalancethicknessVyObsEnum); _assert_(vyobs_input);
     321        Input* nux_input          = element->GetInput(BalancethicknessNuxEnum);   _assert_(nux_input);
     322        Input* nuy_input          = element->GetInput(BalancethicknessNuyEnum);   _assert_(nuy_input);
     323        Input* potential_input    = element->GetInput(PotentialEnum);             _assert_(potential_input);
     324        Input* thicknessobs_input = element->GetInput(InversionThicknessObsEnum);_assert_(thicknessobs_input);
    314325
    315326
     
    326337                nuy_input->GetInputValue(&nuy,gauss);
    327338                potential_input->GetInputDerivativeValue(&dphi[0],xyz_list,gauss);
     339                thicknessobs_input->GetInputValue(&thicknessobs,gauss);
     340
     341                dphinorm2 = dphi[0]*dphi[0] + dphi[1]*dphi[1];
     342                nuvobs2   = nux*vxobs*nux*vxobs + nuy*vyobs*nuy*vyobs;
     343
    328344
    329345                /*Build gradient vector (actually -dJ/da): */
    330346                for(int i=0;i<numvertices;i++){
    331                         ge[i]+= - weight*Jdet*gauss->weight*(+vyobs)*dphi[0]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
     347                        //ge[i]+= - weight*Jdet*gauss->weight*(+vyobs)*dphi[0]*(nuy*vyobs*dphi[0] - nux*vxobs*dphi[1])*basis[i];
     348                        ge[i]+= - weight*Jdet*gauss->weight*basis[i]*(
     349                                                -2.*nuy*vyobs*vyobs*(
     350                                                        dphinorm2*dphinorm2 - thicknessobs*thicknessobs*dphinorm2*nuvobs2
     351                                                        )/ ( (pow(nux,6)+pow(nuy,6))*pow(vyobs,6) + 3*(nux*vxobs*nuy*vyobs)*(nux*vxobs*nuy*vyobs)*nuvobs2)
     352                                                );
    332353                        _assert_(!xIsNan<IssmDouble>(ge[i]));
    333354                }
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r18390 r18393  
    13551355
    13561356                        /*J = (H^2 - Hobs^2)^2*/
    1357                         //J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
     1357                        J +=0.5*(thickness*thickness - thicknessobs*thicknessobs)*(thickness*thickness - thicknessobs*thicknessobs)*weight*Jdet*gauss->weight;
    13581358                        /*J = phi^2*/
    13591359                        //J +=.5*potential*potential*weight*Jdet*gauss->weight;// OK
     
    13631363                        //J +=0.5*((vxbarobs - vxbar)*(vxbarobs - vxbar) + (vybarobs - vybar)*(vybarobs - vybar))*weight*Jdet*gauss->weight;
    13641364                        /*J = 1/2 (vbar ^ gard(phi))^2*/
    1365                         J += 0.5*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
     1365                        //J += 0.5*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*(nuy*vyobs*dpotential[0] - nux*vxobs*dpotential[1])*weight*Jdet*gauss->weight;
    13661366                }
    13671367
Note: See TracChangeset for help on using the changeset viewer.