Changeset 17972


Ignore:
Timestamp:
05/09/14 14:03:34 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added DragCoefficientAbsGradientx in module

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

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.cpp

    r17971 r17972  
    195195}
    196196/*}}}*/
     197void       Seg::GradjDragGradient(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
     198
     199        int        i;
     200        int        vertexpidlist[NUMVERTICES];
     201        IssmDouble Jdet,weight;
     202        IssmDouble xyz_list[NUMVERTICES][3];
     203        IssmDouble dbasis[NDOF2][NUMVERTICES];
     204        IssmDouble dk[NDOF2];
     205        IssmDouble grade_g[NUMVERTICES]={0.0};
     206        GaussSeg  *gauss=NULL;
     207
     208        /*Retrieve all inputs we will be needing: */
     209        if(IsFloating())return;
     210        ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
     211        GradientIndexing(&vertexpidlist[0],control_index);
     212        Input* dragcoefficient_input=inputs->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input);
     213        Input* weights_input=inputs->GetInput(InversionCostFunctionsCoefficientsEnum);                 _assert_(weights_input);
     214
     215        /* Start  looping on the number of gaussian points: */
     216        gauss=new GaussSeg(2);
     217        for(int ig=gauss->begin();ig<gauss->end();ig++){
     218
     219                gauss->GaussPoint(ig);
     220
     221                GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
     222                GetNodalFunctionsDerivatives(&dbasis[0][0],&xyz_list[0][0],gauss);
     223                weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum);
     224
     225                /*Build alpha_complement_list: */
     226                dragcoefficient_input->GetInputDerivativeValue(&dk[0],&xyz_list[0][0],gauss);
     227
     228                /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
     229                for (i=0;i<NUMVERTICES;i++){
     230                        grade_g[i]+=-weight*Jdet*gauss->weight*dbasis[0][i]*dk[0];
     231                        _assert_(!xIsNan<IssmDouble>(grade_g[i]));
     232                }
     233        }
     234        gradient->SetValues(NUMVERTICES,vertexpidlist,grade_g,ADD_VAL);
     235
     236        /*Clean up and return*/
     237        delete gauss;
     238}
     239/*}}}*/
    197240bool       Seg::IsIcefront(void){/*{{{*/
    198241
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r17971 r17972  
    177177                void       GradjDragSSA(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
    178178                void       GradjDragFS(Vector<IssmDouble>* gradient,int control_index);
    179                 void       GradjDragGradient(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
     179                void       GradjDragGradient(Vector<IssmDouble>* gradient,int control_index);
    180180                void       GradjDhDtBalancedthickness(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
    181181                void       GradjVxBalancedthickness(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
  • TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r17971 r17972  
    28872887                        }
    28882888                        break;
    2889                         GradjDragSSA(gradient,control_index);
    2890                         break;
    28912889                case MaterialsRheologyBbarEnum:
    28922890                        GradjBSSA(gradient,control_index);
     
    29332931                        break;
    29342932                case DragCoefficientAbsGradientEnum:
    2935                         GradjDragGradient(gradient,control_index);
     2933                        inputs->GetInputValue(&approximation,ApproximationEnum);
     2934                        switch(approximation){
     2935                                case SSAApproximationEnum:
     2936                                        GradjDragGradient(gradient,control_index);
     2937                                        break;
     2938                                case FSApproximationEnum:{
     2939                                        if(IsFloating() || !IsOnBase()) return;
     2940                                        int index1,index2;
     2941                                        this->EdgeOnBaseIndices(&index1,&index2);
     2942                                        Seg* seg = SpawnSeg(index1,index2);
     2943                                        seg->GradjDragGradient(gradient,control_index);
     2944                                        seg->DeleteMaterials(); delete seg;
     2945                                        break;
     2946                                                                                                 }
     2947                                case NoneApproximationEnum:
     2948                                        /*Gradient is 0*/
     2949                                        break;
     2950                                default:
     2951                                        _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
     2952                        }
    29362953                        break;
    29372954                case RheologyBbarAbsGradientEnum:
  • TabularUnified issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp

    r16314 r17972  
    1010void DragCoefficientAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
    1111
    12         /*Intermediary*/
    13         int i;
    14         Element* element=NULL;
    15 
    1612        /*output: */
    17         IssmDouble J=0;
     13        IssmDouble J=0.;
    1814        IssmDouble J_sum;
    1915
    2016        /*Compute Misfit: */
    21         for (i=0;i<elements->Size();i++){
    22                 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
    23                 J+=element->DragCoefficientAbsGradient();
     17        for(int i=0;i<elements->Size();i++){
     18                Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
     19                J+=DragCoefficientAbsGradient(element);
    2420        }
    2521
     
    3228        *pJ=J;
    3329}
     30
     31IssmDouble DragCoefficientAbsGradient(Element* element){
     32
     33        int         domaintype,numcomponents;
     34        bool        surfaceintegral;
     35        IssmDouble  Jelem=0.;
     36        IssmDouble  misfit,Jdet;
     37        IssmDouble  dp[2],weight;
     38        IssmDouble* xyz_list      = NULL;
     39
     40        /*Get basal element*/
     41        if(!element->IsOnBase()) return 0.;
     42
     43        /*If on water, return 0: */
     44        if(!element->IsIceInElement()) return 0.;
     45
     46        /*Get problem dimension*/
     47        element->FindParam(&domaintype,DomainTypeEnum);
     48        switch(domaintype){
     49                case Domain2DverticalEnum:
     50                        surfaceintegral = true;
     51                        numcomponents   = 1;
     52                        break;
     53                case Domain3DEnum:
     54                        surfaceintegral = true;
     55                        numcomponents   = 2;
     56                        break;
     57                case Domain2DhorizontalEnum:
     58                        surfaceintegral = false;
     59                        numcomponents   = 2;
     60                        break;
     61                default: _error_("not supported yet");
     62        }
     63
     64        /*Spawn basal element*/
     65        Element* basalelement = element->SpawnBasalElement();
     66
     67        /* Get node coordinates*/
     68        basalelement->GetVerticesCoordinates(&xyz_list);
     69
     70        /*Retrieve all inputs we will be needing: */
     71        Input* weights_input=basalelement->GetInput(InversionCostFunctionsCoefficientsEnum);   _assert_(weights_input);
     72        Input* drag_input   =basalelement->GetInput(FrictionCoefficientEnum); _assert_(drag_input);
     73
     74        /* Start  looping on the number of gaussian points: */
     75        Gauss* gauss=basalelement->NewGauss(2);
     76        for(int ig=gauss->begin();ig<gauss->end();ig++){
     77
     78                gauss->GaussPoint(ig);
     79
     80                /* Get Jacobian determinant: */
     81                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     82
     83                /*Get all parameters at gaussian point*/
     84                weights_input->GetInputValue(&weight,gauss,DragCoefficientAbsGradientEnum);
     85                drag_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss);
     86
     87                /*Compute Tikhonov regularization J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */
     88                Jelem+=weight*.5*dp[0]*dp[0]*Jdet*gauss->weight;
     89                if(numcomponents==2) Jelem+=weight*.5*dp[1]*dp[1]*Jdet*gauss->weight;
     90
     91        }
     92
     93        /*clean up and Return: */
     94        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     95        xDelete<IssmDouble>(xyz_list);
     96        delete gauss;
     97        return Jelem;
     98}
  • TabularUnified issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h

    r16314 r17972  
    1010/* local prototypes: */
    1111void DragCoefficientAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters);
     12IssmDouble DragCoefficientAbsGradient(Element* element);
    1213
    1314#endif
  • TabularUnified issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp

    r17969 r17972  
    1010void SurfaceAbsVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
    1111
    12         /*Intermediary*/
    13         int i;
    14         Element* element=NULL;
    15 
    1612        /*output: */
    17         IssmDouble J=0;
     13        IssmDouble J=0.;
    1814        IssmDouble J_sum;
    1915
    2016        /*Compute Misfit: */
    21         for (i=0;i<elements->Size();i++){
    22                 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
     17        for(int i=0;i<elements->Size();i++){
     18                Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
    2319                J+=SurfaceAbsVelMisfit(element);
    2420        }
     
    4036        IssmDouble misfit,Jdet;
    4137        IssmDouble vx,vy,vxobs,vyobs,weight;
    42         IssmDouble* xyz_list_top = NULL;
     38        IssmDouble* xyz_list = NULL;
    4339
    4440        /*Get basal element*/
     
    6662        }
    6763
     64        /*Spawn surface element*/
     65        Element* topelement = element->SpawnTopElement();
     66
    6867        /* Get node coordinates*/
    69         if(surfaceintegral) element->GetVerticesCoordinatesTop(&xyz_list_top);
    70         else                element->GetVerticesCoordinates(&xyz_list_top);
     68        topelement->GetVerticesCoordinates(&xyz_list);
    7169
    7270        /*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);
     71        Input* weights_input=topelement->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
     72        Input* vx_input     =topelement->GetInput(VxEnum);                                 _assert_(vx_input);
     73        Input* vxobs_input  =topelement->GetInput(InversionVxObsEnum);                     _assert_(vxobs_input);
    7674        Input* vy_input     = NULL;
    7775        Input* vyobs_input  = NULL;
    7876        if(numcomponents==2){
    79                 vy_input    =element->GetInput(VyEnum);              _assert_(vy_input);
    80                 vyobs_input =element->GetInput(InversionVyObsEnum);  _assert_(vyobs_input);
     77                vy_input    =topelement->GetInput(VyEnum);              _assert_(vy_input);
     78                vyobs_input =topelement->GetInput(InversionVyObsEnum);  _assert_(vyobs_input);
    8179        }
    8280
    8381        /* 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);
     82        Gauss* gauss=topelement->NewGauss(2);
    8783        for(int ig=gauss->begin();ig<gauss->end();ig++){
    8884
     
    9086
    9187                /* Get Jacobian determinant: */
    92                 if(surfaceintegral) element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss);
    93                 else                element->JacobianDeterminant(&Jdet,xyz_list_top,gauss);
     88                topelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
    9489
    9590                /*Get all parameters at gaussian point*/
     
    117112
    118113        /*clean up and Return: */
     114        if(domaintype!=Domain2DhorizontalEnum){topelement->DeleteMaterials(); delete topelement;};
     115        xDelete<IssmDouble>(xyz_list);
    119116        delete gauss;
    120117        return Jelem;
Note: See TracChangeset for help on using the changeset viewer.