Changeset 27227
- Timestamp:
- 08/25/22 11:19:06 (3 years ago)
- 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 1828 1828 xDelete<IssmDouble>(F); 1829 1829 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 } /*}}}*/ 1889 void 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 1830 1936 //Merging of cells as they are burried under snow. 1831 1937 Zcum=xNew<IssmDouble>(n); … … 2019 2125 } 2020 2126 2021 //// CHECK FOR MASS AND ENERGY CONSERVATION2022 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 #endif2041 2042 2127 /*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);2055 2128 xDelete<IssmDouble>(Zcum); 2056 2129 xDelete<IssmDouble>(dzMin2); … … 2058 2131 2059 2132 /*Assign output pointers:*/ 2060 *pMs=Msurf;2061 *pM=sumM;2062 *pR=Rsum;2063 *pF=Fsum;2064 *pmAdd=mAdd;2065 *pdz_add=dz_add;2066 2067 2133 *pT=T; 2068 2134 *pd=d; … … 2075 2141 *pgsp=gsp; 2076 2142 *pn=n; 2143 *pm=m; 2144 *pEI=EI; 2145 *pEW=EW; 2146 2147 *pmAdd=mAdd; 2148 *paddE=addE; 2149 *pdz_add=dz_add; 2077 2150 2078 2151 } /*}}}*/ -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h
r26550 r27227 37 37 void 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); 38 38 void 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); 39 void 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); 39 40 void 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); 40 41 void 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.