source: issm/oecreview/Archive/18296-19100/ISSM-18349-18350.diff@ 19102

Last change on this file since 19102 was 19102, checked in by Mathieu Morlighem, 10 years ago

NEW: added 18296-19100

File size: 4.4 KB
  • ../trunk-jpl/src/c/solutionsequences/solutionsequence_fct.cpp

     
    111111        *pdmax = dmax;
    112112        *pLHS  = LHS;
    113113}/*}}}*/
     114void CreateRHS(Vec* pRHS,Mat K,Mat D,Vec Ml,Vec u,IssmDouble theta,IssmDouble deltat,IssmDouble dmax,FemModel* femmodel,int configuration_type){/*{{{*/
     115        /*Create Left Hand side of Lower order solution
     116         *
     117         * RHS = [ML + (1 − theta) deltaT L^n] u^n
     118         *
     119         * where L = K + D
     120         *
     121         */
     122
     123        /*Intermediaries*/
     124        Vec         Ku  = NULL;
     125        Vec         Du  = NULL;
     126        Vec         RHS = NULL;
     127        int         dof;
     128        IssmDouble  d;
     129
     130        /*Initialize vectors*/
     131        VecDuplicate(u,&Ku);
     132        VecDuplicate(u,&Du);
     133        VecDuplicate(u,&RHS);
     134
     135        /*Create RHS = M*u + (1-theta)*deltat*K*u + (1-theta)*deltat*D*u*/
     136        MatMult(K,u,Ku);
     137        MatMult(D,u,Du);
     138        VecPointwiseMult(RHS,Ml,u);
     139        VecAXPBYPCZ(RHS,(1-theta)*deltat,(1-theta)*deltat,1,Ku,Du);
     140        VecFree(&Ku);
     141        VecFree(&Du);
     142
     143        /*Penalize Dirichlet boundary*/
     144        for(int i=0;i<femmodel->constraints->Size();i++){
     145                Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
     146                if(constraint->InAnalysis(configuration_type)){
     147                        constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
     148                        d = d*dmax;
     149                        if(dof!=-1){
     150                                VecSetValues(RHS,1,&dof,(const double*)&d,INSERT_VALUES);
     151                        }
     152                }
     153        }
     154        VecAssemblyBegin(RHS);
     155        VecAssemblyEnd(  RHS);
     156
     157        /*Assign output pointer*/
     158        *pRHS = RHS;
     159
     160}/*}}}*/
    114161#endif
    115162void solutionsequence_fct(FemModel* femmodel){
    116163
     
    120167        Matrix<IssmDouble>*  Mc = NULL;
    121168        Vector<IssmDouble>*  ug = NULL;
    122169        Vector<IssmDouble>*  uf = NULL;
    123         Vector<IssmDouble>*  ys = NULL;
    124170
    125         IssmDouble theta,deltat,dmax=0.;
    126         int        dof,ncols,ncols2,ncols3,rstart,rend;
    127         int        configuration_type,analysis_type;
    128         double     d,mi;
     171        IssmDouble theta,deltat,dmax;
     172        int        dof,ncols,ncols2,rstart,rend;
     173        int        configuration_type;
     174        double     d;
    129175        int*       cols  = NULL;
    130176        int*       cols2 = NULL;
    131         int*       cols3 = NULL;
    132177        double*    vals  = NULL;
    133178        double*    vals2 = NULL;
    134         double*    vals3 = NULL;
    135179
    136180        /*Create analysis*/
    137181        MasstransportAnalysis* analysis = new MasstransportAnalysis();
     
    139183        /*Recover parameters: */
    140184        femmodel->parameters->FindParam(&deltat,TimesteppingTimeStepEnum);
    141185        femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
    142         femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
    143186        femmodel->UpdateConstraintsx();
    144187        theta = 0.5;
    145188
     
    151194        /*Convert matrices to PETSc matrices*/
    152195        Mat D_petsc  = NULL;
    153196        Mat LHS      = NULL;
     197        Vec RHS      = NULL;
     198        Vec u        = NULL;
    154199        Mat K_petsc  = K->pmatrix->matrix;
    155200        Vec Ml_petsc = Ml->pvector->vector;
    156201        Mat Mc_petsc = Mc->pmatrix->matrix;
     
    166211        GetSolutionFromInputsx(&ug,femmodel);
    167212        Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
    168213        delete ug;
    169         Vec u  = uf->pvector->vector;
    170         Vec Ku = NULL;
    171         Vec Du = NULL;
    172         Vec RHS = NULL;
    173         VecDuplicate(u,&Ku);
    174         VecDuplicate(u,&Du);
    175         VecDuplicate(u,&RHS);
    176         MatMult(K_petsc,u,Ku);
    177         MatMult(D_petsc,u,Du);
    178         VecPointwiseMult(RHS,Ml_petsc,u);
    179         VecAXPBYPCZ(RHS,(1-theta)*deltat,(1-theta)*deltat,1,Ku,Du);// RHS = M*u + (1-theta)*deltat*K*u + (1-theta)*deltat*D*u
    180         VecFree(&Ku);
    181         VecFree(&Du);
     214        CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
    182215        delete uf;
    183216
    184         /*Penalize Dirichlet boundary*/
    185         for(int i=0;i<femmodel->constraints->Size();i++){
    186                 Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);
    187                 if(constraint->InAnalysis(analysis_type)){
    188                         constraint->PenaltyDofAndValue(&dof,&d,femmodel->nodes,femmodel->parameters);
    189                         d = d*dmax;
    190                         if(dof!=-1){
    191                                 VecSetValues(RHS,1,&dof,(const double*)&d,INSERT_VALUES);
    192                         }
    193                 }
    194         }
    195         VecAssemblyBegin(RHS);
    196         VecAssemblyEnd(  RHS);
    197 
    198217        /*Go solve!*/
    199218        SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters);
    200219        MatFree(&LHS);
     
    324343        uf =new Vector<IssmDouble>(u);
    325344        VecFree(&u);
    326345
    327         Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
    328         InputUpdateFromSolutionx(femmodel,ug);
    329         delete ug; 
     346        InputUpdateFromSolutionx(femmodel,uf);
     347        delete uf;
    330348
    331349        #else
    332350        _error_("PETSc needs to be installed");
Note: See TracBrowser for help on using the repository browser.