Changeset 21542


Ignore:
Timestamp:
02/10/17 10:32:55 (8 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added Higher order finite elements for enthalpy

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

Legend:

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

    r21481 r21542  
    9898void EnthalpyAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
    9999
     100        int finiteelement;
     101        iomodel->FindConstant(&finiteelement,"md.thermal.fe");
     102
    100103        if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,"md.mesh.vertexonbase","md.mesh.vertexonsurface");
    101         ::CreateNodes(nodes,iomodel,EnthalpyAnalysisEnum,P1Enum);
     104        ::CreateNodes(nodes,iomodel,EnthalpyAnalysisEnum,finiteelement);
    102105        iomodel->DeleteData(2,"md.mesh.vertexonbase","md.mesh.vertexonsurface");
    103106}/*}}}*/
     
    121124        iomodel->FetchData(3,"md.initialization.temperature","md.initialization.waterfraction","md.initialization.pressure");
    122125
     126        /*Finite element type*/
     127        int finiteelement;
     128        iomodel->FindConstant(&finiteelement,"md.thermal.fe");
     129
    123130        /*Update elements: */
    124131        int counter=0;
     
    126133                if(iomodel->my_elements[i]){
    127134                        Element* element=(Element*)elements->GetObjectByOffset(counter);
    128                         element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
     135                        element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
    129136                        counter++;
    130137                }
  • issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp

    r21389 r21542  
    99
    1010        /*Intermediary*/
    11         int finiteelement = P1Enum;
     11        int finiteelement;
     12        iomodel->FindConstant(&finiteelement,"md.thermal.fe");
     13        _assert_(finiteelement==P1Enum);
    1214
    1315        /*Only 3d mesh supported*/
     
    6264void ThermalAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
    6365
    64         int finiteelement = P1Enum;
     66        int finiteelement;
     67        iomodel->FindConstant(&finiteelement,"md.thermal.fe");
     68        _assert_(finiteelement==P1Enum);
    6569       
    6670        if(iomodel->domaintype==Domain3DEnum) iomodel->FetchData(2,"md.mesh.vertexonbase","md.mesh.vertexonsurface");
     
    7983
    8084        /*Update elements: */
    81         int finiteelement = P1Enum;
     85        int finiteelement;
     86        iomodel->FindConstant(&finiteelement,"md.thermal.fe");
     87        _assert_(finiteelement==P1Enum);
    8288        int counter=0;
    8389        for(int i=0;i<iomodel->numberofelements;i++){
  • issm/trunk-jpl/src/c/classes/IoModel.cpp

    r20978 r21542  
    656656                                                this->AddConstant(new IoConstant(StringToEnumx(string),record_name));
    657657                                        } else if(strcmp(record_name,"md.flowequation.fe_FS")==0){
     658                                                this->AddConstant(new IoConstant(StringToEnumx(string),record_name));
     659                                        } else if(strcmp(record_name,"md.thermal.fe")==0){
    658660                                                this->AddConstant(new IoConstant(StringToEnumx(string),record_name));
    659661                                        } else if(strcmp(record_name,"md.groundingline.migration")==0){
     
    797799                                                } else if(strcmp(record_name,"md.flowequation.fe_FS")==0){
    798800                                                        this->AddConstant(new IoConstant(StringToEnumx(string),record_name));
     801                                                } else if(strcmp(record_name,"md.thermal.fe")==0){
     802                                                        this->AddConstant(new IoConstant(StringToEnumx(string),record_name));
    799803                                                } else if(strcmp(record_name,"md.groundingline.migration")==0){
    800804                                                        this->AddConstant(new IoConstant(StringToEnumx(string),record_name));
  • issm/trunk-jpl/src/m/classes/thermal.m

    r21049 r21542  
    1515                isenthalpy        = 0;
    1616                isdynamicbasalspc = 0;
     17                fe                = 'P1';
    1718                requested_outputs = {};
    1819        end
     
    6667                        self.isdynamicbasalspc=0;
    6768
     69                        %Linear elements by default
     70                        self.fe='P1';
     71
    6872                        %default output
    6973                        self.requested_outputs={'default'};
     
    7680                        md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 1 2]);
    7781                        md = checkfield(md,'fieldname','thermal.spctemperature','Inf',1,'timeseries',1,'>=',0);
     82                        md = checkfield(md,'fieldname','thermal.fe','values',{'P1','P1xP2'});
    7883                        if (ismember('EnthalpyAnalysis',analyses) & md.thermal.isenthalpy & dimension(md.mesh)==3),
    7984
     
    110115                        fielddisplay(self,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)');
    111116                        fielddisplay(self,'isdynamicbasalspc',['enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)']);
     117                        fielddisplay(self,'fe','Finite Element type: ''P1'' (default), ''P1xP2''');
    112118                        fielddisplay(self,'requested_outputs','additional outputs requested');
    113119
     
    122128                        WriteData(fid,prefix,'object',self,'fieldname','penalty_factor','format','Double');
    123129                        WriteData(fid,prefix,'object',self,'fieldname','isenthalpy','format','Boolean');
     130                        WriteData(fid,prefix,'object',self,'fieldname','fe','format','String');
    124131                        WriteData(fid,prefix,'object',self,'fieldname','isdynamicbasalspc','format','Boolean');
    125132
  • issm/trunk-jpl/src/m/classes/thermal.py

    r21303 r21542  
    2323                self.isenthalpy        = 0
    2424                self.isdynamicbasalspc = 0;
     25                self.fe                = 'P1';
    2526                self.requested_outputs = []
    2627
     
    7980
    8081                #will basal boundary conditions be set dynamically
    81                 self.isdynamicbasalspc=0;
     82                self.isdynamicbasalspc=0
     83
     84                #Finite element interpolation
     85                self.fe='P1'
    8286
    8387                #default output
     
    124128                WriteData(fid,prefix,'object',self,'fieldname','penalty_factor','format','Double')
    125129                WriteData(fid,prefix,'object',self,'fieldname','isenthalpy','format','Boolean')
     130                WriteData(fid,prefix,'object',self,'fieldname','fe','format','String');
    126131                WriteData(fid,prefix,'object',self,'fieldname','isdynamicbasalspc','format','Boolean');
    127132
Note: See TracChangeset for help on using the changeset viewer.