Changeset 16752


Ignore:
Timestamp:
11/13/13 21:16:11 (11 years ago)
Author:
seroussi
Message:

CHG: added InputUpdateFromSolution for Adjoint Stokes

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

Legend:

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

    r16751 r16752  
    3030}/*}}}*/
    3131void AdjointHorizAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
     32        int approximation;
     33        element->GetInputValue(&approximation,ApproximationEnum);
     34        if(approximation==FSApproximationEnum || approximation==NoneApproximationEnum){
     35                InputUpdateFromSolutionFS(solution,element);
     36        }
     37        else{
     38                InputUpdateFromSolutionHoriz(solution,element);
     39        }
     40}/*}}}*/
     41void AdjointHorizAnalysis::InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element){/*{{{*/
    3242        int  i;
    3343        int* doflist=NULL;
     
    6979        xDelete<int>(doflist);
    7080}/*}}}*/
     81void AdjointHorizAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
     82        int          i;
     83        int*         vdoflist=NULL;
     84        int*         pdoflist=NULL;
     85        IssmDouble   FSreconditioning;
     86
     87        /*Fetch number of nodes and dof for this finite element*/
     88        int vnumnodes = element->GetNumberOfNodesVelocity();
     89        int pnumnodes = element->GetNumberOfNodesPressure();
     90        int vnumdof   = vnumnodes*3;
     91        int pnumdof   = pnumnodes*1;
     92
     93        /*Initialize values*/
     94        IssmDouble* vvalues = xNew<IssmDouble>(vnumdof);
     95        IssmDouble* pvalues = xNew<IssmDouble>(pnumdof);
     96        IssmDouble* lambdax = xNew<IssmDouble>(vnumnodes);
     97        IssmDouble* lambday = xNew<IssmDouble>(vnumnodes);
     98        IssmDouble* lambdaz = xNew<IssmDouble>(vnumnodes);
     99        IssmDouble* lambdap = xNew<IssmDouble>(pnumnodes);
     100
     101        /*Get dof list: */
     102        element->GetDofListVelocity(&vdoflist,GsetEnum);
     103        element->GetDofListPressure(&pdoflist,GsetEnum);
     104
     105        /*Use the dof list to index into the solution vector: */
     106        for(i=0;i<vnumdof;i++) vvalues[i]=solution[vdoflist[i]];
     107        for(i=0;i<pnumdof;i++) pvalues[i]=solution[pdoflist[i]];
     108
     109        /*Transform solution in Cartesian Space*/
     110        element->TransformSolutionCoord(&vvalues[0],XYZEnum);
     111
     112        /*fill in all arrays: */
     113        for(i=0;i<vnumnodes;i++){
     114                lambdax[i] = vvalues[i*NDOF3+0]; if(xIsNan<IssmDouble>(lambdax[i])) _error_("NaN found in solution vector");
     115                lambday[i] = vvalues[i*NDOF3+1]; if(xIsNan<IssmDouble>(lambday[i])) _error_("NaN found in solution vector");
     116                lambdaz[i] = vvalues[i*NDOF3+2]; if(xIsNan<IssmDouble>(lambdaz[i])) _error_("NaN found in solution vector");
     117        }
     118        for(i=0;i<pnumnodes;i++){
     119                lambdap[i] = pvalues[i]; if(xIsNan<IssmDouble>(lambdap[i])) _error_("NaN found in solution vector");
     120        }
     121
     122        /*Recondition pressure and compute vel: */
     123        element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
     124        for(i=0;i<pnumnodes;i++) lambdap[i]=lambdap[i]*FSreconditioning;
     125
     126        /*Add vx and vy as inputs to the tria element: */
     127        element->AddInput(AdjointxEnum,lambdax,P1Enum);
     128        element->AddInput(AdjointyEnum,lambday,P1Enum);
     129        element->AddInput(AdjointzEnum,lambdaz,P1Enum);
     130        element->AddInput(AdjointpEnum,lambdap,P1Enum);
     131
     132        /*Free ressources:*/
     133        xDelete<int>(vdoflist);
     134        xDelete<int>(pdoflist);
     135        xDelete<IssmDouble>(lambdap);
     136        xDelete<IssmDouble>(lambdaz);
     137        xDelete<IssmDouble>(lambday);
     138        xDelete<IssmDouble>(lambdax);
     139        xDelete<IssmDouble>(vvalues);
     140        xDelete<IssmDouble>(pvalues);
     141}/*}}}*/
  • issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h

    r16684 r16752  
    2020                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    2121                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
     22                void InputUpdateFromSolutionHoriz(IssmDouble* solution,Element* element);
     23                void InputUpdateFromSolutionFS(IssmDouble* solution,Element* element);
    2224};
    2325#endif
Note: See TracChangeset for help on using the changeset viewer.