Changeset 17407


Ignore:
Timestamp:
03/11/14 07:22:01 (11 years ago)
Author:
jbondzio
Message:

CHG: extrapolate by diffusion or along normal by setting bool 'extrapolatebydiffusion'

File:
1 edited

Legend:

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

    r17363 r17407  
    5757        if(VerboseSolution()) _printf0_("extrapolation of " << EnumToStringx(extvar_enum) << ": call computational core:\n");
    5858        solutionsequence_linear(femmodel);
    59        
    60         save_results=true;
     59
     60        save_results=false;
    6161        if(save_results){
    6262                if(VerboseSolution()) _printf0_("   saving results\n");
     
    7979        const int dim = 2;
    8080        int        i,row,col,stabilization;
     81        bool       extrapolatebydiffusion = true;
    8182        IssmDouble Jdet,D_scalar,h;
    8283        IssmDouble dlsf[dim],normal[dim];
     
    9091        /*Initialize Element vector and other vectors*/
    9192        ElementMatrix* Ke     = element->NewElementMatrix();
     93        IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
    9294        IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
    9395        IssmDouble     D[dim][dim];
    9496
    9597        /*Retrieve all inputs and parameters*/
     98        Input* lsf_slopex_input=element->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);
     99        Input* lsf_slopey_input=element->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);
    96100        element->GetVerticesCoordinates(&xyz_list);
     101        h = element->CharacteristicLength();
    97102
    98103        /* Start  looping on the number of gaussian points: */
     
    102107
    103108                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     109                GetB(B,element,xyz_list,gauss);
    104110                GetBprime(Bprime,element,xyz_list,gauss);
    105 
     111               
    106112                D_scalar=gauss->weight*Jdet;
    107113
    108                 for(row=0;row<dim;row++)
    109                         for(col=0;col<dim;col++)
    110                                 D[row][col]=((row==col)?D_scalar:0.);
    111 
    112                 TripleMultiply(Bprime,dim,numnodes,1,
     114                if(extrapolatebydiffusion){
     115                        /* diffuse values outward */
     116                        for(row=0;row<dim;row++)
     117                                for(col=0;col<dim;col++)
     118                                        if(row==col)
     119                                                D[row][col] = D_scalar;
     120                                        else
     121                                                D[row][col] = 0.;
     122
     123                        TripleMultiply(Bprime,dim,numnodes,1,
    113124                                        &D[0][0],dim,dim,0,
    114125                                        Bprime,dim,numnodes,0,
    115126                                        &Ke->values[0],1);
     127                }
     128                else{
     129                        /* extrapolate values along normal */
     130                        /* Get normal on ice boundary */
     131                        lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
     132                        lsf_slopey_input->GetInputValue(&dlsf[1],gauss);
     133                        norm_dlsf=0.;
     134                        for(i=0;i<dim;i++)      norm_dlsf+=dlsf[i]*dlsf[i];
     135                        norm_dlsf=sqrt(norm_dlsf); _assert_(norm_dlsf>0.);
     136
     137                        if(norm_dlsf>0.)
     138                                for(i=0;i<dim;i++)      normal[i]=dlsf[i]/norm_dlsf;
     139                        else
     140                                for(i=0;i<dim;i++)      normal[i]=0.;
     141                       
     142                        for(row=0;row<dim;row++)
     143                                for(col=0;col<dim;col++)
     144                                        if(row==col)
     145                                                D[row][col]=D_scalar*normal[row];
     146                                        else
     147                                                D[row][col]=0.;
     148                        TripleMultiply(B,dim,numnodes,1,
     149                                                &D[0][0],dim,dim,0,
     150                                                Bprime,dim,numnodes,0,
     151                                                &Ke->values[0],1);
     152
     153                        /* Stabilization *//*{{{*/
     154                        stabilization=1;
     155                        if (stabilization==0){/* no stabilization, do nothing*/}
     156                        else if(stabilization==1){
     157                                /* Artificial Diffusion */
     158                                element->ElementSizes(&hx,&hy,&hz);
     159                                h=sqrt( pow(hx*normal[0],2) + pow(hy*normal[1],2));
     160                                kappa=h/2.+1.e-14;
     161                                D[0][0]=D_scalar*kappa;
     162                                D[0][1]=0.;
     163                                D[1][0]=0.;
     164                                D[1][1]=D_scalar*kappa;
     165                                TripleMultiply(Bprime,dim,numnodes,1,
     166                                                        &D[0][0],dim,dim,0,
     167                                                        Bprime,dim,numnodes,0,
     168                                                        &Ke->values[0],1);
     169                        }
     170                        else if(stabilization==2){
     171                                /*Streamline upwinding - do not use this for extrapolation: yields oscillating results due to smoothing along normal, not across */
     172                                for(row=0;row<dim;row++)
     173                                        for(col=0;col<dim;col++)
     174                                                D[row][col]=h/(2.*1.)*normal[row]*normal[col];
     175
     176                                TripleMultiply(Bprime,dim,numnodes,1,
     177                                                        &D[0][0],dim,dim,0,
     178                                                        Bprime,dim,numnodes,0,
     179                                                        &Ke->values[0],1);
     180                        }/*}}}*/
     181                }
    116182        }/*}}}*/
    117183
    118184        /*Clean up and return*/
    119185        xDelete<IssmDouble>(xyz_list);
     186        xDelete<IssmDouble>(B);
    120187        xDelete<IssmDouble>(Bprime);
    121188        delete gauss;
Note: See TracChangeset for help on using the changeset viewer.