Changeset 27227


Ignore:
Timestamp:
08/25/22 11:19:06 (3 years ago)
Author:
schlegel
Message:

CHG: make GEMB cell merging its own function

Location:
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex
Files:
2 edited

Legend:

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

    r26550 r27227  
    18281828        xDelete<IssmDouble>(F);
    18291829
     1830        //Manage the layering to match the user defined requirements
     1831        managelayers(&mAdd, &dz_add, &addE, &m, &EI, &EW, &T, &d, &dz, &W, &a, &adiff, &re, &gdn, &gsp, &n, dzMin, zMax, zMin, zTop, zY);
     1832
     1833        //// CHECK FOR MASS AND ENERGY CONSERVATION
     1834
     1835        // calculate final mass [kg] and energy [J]
     1836        sumER = Rsum * (LF + CtoK * CI);
     1837        for(int i=0;i<n;i++)EI[i] = m[i] * T[i] * CI;
     1838        for(int i=0;i<n;i++)EW[i] = W[i] * (LF + CtoK * CI);
     1839
     1840        mSum1 = cellsum(W,n) + cellsum(m,n) + Rsum;
     1841        sumE1 = cellsum(EI,n) + cellsum(EW,n);
     1842
     1843        /*checks: */
     1844        for(int i=0;i<n;i++) if (W[i]<0.0-Wtol) _error_("negative pore water generated in melt equations\n");
     1845
     1846        /*only in forward mode! avoid round in AD mode as it is not differentiable: */
     1847        #ifndef _HAVE_AD_
     1848        dm = round((mSum0 - mSum1 + mAdd)*100.0)/100.0;
     1849        dE = round(sumE0 - sumE1 - sumER +  addE - surplusE);
     1850        if (dm !=0  || dE !=0) _error_("mass or energy are not conserved in melt equations\n"
     1851                        << "dm: " << dm << " dE: " << dE << "\n");
     1852        #endif
     1853
     1854       
     1855        /*Free resources:*/
     1856        if(m)xDelete<IssmDouble>(m);
     1857        if(EI)xDelete<IssmDouble>(EI);
     1858        if(EW)xDelete<IssmDouble>(EW);
     1859        if(maxF)xDelete<IssmDouble>(maxF);
     1860        if(dW)xDelete<IssmDouble>(dW);
     1861        if(exsW)xDelete<IssmDouble>(exsW);
     1862        if(exsT)xDelete<IssmDouble>(exsT);
     1863        if(surpT)xDelete<IssmDouble>(surpT);
     1864        if(surpE)xDelete<IssmDouble>(surpE);
     1865        if(flxDn)xDelete<IssmDouble>(flxDn);
     1866        if(D)xDelete<int>(D);
     1867        if(M)xDelete<IssmDouble>(M);
     1868
     1869        /*Assign output pointers:*/
     1870        *pMs=Msurf;
     1871        *pM=sumM;
     1872        *pR=Rsum;
     1873        *pF=Fsum;
     1874        *pmAdd=mAdd;
     1875        *pdz_add=dz_add;
     1876
     1877        *pT=T;
     1878        *pd=d;
     1879        *pdz=dz;
     1880        *pW=W;
     1881        *pa=a;
     1882        *padiff=adiff;
     1883        *pre=re;
     1884        *pgdn=gdn;
     1885        *pgsp=gsp;
     1886        *pn=n;
     1887
     1888} /*}}}*/
     1889void managelayers(IssmDouble* pmAdd, IssmDouble* pdz_add, IssmDouble* paddE, IssmDouble** pm, IssmDouble** pEI, IssmDouble** pEW, IssmDouble** pT, IssmDouble** pd, IssmDouble** pdz, IssmDouble** pW, IssmDouble** pa, IssmDouble** padiff, IssmDouble** pre, IssmDouble** pgdn, IssmDouble** pgsp, int* pn, IssmDouble dzMin, IssmDouble zMax, IssmDouble zMin, IssmDouble zTop, IssmDouble zY){ /*{{{*/
     1890
     1891        /*intermediary:*/
     1892        IssmDouble* Zcum=NULL;
     1893        IssmDouble* dzMin2=NULL;
     1894        IssmDouble* dzMax2=NULL;
     1895        int*        D=NULL;
     1896
     1897        IssmDouble zY2=zY;
     1898        IssmDouble X=0.0;
     1899        int X1=0;
     1900        int X2=0;
     1901        int D_size = 0;
     1902
     1903        IssmDouble Ztot=0.0;
     1904        IssmDouble T_bot=0.0;
     1905        IssmDouble m_bot=0.0;
     1906        IssmDouble dz_bot=0.0;
     1907        IssmDouble d_bot=0.0;
     1908        IssmDouble W_bot=0.0;
     1909        IssmDouble a_bot=0.0;
     1910        IssmDouble adiff_bot=0.0;
     1911        IssmDouble re_bot=0.0;
     1912        IssmDouble gdn_bot=0.0;
     1913        IssmDouble gsp_bot=0.0;
     1914        IssmDouble EI_bot=0.0;
     1915        IssmDouble EW_bot=0.0;
     1916        bool       top=false;
     1917
     1918        /*outputs:*/
     1919        IssmDouble  mAdd = 0.0;
     1920        IssmDouble  addE = 0.0;
     1921        IssmDouble  dz_add = 0.0;
     1922        IssmDouble* T=*pT;
     1923        IssmDouble* d=*pd;
     1924        IssmDouble* dz=*pdz;
     1925        IssmDouble* W=*pW;
     1926        IssmDouble* a=*pa;
     1927        IssmDouble* adiff=*padiff;
     1928        IssmDouble* re=*pre;
     1929        IssmDouble* gdn=*pgdn;
     1930        IssmDouble* gsp=*pgsp;
     1931        IssmDouble* m=*pm;
     1932        IssmDouble* EI=*pEI;
     1933        IssmDouble* EW=*pEW;
     1934        int         n=*pn;
     1935
    18301936        //Merging of cells as they are burried under snow.
    18311937        Zcum=xNew<IssmDouble>(n);
     
    20192125        }
    20202126
    2021         //// CHECK FOR MASS AND ENERGY CONSERVATION
    2022 
    2023         // calculate final mass [kg] and energy [J]
    2024         sumER = Rsum * (LF + CtoK * CI);
    2025         for(int i=0;i<n;i++)EI[i] = m[i] * T[i] * CI;
    2026         for(int i=0;i<n;i++)EW[i] = W[i] * (LF + CtoK * CI);
    2027 
    2028         mSum1 = cellsum(W,n) + cellsum(m,n) + Rsum;
    2029         sumE1 = cellsum(EI,n) + cellsum(EW,n);
    2030 
    2031         /*checks: */
    2032         for(int i=0;i<n;i++) if (W[i]<0.0-Wtol) _error_("negative pore water generated in melt equations\n");
    2033 
    2034         /*only in forward mode! avoid round in AD mode as it is not differentiable: */
    2035         #ifndef _HAVE_AD_
    2036         dm = round((mSum0 - mSum1 + mAdd)*100.0)/100.0;
    2037         dE = round(sumE0 - sumE1 - sumER +  addE - surplusE);
    2038         if (dm !=0  || dE !=0) _error_("mass or energy are not conserved in melt equations\n"
    2039                         << "dm: " << dm << " dE: " << dE << "\n");
    2040         #endif
    2041 
    20422127        /*Free resources:*/
    2043         if(m)xDelete<IssmDouble>(m);
    2044         if(EI)xDelete<IssmDouble>(EI);
    2045         if(EW)xDelete<IssmDouble>(EW);
    2046         if(maxF)xDelete<IssmDouble>(maxF);
    2047         if(dW)xDelete<IssmDouble>(dW);
    2048         if(exsW)xDelete<IssmDouble>(exsW);
    2049         if(exsT)xDelete<IssmDouble>(exsT);
    2050         if(surpT)xDelete<IssmDouble>(surpT);
    2051         if(surpE)xDelete<IssmDouble>(surpE);
    2052         if(flxDn)xDelete<IssmDouble>(flxDn);
    2053         if(D)xDelete<int>(D);
    2054         if(M)xDelete<IssmDouble>(M);
    20552128        xDelete<IssmDouble>(Zcum);
    20562129        xDelete<IssmDouble>(dzMin2);
     
    20582131
    20592132        /*Assign output pointers:*/
    2060         *pMs=Msurf;
    2061         *pM=sumM;
    2062         *pR=Rsum;
    2063         *pF=Fsum;
    2064         *pmAdd=mAdd;
    2065         *pdz_add=dz_add;
    2066 
    20672133        *pT=T;
    20682134        *pd=d;
     
    20752141        *pgsp=gsp;
    20762142        *pn=n;
     2143        *pm=m;
     2144        *pEI=EI;
     2145        *pEW=EW;
     2146
     2147        *pmAdd=mAdd;
     2148        *paddE=addE;
     2149        *pdz_add=dz_add;
    20772150
    20782151} /*}}}*/
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h

    r26550 r27227  
    3737void accumulation(IssmDouble** pT, IssmDouble** pdz, IssmDouble** pd, IssmDouble** pW, IssmDouble** pa, IssmDouble** padiff, IssmDouble** pre, IssmDouble** pgdn, IssmDouble** pgsp, IssmDouble* pRa, int* pm, int aIdx, int dsnowIdx, IssmDouble Tmean, IssmDouble Ta, IssmDouble P, IssmDouble dzMin, IssmDouble aSnow, IssmDouble C, IssmDouble V, IssmDouble Vmean, IssmDouble dIce, int sid);
    3838void melt(IssmDouble* pM, IssmDouble* pMs, IssmDouble* pR, IssmDouble* pF, IssmDouble* pmAdd, IssmDouble* pdz_add, IssmDouble** pT, IssmDouble** pd, IssmDouble** pdz, IssmDouble** pW, IssmDouble** pa, IssmDouble** padiff, IssmDouble** pre, IssmDouble** pgdn, IssmDouble** pgsp, int* pn, IssmDouble Ra, IssmDouble dzMin, IssmDouble zMax, IssmDouble zMin, IssmDouble zTop, IssmDouble zY, IssmDouble dIce, int sid);
     39void managelayers(IssmDouble* pmAdd, IssmDouble* pdz_add, IssmDouble* paddE, IssmDouble** pm, IssmDouble** pEI, IssmDouble** pEW, IssmDouble** pT, IssmDouble** pd, IssmDouble** pdz, IssmDouble** pW, IssmDouble** pa, IssmDouble** padiff, IssmDouble** pre, IssmDouble** pgdn, IssmDouble** pgsp, int* pn, IssmDouble dzMin, IssmDouble zMax, IssmDouble zMin, IssmDouble zTop, IssmDouble zY);
    3940void densification(IssmDouble** pd,IssmDouble** pdz, IssmDouble* T, IssmDouble* re, int denIdx, int aIdx, int swIdx, IssmDouble adThresh, IssmDouble C, IssmDouble dt, IssmDouble Tmean, IssmDouble dIce, int m, int sid);
    4041void turbulentFlux(IssmDouble* pshf, IssmDouble* plhf, IssmDouble* pEC, IssmDouble Ta, IssmDouble Ts, IssmDouble V, IssmDouble eAir, IssmDouble pAir, IssmDouble ds, IssmDouble Ws, IssmDouble Vz, IssmDouble Tz, IssmDouble dIce, int sid);
Note: See TracChangeset for help on using the changeset viewer.