Changeset 17971


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

NEW: inversions for FS blowbands

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

Legend:

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

    r17969 r17971  
    332332        /*Prepare coordinate system list*/
    333333        int* cs_list = xNew<int>(vnumnodes+pnumnodes);
    334         for(i=0;i<vnumnodes;i++) cs_list[i]           = XYZEnum;
     334        if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
     335        else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
    335336        for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
    336337
     
    513514        delete gauss;
    514515        return pe;
    515         _error_("S");
    516516}/*}}}*/
    517517ElementVector* AdjointHorizAnalysis::CreatePVectorHO(Element* element){/*{{{*/
     
    951951}/*}}}*/
    952952void AdjointHorizAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
    953         int          i;
     953        int          i,dim;
    954954        int*         vdoflist=NULL;
    955955        int*         pdoflist=NULL;
    956956        IssmDouble   FSreconditioning;
    957957
     958        element->FindParam(&dim,DomainDimensionEnum);
     959
    958960        /*Fetch number of nodes and dof for this finite element*/
    959961        int vnumnodes = element->NumberofNodesVelocity();
    960962        int pnumnodes = element->NumberofNodesPressure();
    961         int vnumdof   = vnumnodes*3;
     963        int vnumdof   = vnumnodes*dim;
    962964        int pnumdof   = pnumnodes*1;
    963965
     
    970972
    971973        int* cs_list = xNew<int>(vnumnodes+pnumnodes);
    972         for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
     974        if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum;
     975        else       for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum;
    973976        for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum;
    974977
  • issm/trunk-jpl/src/c/classes/Elements/Seg.cpp

    r17962 r17971  
    116116
    117117}/*}}}*/
     118void       Seg::GradientIndexing(int* indexing,int control_index){/*{{{*/
     119
     120        /*Get some parameters*/
     121        int num_controls;
     122        parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
     123
     124        /*get gradient indices*/
     125        for(int i=0;i<NUMVERTICES;i++){
     126                indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;
     127        }
     128
     129}
     130/*}}}*/
     131void       Seg::GradjDragFS(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
     132
     133        int        i;
     134        int        analysis_type;
     135        int        vertexpidlist[NUMVERTICES];
     136        int        connectivity[NUMVERTICES];
     137        IssmDouble vx,lambda,alpha_complement,drag,Jdet;
     138        IssmDouble xyz_list[NUMVERTICES][3];
     139        IssmDouble dk[NDOF2];
     140        IssmDouble grade_g[NUMVERTICES]={0.0};
     141        IssmDouble grade_g_gaussian[NUMVERTICES];
     142        IssmDouble basis[3];
     143        Friction*  friction=NULL;
     144        GaussSeg  *gauss=NULL;
     145
     146        if(IsFloating())return;
     147
     148        /*retrive parameters: */
     149        parameters->FindParam(&analysis_type,AnalysisTypeEnum);
     150        ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
     151        GradientIndexing(&vertexpidlist[0],control_index);
     152        this->GetVerticesConnectivityList(&connectivity[0]);
     153
     154        /*Build frictoin element, needed later: */
     155        friction=new Friction(this,1);
     156
     157        /*Retrieve all inputs we will be needing: */
     158        Input* adjointx_input=inputs->GetInput(AdjointxEnum);                   _assert_(adjointx_input);
     159        Input* vx_input=inputs->GetInput(VxEnum);                               _assert_(vx_input);
     160        Input* dragcoefficient_input=inputs->GetInput(FrictionCoefficientEnum); _assert_(dragcoefficient_input);
     161
     162        /* Start  looping on the number of gaussian points: */
     163        gauss=new GaussSeg(4);
     164        for(int ig=gauss->begin();ig<gauss->end();ig++){
     165
     166                gauss->GaussPoint(ig);
     167
     168                GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
     169                GetNodalFunctions(basis, gauss);
     170
     171                /*Build alpha_complement_list: */
     172                friction->GetAlphaComplement(&alpha_complement,gauss);
     173
     174                dragcoefficient_input->GetInputValue(&drag, gauss);
     175                adjointx_input->GetInputValue(&lambda, gauss);
     176                vx_input->GetInputValue(&vx,gauss);
     177                dragcoefficient_input->GetInputDerivativeValue(&dk[0],&xyz_list[0][0],gauss);
     178
     179                /*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
     180                for (i=0;i<NUMVERTICES;i++){
     181                        grade_g_gaussian[i]=-2*drag*alpha_complement*(lambda*vx)*Jdet*gauss->weight*basis[i];
     182                }
     183
     184                /*Add gradje_g_gaussian vector to gradje_g: */
     185                for(i=0;i<NUMVERTICES;i++){
     186                        _assert_(!xIsNan<IssmDouble>(grade_g[i]));
     187                        grade_g[i]+=grade_g_gaussian[i];
     188                }
     189        }
     190        gradient->SetValues(NUMVERTICES,vertexpidlist,grade_g,ADD_VAL);
     191
     192        /*Clean up and return*/
     193        delete gauss;
     194        delete friction;
     195}
     196/*}}}*/
    118197bool       Seg::IsIcefront(void){/*{{{*/
    119198
  • issm/trunk-jpl/src/c/classes/Elements/Seg.h

    r17926 r17971  
    169169
    170170                IssmDouble DragCoefficientAbsGradient(void){_error_("not implemented yet");};
    171                 void       GradientIndexing(int* indexing,int control_index){_error_("not implemented yet");};
     171                void       GradientIndexing(int* indexing,int control_index);
    172172                void       Gradj(Vector<IssmDouble>* gradient,int control_type,int control_index){_error_("not implemented yet");};
    173173                void       GradjBGradient(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
     
    176176                void       GradjDSSA(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
    177177                void       GradjDragSSA(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
    178                 void       GradjDragFS(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
     178                void       GradjDragFS(Vector<IssmDouble>* gradient,int control_index);
    179179                void       GradjDragGradient(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
    180180                void       GradjDhDtBalancedthickness(Vector<IssmDouble>* gradient,int control_index){_error_("not implemented yet");};
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r17962 r17971  
    28632863        /*dJ/dalpha = ∂L/∂alpha = ∂J/∂alpha + ∂/∂alpha(KU-F)*/
    28642864
     2865        int   approximation;
     2866        Seg*  seg=NULL;
     2867
    28652868        /*If on water, grad = 0: */
    28662869        if(!IsIceInElement()) return;
     
    28692872        switch(control_type){
    28702873                case FrictionCoefficientEnum:
     2874                        inputs->GetInputValue(&approximation,ApproximationEnum);
     2875                        switch(approximation){
     2876                                case SSAApproximationEnum:
     2877                                        GradjDragSSA(gradient,control_index);
     2878                                        break;
     2879                                case FSApproximationEnum:
     2880                                        GradjDragFS(gradient,control_index);
     2881                                        break;
     2882                                case NoneApproximationEnum:
     2883                                        /*Gradient is 0*/
     2884                                        break;
     2885                                default:
     2886                                        _error_("approximation " << EnumToStringx(approximation) << " not supported yet");
     2887                        }
     2888                        break;
    28712889                        GradjDragSSA(gradient,control_index);
    28722890                        break;
     
    31633181        delete gauss;
    31643182        delete friction;
     3183}
     3184/*}}}*/
     3185void       Tria::GradjDragFS(Vector<IssmDouble>* gradient,int control_index){/*{{{*/
     3186
     3187        /*Gradient is 0 if on shelf or not on bed*/
     3188        if(IsFloating() || !IsOnBase()) return;
     3189
     3190        int index1,index2;
     3191        this->EdgeOnBaseIndices(&index1,&index2);
     3192        Seg* seg = SpawnSeg(index1,index2);
     3193        seg->GradjDragFS(gradient,control_index);
     3194        seg->DeleteMaterials(); delete seg;
    31653195}
    31663196/*}}}*/
  • issm/trunk-jpl/src/c/cores/adjointstressbalance_core.cpp

    r16518 r17971  
    3838                if(VerboseSolution()) _printf0_("   saving results\n");
    3939                if (isFS){
    40                         int outputs[4] = {AdjointxEnum,AdjointyEnum,AdjointzEnum,AdjointpEnum};
    41                         femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],4);
     40                        //int outputs[4] = {AdjointxEnum,AdjointyEnum,AdjointzEnum,AdjointpEnum};
     41                        //femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],4);
     42                        int outputs[3] = {AdjointxEnum,AdjointyEnum,AdjointpEnum};
     43                        femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3);
    4244                }
    4345                else{
Note: See TracChangeset for help on using the changeset viewer.