Ignore:
Timestamp:
08/28/18 09:45:51 (7 years ago)
Author:
Mathieu Morlighem
Message:

merged trunk-jpl and trunk for revision 23187

Location:
issm/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk

  • issm/trunk/src

  • issm/trunk/src/c/analyses/LevelsetAnalysis.cpp

    r22758 r23189  
    1212
    1313void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/
    14         IoModelToConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,P1Enum);
     14        int finiteelement;
     15        iomodel->FindConstant(&finiteelement,"md.levelset.fe");
     16        IoModelToConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement);
    1517}
    1618/*}}}*/
     
    1921}/*}}}*/
    2022void LevelsetAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
    21         int finiteelement=P1Enum;
     23        int finiteelement;
     24        iomodel->FindConstant(&finiteelement,"md.levelset.fe");
    2225        if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,"md.mesh.vertexonbase","md.mesh.vertexonsurface");
    2326        ::CreateNodes(nodes,iomodel,LevelsetAnalysisEnum,finiteelement);
     
    3235
    3336        /*Finite element type*/
    34         int finiteelement = P1Enum;
     37        int finiteelement;
     38        iomodel->FindConstant(&finiteelement,"md.levelset.fe");
    3539
    3640        /*Update elements: */
     
    4347                }
    4448        }
    45        
     49
    4650        iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum);
    4751        iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
     
    177181
    178182        /*Calving threshold*/
    179        
     183
    180184        /*Fetch number of nodes and dof for this finite element*/
    181185        int numnodes    = basalelement->GetNumberOfNodes();
     
    326330                                 }
    327331                                break;
    328                                
     332
    329333                        case CalvingLevermannEnum:
    330334                                calvingratex_input->GetInputValue(&c[0],gauss);
     
    357361                                 }
    358362                                break;
    359                        
     363
    360364                        case CalvingHabEnum:
    361365                                lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
     
    378382                                 }
    379383                                break;
    380                        
     384
    381385                        case CalvingCrevasseDepthEnum:
    382386                                lsf_slopex_input->GetInputValue(&dlsf[0],gauss);
     
    385389
    386390                                if(groundedice<0) meltingrate = 0.;
    387                                
     391
    388392                                norm_dlsf=0.;
    389393                                for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
     
    516520}/*}}}*/
    517521ElementVector* LevelsetAnalysis::CreatePVector(Element* element){/*{{{*/
    518        
     522
    519523        if(!element->IsOnBase()) return NULL;
    520524        Element* basalelement = element->SpawnBasalElement();
     
    525529        IssmDouble  lsf;
    526530        IssmDouble* xyz_list = NULL;
    527        
     531
    528532        /*Fetch number of nodes and dof for this finite element*/
    529533        int numnodes = basalelement->GetNumberOfNodes();
     
    532536        ElementVector* pe = basalelement->NewElementVector();
    533537        basalelement->FindParam(&dt,TimesteppingTimeStepEnum);
    534        
     538
    535539        if(dt!=0.){
    536540                /*Initialize basis vector*/
     
    623627        // d=|a x b|/|b|
    624628        // with a=q-s0, b=s1-s0
    625        
     629
    626630        /* Intermediaries */
    627631        const int dim=2;
     
    634638                b[i]=s1[i]-s0[i];
    635639        }
    636        
     640
    637641        norm_b=0.;
    638642        for(i=0;i<dim;i++)
     
    662666                default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
    663667        }
    664 }/*}}}*/
    665 void           LevelsetAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/
    666 
    667         if(!element->IsZeroLevelset(MaskIceLevelsetEnum))
    668                 return;
    669 
    670         /* Intermediaries */
    671         const int dim=3;
    672         int i,d;
    673         int numvertices=element->GetNumberOfVertices();
    674         IssmDouble s0[dim], s1[dim], v[dim];
    675         IssmDouble dist,lsf_old;
    676 
    677         IssmDouble* lsf = xNew<IssmDouble>(numvertices);
    678         IssmDouble* sign_lsf = xNew<IssmDouble>(numvertices);
    679         IssmDouble* signed_dist = xNew<IssmDouble>(numvertices);
    680         IssmDouble* xyz_list = NULL;
    681         IssmDouble* xyz_list_zero = NULL;
    682 
    683         /* retrieve inputs and parameters */
    684         element->GetVerticesCoordinates(&xyz_list);
    685         element->GetInputListOnVertices(lsf,MaskIceLevelsetEnum);
    686 
    687         /* get sign of levelset function */
    688         for(i=0;i<numvertices;i++)
    689                 sign_lsf[i]=(lsf[i]>=0.?1.:-1.);
    690 
    691         element->ZeroLevelsetCoordinates(&xyz_list_zero, xyz_list, MaskIceLevelsetEnum);
    692         for(d=0;d<dim;d++){
    693                 s0[d]=xyz_list_zero[0+d];
    694                 s1[d]=xyz_list_zero[3+d];
    695         }
    696 
    697         /* get signed_distance of vertices to zero levelset straight */
    698         for(i=0;i<numvertices;i++){
    699                 for(d=0;d<dim;d++)
    700                         v[d]=xyz_list[3*i+d];
    701                 dist=GetDistanceToStraight(&v[0],&s0[0],&s1[0]);
    702                 signed_dist[i]=sign_lsf[i]*dist;
    703         }
    704        
    705         /* insert signed_distance into vec_signed_dist, if computed distance is smaller */
    706         for(i=0;i<numvertices;i++){
    707                 vec_signed_dist->GetValue(&lsf_old, element->vertices[i]->Sid());
    708                 if(xIsNan<IssmDouble>(lsf_old) || fabs(signed_dist[i])<fabs(lsf_old))
    709                         vec_signed_dist->SetValue(element->vertices[i]->Sid(),signed_dist[i],INS_VAL);
    710         }
    711 
    712         xDelete<IssmDouble>(lsf);
    713         xDelete<IssmDouble>(sign_lsf);
    714         xDelete<IssmDouble>(signed_dist);
    715         xDelete<IssmDouble>(xyz_list);
    716         xDelete<IssmDouble>(xyz_list_zero);
    717668}/*}}}*/
    718669void           LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
     
    724675        IssmDouble  bed,water_depth;
    725676        IssmDouble  levelset;
    726        
     677
    727678        femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum);
    728679
     
    756707                }
    757708        }
    758        
     709
    759710        if(calvinglaw==CalvingHabEnum){
    760711
     
    762713                femmodel->elements->InputDuplicate(MaskIceLevelsetEnum, DistanceToCalvingfrontEnum);
    763714                femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum);
    764                
     715
    765716                /*Loop over all elements of this partition*/
    766717                for(int i=0;i<femmodel->elements->Size();i++){
    767718                        Element* element  = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
    768                        
     719
    769720                        rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
    770721                        rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
     
    797748                }
    798749        }
    799        
     750
    800751        if(calvinglaw==CalvingCrevasseDepthEnum){
    801        
     752
    802753                int                 nflipped,local_nflipped;
    803754                Vector<IssmDouble>* vec_constraint_nodes = NULL;
    804755                IssmDouble* constraint_nodes = NULL;
    805                
     756
    806757                /*Get the DistanceToCalvingfront*/
    807758                femmodel->elements->InputDuplicate(MaskIceLevelsetEnum,DistanceToCalvingfrontEnum);
     
    895846                                gauss->GaussNode(element->GetElementType(),in);
    896847                                Node* node=element->GetNode(in);
    897                                
     848
    898849                                if(constraint_nodes[node->Sid()]>0.){
    899850                                        node->ApplyConstraint(0,+1.);
Note: See TracChangeset for help on using the changeset viewer.