Ignore:
Timestamp:
06/01/22 05:01:48 (3 years ago)
Author:
Mathieu Morlighem
Message:

merged trunk-jpl and trunk for revision 27033

Location:
issm/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk

  • issm/trunk/src

  • issm/trunk/src/c/modules/KillIcebergsx/KillIcebergsx.cpp

    r25836 r27035  
    99#include "../InputUpdateFromVectorx/InputUpdateFromVectorx.h"
    1010
    11 void KillIcebergsx(FemModel* femmodel){
     11int KillIcebergsx(FemModel* femmodel){
    1212
    1313        /*Intermediaries*/
     
    1818        IssmDouble *local_mask   = xNewZeroInit<IssmDouble>(nbv_local);
    1919        bool       *element_flag = xNewZeroInit<bool>(femmodel->elements->Size());
     20        IssmDouble ice;
    2021
    2122        /*Step 1, go through all elements and put 1 in local_mask if the element is grounded*/
     
    2728                        element_flag[i] = true;
    2829                }
    29                 else{
    30                         if(element->IsGrounded()){
     30                else {
     31                        if(element->IsAllGrounded()){
     32                                /* only look at element with ice but not fully grounded */
    3133                                int numvertices = element->GetNumberOfVertices();
    32                                 for(int v=0;v<numvertices;v++) local_mask[element->vertices[v]->Lid()] = 1.;
     34                                Gauss* gauss=element->NewGauss();
     35                                Input* icelevel_input = element->GetInput(MaskIceLevelsetEnum);                         _assert_(icelevel_input);
     36
     37                                for(int v=0;v<numvertices;v++) {
     38                                        gauss->GaussVertex(v);
     39                                        icelevel_input->GetInputValue(&ice,gauss);
     40                                        /* The initial mask is very strict, we look at all grounded elements and set the mask for ice nodes only. */
     41                                        if (ice < 0) local_mask[element->vertices[v]->Lid()] = 1.;
     42                                }
     43                                delete gauss;
    3344                        }
    3445                }
     
    4859                /*Local iterations on partition*/
    4960                bool keepgoing    = true;
    50                 int  didsomething = 0;
    5161                int  iter         = 1;
    5262                while(keepgoing){
     
    5464
    5565                        keepgoing    = false;
    56                         didsomething = 0;
    5766                        int i=0;
    5867                        for(Object* & object : femmodel->elements->objects){
     
    6271                                        int numvertices = element->GetNumberOfVertices();
    6372                                        bool found1 = false;
     73                                        IssmDouble sumlocalmask = 0.;
     74
    6475                                        for(int j=0;j<numvertices;j++){
    6576                                                lid = element->vertices[j]->Lid();
    66                                                 if(local_mask[lid]>0.){
     77                                                /*we need to have at least a sharing edge, to extend the mask*/
     78                                                sumlocalmask += local_mask[lid];
     79                                                if(sumlocalmask > 1.5){
    6780                                                        found1 = true;
    6881                                                        break;
     
    7386                                                for(int j=0;j<numvertices;j++){
    7487                                                        lid = element->vertices[j]->Lid();
    75                                                         if(local_mask[lid]==0.){
    76                                                                 local_mask[lid]=1.;
    77                                                                 keepgoing = true;
    78                                                                 didsomething = 1;
    79                                                         }
     88                                                        local_mask[lid]=1.;
    8089                                                }
     90                                                keepgoing = true;
    8191                                        }
    8292                                }
     
    99109        xDelete<bool>(element_flag);
    100110
     111        int killbergReinit = 0;
    101112        /*OK, now deactivate iceberg and count the number of deactivated vertices*/
    102113        for(Object* & object : femmodel->elements->objects){
     
    120131                                element->AddInput(MaskIceLevelsetEnum,values,P1Enum);
    121132                                xDelete<IssmDouble>(values);
     133                                killbergReinit += 1;
    122134                        }
    123135                }
    124136        }
    125 
    126137        /*cleanup*/
    127138        xDelete<IssmDouble>(local_mask);
     139
     140        /*Recompute the sign distance for the levelset function*/
     141        return killbergReinit;
    128142}
Note: See TracChangeset for help on using the changeset viewer.