Changeset 17114


Ignore:
Timestamp:
01/14/14 17:42:52 (11 years ago)
Author:
jbondzio
Message:

ADD: Building LSM shell pt2: Adding InputUpdateFromSolution, CreateKMatrix, Artificial Diffusivity etc. CHG: m/py code modified such that ice exists where LSF negative

Location:
issm/trunk-jpl/src
Files:
12 edited

Legend:

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

    r17098 r17114  
    5959/*Finite element Analysis*/
    6060void LevelsetAnalysis::Core(FemModel* femmodel){/*{{{*/
    61         _error_("not implemented yet");
     61
     62        /*parameters: */
     63        bool save_results;
     64
     65        /*activate formulation: */
     66        femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum);
     67
     68        /*recover parameters: */
     69        femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
     70
     71        if(VerboseSolution()) _printf0_("call computational core:\n");
     72        solutionsequence_linear(femmodel);
     73
     74        if(save_results){
     75                if(VerboseSolution()) _printf0_("   saving results\n");
     76                int outputs = MaskIceLevelsetEnum;
     77                femmodel->RequestedOutputsx(&femmodel->results,&outputs,1);
     78        }
    6279}/*}}}*/
    6380ElementVector* LevelsetAnalysis::CreateDVector(Element* element){/*{{{*/
     
    7087}/*}}}*/
    7188ElementMatrix* LevelsetAnalysis::CreateKMatrix(Element* element){/*{{{*/
     89
    7290        /*Intermediaries */
    73 
    74         int dim = 2; // solve for LSF in horizontal plane only
     91        int i,j,dim = 2; // solve for LSF in horizontal plane only
    7592        IssmDouble kappa;
    7693        IssmDouble Jdet, dt, D_scalar;
    77         IssmDouble u,v,um,vm,ub,vb,vx,vy;
     94        IssmDouble h,hx,hy,hz;
     95        IssmDouble vel,vx,vy,bx,by;
    7896        IssmDouble* xyz_list = NULL;
    7997
     
    86104        IssmDouble*    B        = xNew<IssmDouble>(dim*numnodes);
    87105        IssmDouble*    Bprime   = xNew<IssmDouble>(dim*numnodes);
    88         IssmDouble     D[dim][dim];
     106        IssmDouble     D[dim][dim], K[dim][dim];
    89107
    90108        /*Retrieve all inputs and parameters*/
     
    93111        Input* vx_input  = element->GetInput(VxEnum);     _assert_(vx_input);
    94112        Input* vy_input  = element->GetInput(VyEnum);     _assert_(vy_input);
    95         Input* vxm_input = element->GetInput(VxMeshEnum); _assert_(vxm_input);
    96         Input* vym_input = element->GetInput(VyMeshEnum); _assert_(vym_input);
    97113       
    98114        /* Start  looping on the number of gaussian points: */
     
    117133                GetB(B,element,xyz_list,gauss);
    118134                GetBprime(Bprime,element,xyz_list,gauss);
    119                 vx_input->GetInputValue(&u,gauss); vxm_input->GetInputValue(&um,gauss); vx=u-um;
    120                 vy_input->GetInputValue(&v,gauss); vym_input->GetInputValue(&vm,gauss); vy=v-vm;
    121                 ub=0.; // horizontal mass change velocities (melt/refreeze/calving) FIXME: insert values from model here
    122                 vb=0.;
    123                 D[0][0]=D_scalar*(vx+ub);
     135                vx_input->GetInputValue(&vx,gauss); // in 3D case, add mesh velocity
     136                vy_input->GetInputValue(&vy,gauss);
     137                bx=0.; // horizontal mass change velocities (melt/refreeze/calving) FIXME: insert values from model here
     138                by=0.;
     139                D[0][0]=D_scalar*(vx+bx);
    124140                D[0][1]=0.;
    125141                D[1][0]=0.;
    126                 D[1][1]=D_scalar*(vy+vb);
     142                D[1][1]=D_scalar*(vy+by);
    127143                TripleMultiply(B,dim,numnodes,1,
    128144                                        &D[0][0],dim,dim,0,
     
    130146                                        &Ke->values[0],1);
    131147
    132                 /* Artificial Diffusion */
    133                 kappa=0.; //FIXME: insert suitable value for kappa
    134                 GetBprime(Bprime,element,xyz_list,gauss); // recalculation of Bprime needed?
    135                 D[0][0]=D_scalar*kappa;
    136                 D[1][1]=D_scalar*kappa;
    137                 TripleMultiply(Bprime,dim,numnodes,1,
    138                                         &D[0][0],dim,dim,0,
    139                                         Bprime,dim,numnodes,0,
    140                                         &Ke->values[0],1);
     148                /* Stabilization */
     149                int stabilization=1;
     150                switch(stabilization){
     151                        case 0:
     152                                // no stabilization, do nothing
     153                                break;
     154                        case 1:
     155                                /* Artificial Diffusion */
     156                                element->ElementSizes(&hx,&hy,&hz);
     157                                vel=sqrt(vx*vx + vy*vy );
     158                                h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) ); //FIXME: is this correct?
     159
     160                                kappa=h*vel/2.; //FIXME: insert suitable value for kappa
     161                                //GetBprime(Bprime,element,xyz_list,gauss); // recalculation of Bprime needed?
     162                                D[0][0]=D_scalar*kappa;
     163                                D[0][1]=0.;
     164                                D[1][0]=0.;
     165                                D[1][1]=D_scalar*kappa;
     166                                TripleMultiply(Bprime,dim,numnodes,1,
     167                                                        &D[0][0],dim,dim,0,
     168                                                        Bprime,dim,numnodes,0,
     169                                                        &Ke->values[0],1);
     170                                break; 
     171                        case 2:
     172                                /* Streamline Upwinding */
     173                                element->ElementSizes(&hx,&hy,&hz);
     174                                vel=sqrt(vx*vx + vy*vy )+1.e-14;
     175                                h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) );
     176                                K[0][0]=h/(2.*vel)*vx*vx;  K[0][1]=h/(2.*vel)*vx*vy;
     177                                K[1][0]=h/(2.*vel)*vy*vx;  K[1][1]=h/(2.*vel)*vy*vy;
     178                                for(i=0;i<dim;i++) for(j=0;j<dim;j++) K[i][j] = D_scalar*K[i][j];
     179
     180                                //GetBprime(Bprime,element,xyz_list,gauss);
     181                                TripleMultiply(Bprime,dim,numnodes,1,
     182                                                        &K[0][0],dim,dim,0,
     183                                                        Bprime,dim,numnodes,0,
     184                                                        &Ke->values[0],1);
     185                                break;
     186                        default:
     187                                _error_("unknown type of stabilization in LevelsetAnalysis.cpp");
     188                }
    141189        }
    142190
     
    161209
    162210        /*Initialize Element vector*/
    163         ElementVector* pe    = element->NewElementVector();
     211        ElementVector* pe = element->NewElementVector();
    164212        element->FindParam(&dt,TimesteppingTimeStepEnum);
    165213       
     
    188236                delete gauss;
    189237        }
    190         else{for(i=0;i<numnodes;i++) pe->values[i]=0.;}
     238        else
     239                for(i=0;i<numnodes;i++)
     240                        pe->values[i]=0.;
    191241        return pe;
    192242}/*}}}*/
     
    195245}/*}}}*/
    196246void LevelsetAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
    197         _error_("not implemented yet");
     247
     248        int meshtype;
     249        element->FindParam(&meshtype,MeshTypeEnum);
     250        switch(meshtype){
     251                case Mesh2DhorizontalEnum:
     252                        element->InputUpdateFromSolutionOneDof(solution,MaskIceLevelsetEnum);
     253                        break;
     254                case Mesh3DEnum:
     255                        element->InputUpdateFromSolutionOneDofCollapsed(solution,MaskIceLevelsetEnum);
     256                        break;
     257                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     258        }
    198259}/*}}}*/
    199260void LevelsetAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r17109 r17114  
    146146                virtual void   GetNodesLidList(int* sidlist)=0;
    147147
     148                virtual int    Id()=0;
    148149                virtual int    Sid()=0;
    149150                virtual bool   IsNodeOnShelfFromFlags(IssmDouble* flags)=0;
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r17047 r17114  
    381381        /*clean-up*/
    382382        delete gauss;
     383}
     384/*}}}*/
     385/*FUNCTION Tria::ElementSizes{{{*/
     386void Tria::ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){
     387
     388        IssmDouble xyz_list[NUMVERTICES][3];
     389        IssmDouble xmin,ymin;
     390        IssmDouble xmax,ymax;
     391
     392        /*Get xyz list: */
     393        ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
     394        xmin=xyz_list[0][0]; xmax=xyz_list[0][0];
     395        ymin=xyz_list[0][1]; ymax=xyz_list[0][1];
     396
     397        for(int i=1;i<NUMVERTICES;i++){
     398                if(xyz_list[i][0]<xmin) xmin=xyz_list[i][0];
     399                if(xyz_list[i][0]>xmax) xmax=xyz_list[i][0];
     400                if(xyz_list[i][1]<ymin) ymin=xyz_list[i][1];
     401                if(xyz_list[i][1]>ymax) ymax=xyz_list[i][1];
     402        }
     403
     404        *hx=xmax-xmin;
     405        *hy=ymax-ymin;
     406        *hz=0.;
    383407}
    384408/*}}}*/
  • issm/trunk-jpl/src/c/classes/Elements/Tria.h

    r17109 r17114  
    6868                void        SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum);
    6969                void        Delta18oParameterization(void);
    70                 void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){_error_("not implemented yet");};
     70                void        ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
    7171                void        ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure){_error_("not implemented yet");};
    7272                void        EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){_error_("not implemented yet");};
  • issm/trunk-jpl/src/c/cores/transient_core.cpp

    r17078 r17114  
    5050        femmodel->parameters->FindParam(&isgia,TransientIsgiaEnum);
    5151        femmodel->parameters->FindParam(&isgroundingline,TransientIsgroundinglineEnum);
     52        femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum);
    5253        femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
    5354        if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum);
     
    161162                if(islevelset){
    162163                        if(VerboseSolution()) _printf0_("   computing movement of ice boundaries\n");
    163                         //analysis = new LevelsetAnalysis();
    164                         //analysis->Core(femmodel);
    165                         //delete analysis;
     164                        analysis = new LevelsetAnalysis();
     165                        analysis->Core(femmodel);
     166                        delete analysis;
    166167                }
    167168
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r17100 r17114  
    6868        parameters->AddObject(iomodel->CopyConstantObject(TransientIsgroundinglineEnum));
    6969        parameters->AddObject(iomodel->CopyConstantObject(TransientIsgiaEnum));
     70        parameters->AddObject(iomodel->CopyConstantObject(TransientIslevelsetEnum));
    7071        parameters->AddObject(iomodel->CopyConstantObject(MaterialsRheologyLawEnum));
    7172        parameters->AddObject(iomodel->CopyConstantObject(AutodiffIsautodiffEnum));
  • issm/trunk-jpl/src/m/classes/mask.m

    r16764 r17114  
    2525                        md = checkfield(md,'fieldname','mask.groundedice_levelset','size',[md.mesh.numberofvertices 1]);
    2626                        md = checkfield(md,'fieldname','mask.ice_levelset'        ,'size',[md.mesh.numberofvertices 1]);
    27                         isice=(md.mask.ice_levelset>0);
    28                         if any(sum(isice(md.mesh.elements),2)==0),
    29                                 warning('elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0');
    30                         end
     27                        %isice=(md.mask.ice_levelset>0);
     28                        %if any(sum(isice(md.mesh.elements),2)==0),
     29                %               warning('elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0');
     30                %       end
    3131                end % }}}
    3232                function disp(obj) % {{{
  • issm/trunk-jpl/src/m/classes/mask.py

    r16764 r17114  
    3333
    3434                md = checkfield(md,'fieldname','mask.ice_levelset'        ,'size',[md.mesh.numberofvertices])
    35                 isice=numpy.array(md.mask.ice_levelset>0,int)
    36                 totallyicefree=(numpy.sum(isice[md.mesh.elements-1],axis=1)==0).astype(int)
    37                 if any(totallyicefree):
    38                         raise TypeError("elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0")
     35                #isice=numpy.array(md.mask.ice_levelset<0,int)
     36                #totallyicefree=(numpy.sum(isice[md.mesh.elements-1],axis=1)==0).astype(int)
     37                #if any(totallyicefree):
     38                #       raise TypeError("elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0")
    3939
    4040                return md
  • issm/trunk-jpl/src/m/classes/transient.m

    r17079 r17114  
    3939                end % }}}
    4040                function list = defaultoutputs(self,md) % {{{
    41 
    42                         list = {'SurfaceforcingsMassBalance'};
    43 
     41                        if(self.ismasstransport)
     42                                list = {'SurfaceforcingsMassBalance'};
     43                        else
     44                                list = {};
     45                        end
    4446                end % }}}
    4547                function md = checkconsistency(obj,md,solution,analyses) % {{{
  • issm/trunk-jpl/src/m/classes/transient.py

    r17079 r17114  
    3838        def defaultoutputs(self,md): # {{{
    3939
    40                 return ['SurfaceforcingsMassBalance']
     40                if self.ismasstransport:
     41                        return ['SurfaceforcingsMassBalance']
     42                else:
     43                        return []
    4144
    4245        #}}}
  • issm/trunk-jpl/src/m/parameterization/setmask.m

    r15987 r17114  
    4242
    4343%level sets
    44 md.mask.ice_levelset=ones(md.mesh.numberofvertices,1);
     44md.mask.ice_levelset=-1.*ones(md.mesh.numberofvertices,1);
    4545md.mask.groundedice_levelset=vertexongroundedice;
    4646md.mask.groundedice_levelset(find(vertexongroundedice==0.))=-1.;
  • issm/trunk-jpl/src/m/parameterization/setmask.py

    r15987 r17114  
    4242
    4343        #level sets
    44         md.mask.ice_levelset         = numpy.ones(md.mesh.numberofvertices,bool)
     44        md.mask.ice_levelset         = -1.*numpy.ones((md.mesh.numberofvertices,1))
    4545        md.mask.groundedice_levelset = -1.*numpy.ones((md.mesh.numberofvertices,1))
    4646        md.mask.groundedice_levelset[md.mesh.elements[numpy.nonzero(elementongroundedice),:]-1]=1.
Note: See TracChangeset for help on using the changeset viewer.