Ignore:
Timestamp:
10/24/13 10:12:44 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: moving model processor stuff to analyses

File:
1 edited

Legend:

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

    r16534 r16539  
    66
    77/*Model processing*/
    8 int MasstransportAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){/*{{{*/
     8int  MasstransportAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){/*{{{*/
    99        return 1;
    1010}/*}}}*/
     11void MasstransportAnalysis::UpdateParameters(Parameters** pparameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
     12
     13        /*Get parameters: */
     14        Parameters *parameters=*pparameters;
     15
     16        parameters->AddObject(iomodel->CopyConstantObject(FlowequationIsFSEnum));
     17
     18        /*Assign output pointer: */
     19        *pparameters = parameters;
     20}/*}}}*/
     21void MasstransportAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
     22
     23        int    stabilization,finiteelement;
     24        bool   dakota_analysis;
     25        bool   issmbgradients;
     26        bool   ispdd;
     27        bool   isdelta18o;
     28        bool   isgroundingline;
     29
     30        /*Fetch data needed: */
     31        iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
     32        iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
     33        iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum);
     34        iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
     35        iomodel->Constant(&issmbgradients,SurfaceforcingsIssmbgradientsEnum);
     36        iomodel->Constant(&isgroundingline,TransientIsgroundinglineEnum);
     37
     38        /*Finite element type*/
     39        finiteelement = P1Enum;
     40        if(stabilization==3){
     41                finiteelement = P1DGEnum;
     42        }
     43
     44        /*Update elements: */
     45        int counter=0;
     46        for(int i=0;i<iomodel->numberofelements;i++){
     47                if(iomodel->my_elements[i]){
     48                        Element* element=(Element*)elements->GetObjectByOffset(counter);
     49                        element->Update(i,iomodel,analysis_counter,analysis_type,finiteelement);
     50                        counter++;
     51                }
     52        }
     53
     54        iomodel->FetchDataToInput(elements,ThicknessEnum);
     55        iomodel->FetchDataToInput(elements,SurfaceEnum);
     56        iomodel->FetchDataToInput(elements,BedEnum);
     57        iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
     58        iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
     59        iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum);
     60        iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateCorrectionEnum,0.);
     61        iomodel->FetchDataToInput(elements,VxEnum);
     62        iomodel->FetchDataToInput(elements,VyEnum);
     63
     64        if(stabilization==3){
     65                iomodel->FetchDataToInput(elements,MasstransportSpcthicknessEnum); //for DG, we need the spc in the element
     66        }
     67
     68        if(dakota_analysis){
     69                elements->InputDuplicate(BedEnum,QmuBedEnum);
     70                elements->InputDuplicate(ThicknessEnum,QmuThicknessEnum);
     71                elements->InputDuplicate(SurfaceEnum,QmuSurfaceEnum);
     72                elements->InputDuplicate(MaskIceLevelsetEnum,QmuMaskIceLevelsetEnum);
     73                if(isgroundingline) elements->InputDuplicate(MaskGroundediceLevelsetEnum,QmuMaskGroundediceLevelsetEnum);
     74        }
     75
     76        if(iomodel->meshtype==Mesh3DEnum){
     77                iomodel->FetchDataToInput(elements,MeshElementonbedEnum);
     78                iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum);
     79        }
     80
     81        if(issmbgradients){
     82                iomodel->FetchDataToInput(elements,SurfaceforcingsHrefEnum);
     83                iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum);
     84                iomodel->FetchDataToInput(elements,SurfaceforcingsBPosEnum);
     85                iomodel->FetchDataToInput(elements,SurfaceforcingsBNegEnum);
     86        }
     87        if(ispdd){
     88                iomodel->FetchDataToInput(elements,ThermalSpctemperatureEnum);
     89                if(isdelta18o){
     90                        iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum);
     91                        iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum);
     92                        iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum);
     93                }
     94                else{
     95                        iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum);
     96                        iomodel->FetchDataToInput(elements,SurfaceforcingsMonthlytemperaturesEnum);
     97                }
     98        }
     99        if(~ispdd && ~issmbgradients){
     100                iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.);
     101        }
     102}/*}}}*/
     103void MasstransportAnalysis::CreateNodes(Nodes** pnodes,IoModel* iomodel){/*{{{*/
     104
     105        /*Fetch parameters: */
     106        int  stabilization;
     107        iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
     108
     109        /*Check in 3d*/
     110        if(stabilization==3 && iomodel->meshtype==Mesh3DEnum) _error_("DG 3d not implemented yet");
     111
     112        /*Create Nodes either DG or CG depending on stabilization*/
     113        if(iomodel->meshtype!=Mesh2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum);
     114        if(stabilization!=3){
     115                ::CreateNodes(pnodes,iomodel,MasstransportAnalysisEnum,P1Enum);
     116        }
     117        else{
     118                ::CreateNodes(pnodes,iomodel,MasstransportAnalysisEnum,P1DGEnum);
     119        }
     120        iomodel->DeleteData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum);
     121}/*}}}*/
     122void MasstransportAnalysis::CreateConstraints(Constraints** pconstraints,IoModel* iomodel){/*{{{*/
     123
     124        /*Fetch parameters: */
     125        int stabilization;
     126        iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
     127
     128        /*Recover pointer: */
     129        Constraints* constraints=*pconstraints;
     130
     131        /*Do not add constraints in DG, they are weakly imposed*/
     132        if(stabilization!=3){
     133                IoModelToConstraintsx(constraints,iomodel,MasstransportSpcthicknessEnum,MasstransportAnalysisEnum,P1Enum);
     134        }
     135
     136        /*Assign output pointer: */
     137        *pconstraints=constraints;
     138}/*}}}*/
     139void MasstransportAnalysis::CreateLoads(Loads** ploads, IoModel* iomodel){/*{{{*/
     140
     141        /*Intermediaries*/
     142        int element;
     143        int penpair_ids[2];
     144        int count=0;
     145        int stabilization;
     146        int numvertex_pairing;
     147
     148        /*Fetch parameters: */
     149        iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
     150
     151        /*Recover pointer: */
     152        Loads* loads=*ploads;
     153
     154        /*Loads only in DG*/
     155        if (stabilization==3){
     156
     157                /*Get faces and elements*/
     158                CreateFaces(iomodel);
     159                iomodel->FetchData(1,ThicknessEnum);
     160
     161                /*First load data:*/
     162                for(int i=0;i<iomodel->numberoffaces;i++){
     163
     164                        /*Get left and right elements*/
     165                        element=iomodel->faces[4*i+2]-1; //faces are [node1 node2 elem1 elem2]
     166
     167                        /*Now, if this element is not in the partition, pass: */
     168                        if(!iomodel->my_elements[element]) continue;
     169
     170                        /* Add load */
     171                        loads->AddObject(new Numericalflux(iomodel->loadcounter+i+1,i,i,iomodel,MasstransportAnalysisEnum));
     172                }
     173
     174                /*Free data: */
     175                iomodel->DeleteData(1,ThicknessEnum);
     176        }
     177
     178        /*Create Penpair for vertex_pairing: */
     179        IssmDouble *vertex_pairing=NULL;
     180        IssmDouble *nodeonbed=NULL;
     181        iomodel->FetchData(&vertex_pairing,&numvertex_pairing,NULL,MasstransportVertexPairingEnum);
     182        iomodel->FetchData(&nodeonbed,NULL,NULL,MeshVertexonbedEnum);
     183
     184        for(int i=0;i<numvertex_pairing;i++){
     185
     186                if(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+0])-1]){
     187
     188                        /*In debugging mode, check that the second node is in the same cpu*/
     189                        _assert_(iomodel->my_vertices[reCast<int>(vertex_pairing[2*i+1])-1]);
     190
     191                        /*Skip if one of the two is not on the bed*/
     192                        if(!(reCast<bool>(nodeonbed[reCast<int>(vertex_pairing[2*i+0])-1])) || !(reCast<bool>(nodeonbed[reCast<int>(vertex_pairing[2*i+1])-1]))) continue;
     193
     194                        /*Get node ids*/
     195                        penpair_ids[0]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+0]);
     196                        penpair_ids[1]=iomodel->nodecounter+reCast<int>(vertex_pairing[2*i+1]);
     197
     198                        /*Create Load*/
     199                        loads->AddObject(new Penpair(
     200                                                        iomodel->loadcounter+count+1,
     201                                                        &penpair_ids[0],
     202                                                        MasstransportAnalysisEnum));
     203                        count++;
     204                }
     205        }
     206
     207        /*free ressources: */
     208        iomodel->DeleteData(vertex_pairing,MasstransportVertexPairingEnum);
     209        iomodel->DeleteData(nodeonbed,MeshVertexonbedEnum);
     210
     211        /*Assign output pointer: */
     212        *ploads=loads;
     213}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.