Changeset 15624


Ignore:
Timestamp:
07/25/13 15:07:35 (12 years ago)
Author:
Mathieu Morlighem
Message:

NEW: for SSA and HO, use regular IoModelToConstraintx

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp

    r15621 r15624  
    66#include "../../../classes/classes.h"
    77#include "../../../shared/shared.h"
     8#include "../../IoModelToConstraintsx/IoModelToConstraintsx.h"
    89#include "../ModelProcessorx.h"
    910
     
    1213        /*Intermediary*/
    1314        int        i,j;
    14         int        count;
     15        int        count,temp,finiteelement;
    1516        IssmDouble g;
    1617        IssmDouble rho_ice;
    1718        IssmDouble FSreconditioning;
    18         bool       isSSA,isL1L2,isHO,isFS;
    19         int        fe_ssa,fe_ho;
     19        bool       isSSA,isL1L2,isHO,isFS,iscoupling;
    2020        bool       spcpresent = false;
    2121        int        Mx,Nx;
     
    5050        iomodel->Constant(&isHO,FlowequationIsHOEnum);
    5151        iomodel->Constant(&isFS,FlowequationIsFSEnum);
    52         iomodel->Constant(&fe_ssa,FlowequationFeSSAEnum);
    53         iomodel->Constant(&fe_ho,FlowequationFeHOEnum);
    5452
    5553        /*Recover pointer: */
     
    5856        /*Now, is the flag macayaealHO on? otherwise, do nothing: */
    5957        if(!isSSA & !isHO & !isFS & !isL1L2){
     58                *pconstraints=constraints;
     59                return;
     60        }
     61
     62        /*Do we have coupling*/
     63        if( (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
     64         iscoupling = true;
     65        else
     66         iscoupling = false;
     67
     68        /*If no coupling, call Regular IoModelToConstraintsx, else, use P1 elements only*/
     69        if(!iscoupling && !isFS){
     70
     71                /*Get finite element type*/
     72                if(isSSA){
     73                        iomodel->Constant(&temp,FlowequationFeSSAEnum);
     74                        switch(temp){
     75                                case 0 : finiteelement = P1Enum; break;
     76                                case 1 : finiteelement = P2Enum; break;
     77                                default: _error_("finite element "<<temp<<" not supported");
     78                        }
     79                }
     80                else if(isL1L2){
     81                        finiteelement = P1Enum;
     82                }
     83                else if(isHO){
     84                        iomodel->Constant(&temp,FlowequationFeHOEnum);
     85                        switch(temp){
     86                                case 0 : finiteelement = P1Enum; break;
     87                                case 1 : finiteelement = P2Enum; break;
     88                                default: _error_("finite element "<<temp<<" not supported");
     89                        }
     90                }
     91                else if(isFS){
     92                        finiteelement = P1Enum;
     93                }
     94                IoModelToConstraintsx(constraints,iomodel,DiagnosticSpcvxEnum,DiagnosticHorizAnalysisEnum,finiteelement,1);
     95                IoModelToConstraintsx(constraints,iomodel,DiagnosticSpcvyEnum,DiagnosticHorizAnalysisEnum,finiteelement,2);
     96
    6097                *pconstraints=constraints;
    6198                return;
     
    99136
    100137                        /*Start with adding spcs of coupling: zero at the border SSA/HO for the appropriate dofs*/
    101                         if (reCast<int,IssmDouble>(vertices_type[i]==SSAHOApproximationEnum)){
     138                        if(reCast<int,IssmDouble>(vertices_type[i]==SSAHOApproximationEnum)){
    102139                                /*If grionSSA, spc HO dofs: 3 & 4*/
    103140                                        if (reCast<int,IssmDouble>(nodeonHO[i])){
     
    309346                        }
    310347                }
    311         }
    312 
    313         /*SPC Quadratic elements*/
    314         if((isSSA && fe_ssa==1) || (isHO && fe_ho==1)){
    315 
    316                 int   v1,v2;
    317                 bool *my_edges = NULL;
    318 
    319                 if(Mx!=iomodel->numberofvertices) _error_("transient spc not supported yet");
    320                 EdgesPartitioning(&my_edges,iomodel);
    321 
    322                 for(i=0;i<iomodel->numberofedges;i++){
    323 
    324                         if(my_edges[i]){
    325 
    326                                 v1 = iomodel->edges[2*i+0]-1;
    327                                 v2 = iomodel->edges[2*i+1]-1;
    328 
    329                                 if(!xIsNan<IssmDouble>(spcvx[v1]) && !xIsNan<IssmDouble>(spcvx[v2])){
    330                                         constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
    331                                                                         1,(spcvx[v1]+spcvx[v2])/(2.),DiagnosticHorizAnalysisEnum));
    332                                         count++;
    333                                 }
    334                                 if(!xIsNan<IssmDouble>(spcvy[v1]) && !xIsNan<IssmDouble>(spcvy[v2])){
    335                                         constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
    336                                                                         2,(spcvy[v1]+spcvy[v2])/(2.),DiagnosticHorizAnalysisEnum));
    337                                         count++;
    338                                 }
    339                                 if (reCast<int,IssmDouble>(vertices_type[v1])==FSApproximationEnum ||  (reCast<int,IssmDouble>(vertices_type[v1])==NoneApproximationEnum)){
    340                                         if(!xIsNan<IssmDouble>(spcvz[v1]) && !xIsNan<IssmDouble>(spcvz[v2])){
    341                                                 constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+iomodel->numberofvertices+i+1,
    342                                                                                 3,(spcvz[v1]+spcvz[v2])/(2.),DiagnosticHorizAnalysisEnum));
    343                                                 count++;
    344                                         }
    345                                 }
    346                         }
    347                 }
    348 
    349                 /*Clean up*/
    350                 xDelete<bool>(my_edges);
    351348        }
    352349
Note: See TracChangeset for help on using the changeset viewer.