Changeset 17511


Ignore:
Timestamp:
03/20/14 17:16:09 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: done with depth averaging solution :)

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

Legend:

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

    r17494 r17511  
    5050
    5151        /*Intermediaries */
    52         IssmDouble  Jdet,D;
     52        IssmDouble  Jdet,D,dt=1.e+9;
    5353        IssmDouble *xyz_list = NULL;
    5454
     
    5959                case Mesh2DverticalEnum: dim = 2; break;
    6060                case Mesh3DEnum:         dim = 3; break;
     61                case Mesh3DtetrasEnum:    dim = 3; break;
    6162                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
    6263        }
     
    6869        ElementMatrix* Ke     = element->NewElementMatrix();
    6970        IssmDouble*    B      = xNew<IssmDouble>(numnodes);
    70         IssmDouble*    Bprime = xNew<IssmDouble>(numnodes);
    7171
    7272        /*Retrieve all inputs and parameters*/
     
    7979
    8080                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    81                 element->NodalFunctions(Bprime,gauss);
    8281                GetB(B,element,dim,xyz_list,gauss);
    83                 D=gauss->weight*Jdet;
     82                D=gauss->weight*Jdet*dt;
    8483
     84                /*vertical diffusion*/
    8585                TripleMultiply(B,1,numnodes,1,
    8686                                        &D,1,1,0,
    87                                         Bprime,1,numnodes,0,
     87                                        B,1,numnodes,0,
     88                                        &Ke->values[0],1);
     89
     90                /*Next value*/
     91                D=gauss->weight*Jdet;
     92                element->NodalFunctions(B,gauss);
     93                TripleMultiply(B,numnodes,1,0,
     94                                        &D,1,1,0,
     95                                        B,1,numnodes,0,
    8896                                        &Ke->values[0],1);
    8997        }
     
    92100        xDelete<IssmDouble>(xyz_list);
    93101        xDelete<IssmDouble>(B);
    94         xDelete<IssmDouble>(Bprime);
    95102        delete gauss;
    96103        return Ke;
    97104}/*}}}*/
    98105ElementVector* DepthAverageAnalysis::CreatePVector(Element* element){/*{{{*/
    99         return NULL;
     106
     107        /*Intermediaries*/
     108        int         input_enum;
     109        IssmDouble  Jdet,scalar,value;
     110        IssmDouble* xyz_list = NULL;
     111
     112        /*Fetch number of nodes and dof for this finite element*/
     113        int numnodes = element->GetNumberOfNodes();
     114
     115        /*Initialize Element vector*/
     116        ElementVector* pe     = element->NewElementVector();
     117        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     118
     119        /*Retrieve all inputs and parameters*/
     120        element->GetVerticesCoordinates(&xyz_list);
     121        element->FindParam(&input_enum,InputToDepthaverageEnum);
     122        Input* input = element->GetInput(input_enum); _assert_(input);
     123
     124        /* Start  looping on the number of gaussian points: */
     125        Gauss* gauss=element->NewGauss(3);
     126        for(int ig=gauss->begin();ig<gauss->end();ig++){
     127                gauss->GaussPoint(ig);
     128
     129                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     130                element->NodalFunctions(basis,gauss);
     131
     132                /* Build transient now */
     133                input->GetInputValue(&value, gauss);
     134                scalar=value*Jdet*gauss->weight;
     135                for(int i=0;i<numnodes;i++) pe->values[i]+=scalar*basis[i];
     136
     137        }
     138
     139        /*Clean up and return*/
     140        xDelete<IssmDouble>(basis);
     141        xDelete<IssmDouble>(xyz_list);
     142        delete gauss;
     143        return pe;
    100144}/*}}}*/
    101145void DepthAverageAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
  • issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp

    r17493 r17511  
    445445}
    446446/*}}}*/
     447/*FUNCTION Tetra::InputUpdateFromSolutionOneDof{{{*/
     448void  Tetra::InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type){
     449
     450        /*Intermediary*/
     451        int* doflist = NULL;
     452
     453        /*Fetch number of nodes for this finite element*/
     454        int numnodes = this->NumberofNodes();
     455
     456        /*Fetch dof list and allocate solution vector*/
     457        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     458        IssmDouble* values    = xNew<IssmDouble>(numnodes);
     459
     460        /*Use the dof list to index into the solution vector: */
     461        for(int i=0;i<numnodes;i++){
     462                values[i]=solution[doflist[i]];
     463                if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
     464        }
     465
     466        /*Add input to the element: */
     467        this->inputs->AddInput(new TetraInput(enum_type,values,P1Enum));
     468
     469        /*Free ressources:*/
     470        xDelete<IssmDouble>(values);
     471        xDelete<int>(doflist);
     472}
     473/*}}}*/
    447474/*FUNCTION Tetra::IsIceInElement    THIS ONE{{{*/
    448475bool   Tetra::IsIceInElement(){
  • issm/trunk-jpl/src/c/classes/Elements/Tetra.h

    r17493 r17511  
    4747                /*Update virtual functions resolution: {{{*/
    4848                void  InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
    49                 void  InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
     49                void  InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum);
    5050                void  InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
    5151#ifdef _HAVE_DAKOTA_
  • issm/trunk-jpl/src/c/cores/AnalysisConfiguration.cpp

    r17305 r17511  
    2626
    2727                case StressbalanceSolutionEnum:
    28                         numanalyses=5;
     28                        numanalyses=6;
    2929                        analyses=xNew<int>(numanalyses);
    3030                        analyses[0]=StressbalanceAnalysisEnum;
     
    3333                        analyses[3]=L2ProjectionBaseAnalysisEnum;
    3434                        analyses[4]=ExtrudeFromBaseAnalysisEnum;
     35                        analyses[5]=DepthAverageAnalysisEnum;
    3536                        break;
    3637
  • issm/trunk-jpl/src/c/cores/cores.h

    r17274 r17511  
    3030void controltao_core(FemModel* femmodel);
    3131void masstransport_core(FemModel* femmodel);
     32void depthaverage_core(FemModel* femmodel);
    3233void extrudefrombase_core(FemModel* femmodel);
    3334void extrudefromtop_core(FemModel* femmodel);
  • issm/trunk-jpl/src/c/cores/depthaverage_core.cpp

    r17494 r17511  
    1212void depthaverage_core(FemModel* femmodel){
    1313
    14         if(VerboseSolution()) _printf0_("extruding solution from base...\n");
     14        if(VerboseSolution()) _printf0_("depth averaging...\n");
    1515
    1616        /*Call on core computations: */
  • issm/trunk-jpl/src/c/cores/surfaceslope_core.cpp

    r16612 r17511  
    3333        }
    3434        if(meshtype==Mesh2DverticalEnum){
    35               femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToExtrudeEnum);
     35                femmodel->parameters->SetParam(SurfaceSlopeXEnum,InputToExtrudeEnum);
    3636                extrudefrombase_core(femmodel);
    3737        }
Note: See TracChangeset for help on using the changeset viewer.