Changeset 22614


Ignore:
Timestamp:
03/22/18 19:44:48 (7 years ago)
Author:
schlegel
Message:

CHG: add runoff before delete of no mass layer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp

    r22539 r22614  
    12471247        IssmDouble* surpT=NULL;
    12481248        IssmDouble* surpE=NULL;
    1249         IssmDouble* F=NULL;
    12501249        IssmDouble* flxDn=NULL;
    12511250        IssmDouble  ER=0.0;
     
    13111310        /*Allocations: */
    13121311        M=xNewZeroInit<IssmDouble>(n);
    1313         maxF=xNew<IssmDouble>(n);
    1314         dW=xNew<IssmDouble>(n);
     1312        maxF=xNewZeroInit<IssmDouble>(n);
     1313        dW=xNewZeroInit<IssmDouble>(n);
    13151314
    13161315        // store initial mass [kg] and energy [J]
     
    13551354
    13561355                // if pore water froze in ice then adjust d and dz thickness
    1357                 for(int i=0;i<n;i++)if(d[i]>dIce)d[i]=dIce;
     1356                for(int i=0;i<n;i++)if(d[i]>dIce-Dtol)d[i]=dIce;
    13581357                for(int i=0;i<n;i++) dz[i]= m[i]/d[i];
    13591358        }
     
    13751374                // (maximum T of snow before entire grid cell melts is a constant
    13761375                // LF/CI = 159.1342)
    1377                 surpT=xNew<IssmDouble>(n); for(int i=0;i<n;i++)surpT[i] = fmax(0.0, exsT[i]- 159.1342);
     1376                surpT=xNew<IssmDouble>(n); for(int i=0;i<n;i++)surpT[i] = fmax(0.0, exsT[i]- LF/CI);
    13781377       
    1379                 if (cellsum(surpT,n) > 0.0 + Ttol ){
     1378                if (cellsum(surpT,n) > 0.0 + Ttol){
    13801379                        // _printf_("T Surplus");
    13811380                        // calculate surplus energy
     
    13901389                                T[i+1] = fmin(CtoK, T[i+1]);
    13911390               
    1392                                 surpT[i+1] = fmax(0.0, exsT[i+1] - 159.1342);
     1391                                surpT[i+1] = fmax(0.0, exsT[i+1] - LF/CI);
    13931392                                surpE[i+1] = surpT[i+1] * CI * m[i+1];
    13941393               
    13951394                                // adjust current cell properties (again 159.1342 is the max T)
    1396                                 exsT[i] = 159.1342;
     1395                                exsT[i] = LF/CI;
    13971396                                surpE[i] = 0.0;
    13981397                                i = i + 1;
     
    14011400
    14021401                // convert temperature excess to melt [kg]
    1403                 for(int i=0;i<n;i++) M[i] = exsT[i] * d[i] * dz[i] * CI / LF;      // melt
    1404                 sumM = cellsum(M,n);                                               // total melt [kg]
     1402                for(int i=0;i<n;i++) M[i] = fmin(exsT[i] * d[i] * dz[i] * CI / LF, m[i]);  // melt
     1403                sumM = cellsum(M,n);                                                       // total melt [kg]
    14051404
    14061405                // calculate maximum refreeze amount, maxF [kg]
     
    14091408                // initialize refreeze, runoff, flxDn and dW vectors [kg]
    14101409                IssmDouble* F = xNewZeroInit<IssmDouble>(n);
    1411                 IssmDouble* R=xNewZeroInit<IssmDouble>(n);
     1410                IssmDouble* R = xNewZeroInit<IssmDouble>(n);
    14121411
    14131412                for(int i=0;i<n;i++)dW[i] = 0.0;
    1414                 flxDn=xNewZeroInit<IssmDouble>(n+1); for(int i=0;i<n;i++)flxDn[i+1]=F[i];
     1413                flxDn=xNewZeroInit<IssmDouble>(n+1);
    14151414
    14161415                // determine the deepest grid cell where melt/pore water is generated
     
    14421441                                m[i] = m[i] - M[i];                     // mass after melt
    14431442                                Wi = (dIce-d[i]) * Swi * (m[i]/d[i]);    // irreducible water
    1444                                 dW[i] = fmin(inM, Wi - W[i]);            // change in pore water
     1443                                dW[i] = fmax(fmin(inM, Wi - W[i]),-1*W[i]);            // change in pore water
    14451444                                R[i] = fmax(0.0, inM - dW[i]);             // runoff
     1445                                F[i] = 0.0;
    14461446                        }
    14471447                        // check if no energy to refreeze meltwater
     
    14531453                                m[i] = m[i] - M[i];                     // mass after melt
    14541454                                Wi = (dIce-d[i]) * Swi * (m[i]/d[i]);    // irreducible water
    1455                                 dW[i] = fmin(inM, Wi-W[i]);              // change in pore water
    1456                                 flxDn[i+1] = fmax(0.0, inM-dW[i]);         // meltwater out
     1455                                dW[i] = fmax(fmin(inM, Wi - W[i]),-1*W[i]);              // change in pore water
     1456                                flxDn[i+1] = fmax(0.0, inM - dW[i]);         // meltwater out
     1457                                R[i] = 0.0;
    14571458                                F[i] = 0.0;                               // no freeze
    14581459                        }
     
    14621463                                // _printf_("MELT REFREEZE");
    14631464                                //-----------------------melt water-----------------------------
     1465                                m[i] = m[i] - M[i];
    14641466                                IssmDouble dz_0 = m[i]/d[i];         
    14651467                                IssmDouble dMax = (dIce - d[i])*dz_0;              // d max = dIce
     
    14711473                                Wi = (dIce-d[i])* Swi * dz_0;            // irreducible water
    14721474                                dW[i] = fmin(inM - F1, Wi-W[i]);         // change in pore water
    1473                                 if (-1*dW[i]>W[i]-Wtol ){
     1475                                if (dW[i] < 0.0-Wtol && -1*dW[i]>W[i]-Wtol ){
    14741476                                        dW[i]= -1*W[i];
    14751477                                }
     
    14821484                                        m[i] = m[i] + F2;                   // mass after refreeze
    14831485                                        d[i] = m[i]/dz_0;
     1486                                        dW[i] = dW[i] - F2;
    14841487                                }
    14851488
    1486                                 flxDn[i+1] = inM - F1 - dW[i] - F2;     // meltwater out       
     1489                                F[i] = F1 + F2;
     1490
     1491                                flxDn[i+1] = inM - F1 - dW[i];     // meltwater out       
    14871492                                T[i] = T[i] + ((F1+F2)*(LF+(CtoK - T[i])*CI)/(m[i]*CI));// change in temperature
    14881493
     
    15071512                for(int i=0;i<n;i++)W[i] += dW[i];
    15081513
     1514                //calculate Rsum:
     1515                Rsum=cellsum(R,n);
     1516
    15091517                // delete all cells with zero mass
    1510                 D_size=0; for(int i=0;i<n;i++)if(m[i]!=0)D_size++;
     1518                D_size=0; for(int i=0;i<n;i++)if(m[i]>0.0)D_size++;
    15111519                D=xNew<int>(D_size);
    1512                 D_size=0; for(int i=0;i<n;i++)if(m[i]!=0){ D[D_size] = i; D_size++;}
    1513                
     1520                D_size=0; for(int i=0;i<n;i++)if(m[i]>0.0){ D[D_size] = i; D_size++;}
     1521
    15141522                celldelete(&m,n,D,D_size);
    15151523                celldelete(&W,n,D,D_size);
     
    15221530                celldelete(&EI,n,D,D_size);
    15231531                celldelete(&EW,n,D,D_size);
    1524                 celldelete(&R,n,D,D_size);
    15251532                n=D_size;
    15261533                xDelete<int>(D);
     
    15281535                // calculate new grid lengths
    15291536                for(int i=0;i<n;i++)dz[i] = m[i] / d[i];
    1530 
    1531                 //calculate Rsum:
    1532                 Rsum=cellsum(R,n);
    15331537
    15341538                /*Free ressources:*/
     
    15921596           
    15931597                        // set cell to 99999 for deletion
    1594                         m[i] = 99999;
     1598                        m[i] = -99999;
    15951599                }
    15961600        }
     
    16001604         //find closest cell to merge with
    16011605                for(int i=n-2;i>=0;i--){
    1602                         if(m[i]!=99999){
     1606                        if(m[i]!=-99999){
    16031607                                X2=i;
    16041608                                X1=n-1;
     
    16221626       
    16231627                // set cell to 99999 for deletion
    1624                 m[X2] = 99999;
     1628                m[X2] = -99999;
    16251629        }
    16261630
    16271631        // delete combined cells
    1628         D_size=0; for(int i=0;i<n;i++)if(m[i]!=99999)D_size++;
     1632        D_size=0; for(int i=0;i<n;i++)if(m[i]!=-99999)D_size++;
    16291633        D=xNew<int>(D_size);
    1630         D_size=0; for(int i=0;i<n;i++)if(m[i]!=99999){ D[D_size] = i; D_size++;}
     1634        D_size=0; for(int i=0;i<n;i++)if(m[i]!=-99999){ D[D_size] = i; D_size++;}
    16311635
    16321636        celldelete(&m,n,D,D_size);
     
    17231727                dz_add=-(dz[n-1]);
    17241728       
    1725                 // add a grid cell of the same size and temperature to the bottom
     1729                // remove a grid cell from the bottom
    17261730                D_size=n-1;
    17271731                D=xNew<int>(D_size);
     
    17561760        /*checks: */
    17571761        for(int i=0;i<n;i++) if (W[i]<0.0-Wtol) _error_("negative pore water generated in melt equations\n");
    1758        
     1762
    17591763        /*only in forward mode! avoid round in AD mode as it is not differentiable: */
    17601764        #ifndef _HAVE_ADOLC_
Note: See TracChangeset for help on using the changeset viewer.