Changeset 17969


Ignore:
Timestamp:
05/09/14 10:22:13 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: preparing inversions of flowband models with Hongju

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

Legend:

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

    r17700 r17969  
    208208        /*Intermediaries */
    209209        bool        incomplete_adjoint;
     210        int         dim,epssize;
    210211        IssmDouble  Jdet,mu_prime;
    211212        IssmDouble  eps1dotdphii,eps1dotdphij,eps2dotdphii,eps2dotdphij,eps3dotdphii,eps3dotdphij;
     
    213214        IssmDouble *xyz_list = NULL;
    214215
     216        /*Get problem dimension*/
     217        element->FindParam(&dim,DomainDimensionEnum);
     218        if(dim==2) epssize = 3;
     219        else       epssize = 6;
     220
    215221        /*Fetch number of nodes and dof for this finite element*/
    216222        int vnumnodes = element->NumberofNodesVelocity();
    217223        int pnumnodes = element->NumberofNodesPressure();
    218         int numdof    = vnumnodes*3 + pnumnodes;
     224        int numdof    = vnumnodes*dim + pnumnodes;
    219225
    220226        /*Initialize Jacobian with regular FS (first part of the Gateau derivative)*/
     
    229235        Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input);
    230236        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        }
    232244
    233245        /*Allocate dbasis*/
    234         IssmDouble* dbasis = xNew<IssmDouble>(3*vnumnodes);
     246        IssmDouble* dbasis = xNew<IssmDouble>(dim*vnumnodes);
    235247
    236248        /* Start  looping on the number of gaussian points: */
     
    376388                                        for(i=0;i<vnumnodes;i++){
    377389                                                dux=vxobs-vx;
    378                                                 duy=vyobs-vy;
    379390                                                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                                                }
    381395                                        }
    382396                                        break;
     
    415429                                         */
    416430                                        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                                                }
    424447                                        }
    425448                                        break;
  • issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp

    r16314 r17969  
    2121        for (i=0;i<elements->Size();i++){
    2222                element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
    23                 J+=element->SurfaceAbsVelMisfit();
     23                J+=SurfaceAbsVelMisfit(element);
    2424        }
    2525
     
    3232        *pJ=J;
    3333}
     34
     35IssmDouble 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  
    1010/* local prototypes: */
    1111void SurfaceAbsVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters);
     12IssmDouble SurfaceAbsVelMisfit(Element* element);
    1213
    1314#endif
Note: See TracChangeset for help on using the changeset viewer.