Changeset 19613
- Timestamp:
- 10/01/15 10:45:44 (10 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r19594 r19613 2375 2375 /*Calculate total system mass:*/ 2376 2376 sumMass=0; for(int i=0;i<m;i++) sumMass += dz[i]*d[i]; 2377 2378 #ifndef _HAVE_ADOLC_ //we want to avoid the round operation at all cost. Not differentiable. 2377 2379 dMass = sumMass + sumR + sumW - sumP - sumEC - initMass - sumMassAdd; 2378 2380 dMass = round(dMass * 100.0)/100.0; 2379 2381 2380 2382 /*Check mass conservation:*/ 2381 2383 if (dMass != 0.0) _printf_("total system mass not conserved in MB function"); 2384 #endif 2382 2385 2383 2386 /*Check bottom grid cell T is unchanged:*/ 2384 2387 if (T[m-1]!=T_bottom) _printf_("T(end)~=T_bottom" << "\n"); 2385 2388 2389 /*Free ressources: */ 2390 xDelete<IssmDouble>(swf); 2391 2392 /*increase counter:*/ 2386 2393 count++; 2387 2394 … … 2399 2406 this->AddInput(new DoubleArrayInput(SmbWEnum,W,m)); 2400 2407 this->AddInput(new DoubleArrayInput(SmbAEnum,a,m)); 2401 this->AddInput(new DoubleArrayInput(SmbSwfEnum,swf,m));2402 2408 this->AddInput(new DoubleInput(SmbMassBalanceEnum,(sumP + sumEC -sumR)/rho_water/dt)); 2403 2409 this->AddInput(new DoubleInput(SmbRunoffEnum,sumR/rho_water/dt)); … … 2416 2422 xDelete<IssmDouble>(a); 2417 2423 xDelete<IssmDouble>(T); 2418 xDelete<IssmDouble>(swf);2419 2424 delete gauss; 2420 2425 /*}}}*/ -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp
r19582 r19613 43 43 //into specified top structure depth (zTop). Also make sure top grid cell 44 44 //structure length (dzTop) is greater than 5 cm 45 if (dgpTop != round(dgpTop)){ 45 #ifndef _HAVE_ADOLC_ //avoid the round operation check! 46 if (dgpTop != round(dgpTop)){ 46 47 _error_("top grid cell structure length does not go evenly into specified top structure depth, adjust dzTop or zTop"); 47 48 } 48 else if(dzTop < 0.05){ 49 #endif 50 if(dzTop < 0.05){ 49 51 _printf_("initial top grid cell length (dzTop) is < 0.05 m"); 50 52 } 51 gpTop=r ound(dgpTop);53 gpTop=reCast<int,IssmDouble>(dgpTop); 52 54 53 55 //initialize top grid depth vector … … 212 214 213 215 // take absolute value of temperature gradient 214 for(int i=0;i<m;i++)dT[i]= abs(dT[i]);216 for(int i=0;i<m;i++)dT[i]=fabs(dT[i]); 215 217 216 218 /*Snow metamorphism. Depends on value of snow dendricity and wetness of the snowpack: */ … … 418 420 for(int i=0;i<m;i++)if(W[i]>0)t0[i]=t0wet; // wet snow timescale 419 421 for(int i=0;i<m;i++)T[i]=TK[i] - 273.15; // change T from K to degC 420 for(int i=0;i<m;i++) t0warm[i]= abs(T[i]) * K + t0dry; //// 'warm' snow timescale422 for(int i=0;i<m;i++) t0warm[i]= fabs(T[i]) * K + t0dry; //// 'warm' snow timescale 421 423 for(int i=0;i<m;i++)if(W[i]==0.0 && T[i]>=-10)t0[i]= t0warm[i]; 422 424 for(int i=0;i<m;i++)if(T[i]<-10) t0[i] = 10 * K + t0dry; // 'cold' snow timescale … … 450 452 if (a[0] > 1) _printf_("albedo > 1.0\n"); 451 453 else if (a[0] < 0) _printf_("albedo is negative\n"); 452 else if ( isnan(a[0])) _error_("albedo == NAN\n");454 else if (xIsNan(a[0])) _error_("albedo == NAN\n"); 453 455 } /*}}}*/ 454 456 void thermo(IssmDouble* pEC, IssmDouble* T, IssmDouble* dz, IssmDouble* d, IssmDouble* swf, IssmDouble dlwrf, IssmDouble Ta, IssmDouble V, IssmDouble eAir, IssmDouble pAir, IssmDouble Ws, IssmDouble dt0, int m, IssmDouble Vz, IssmDouble Tz,int sid) { /*{{{*/ … … 692 694 693 695 /* CALCULATE ENERGY SOURCES AND DIFFUSION FOR EVERY TIME STEP [dt]*/ 694 for ( inti=1;i<=dt0;i+=dt){696 for (IssmDouble i=1;i<=dt0;i+=dt){ 695 697 696 698 // PART OF ENERGY CONSERVATION CHECK … … 964 966 xDelete<IssmDouble>(Qs1); 965 967 xDelete<IssmDouble>(Qs2); 968 969 966 970 } 967 971 else{ //function of grid cell density … … 1158 1162 1159 1163 mass_diff = mass - massinit - P; 1164 1165 #ifndef _HAVE_ADOLC_ //avoid round operation. only check in forward mode. 1160 1166 mass_diff = round(mass_diff * 100)/100; 1161 1162 1167 if (mass_diff > 0) _error_("mass not conserved in accumulation function"); 1168 #endif 1163 1169 1164 1170 } … … 1345 1351 X = 0; 1346 1352 for(int i=n-1;i>=0;i--){ 1347 if(M[i]>0 || exsW[i]){1353 if(M[i]>0 || reCast<int,IssmDouble>(exsW[i])){ 1348 1354 X=i; 1349 1355 break; … … 1451 1457 celldelete(&R,n,D,D_size); 1452 1458 n=D_size; 1459 xDelete<int>(D); 1453 1460 1454 1461 // calculate new grid lengths … … 1457 1464 //calculate Rsum: 1458 1465 Rsum=cellsum(R,n); 1459 1466 1467 /*Free ressources:*/ 1468 xDelete<IssmDouble>(F); 1469 xDelete<IssmDouble>(R); 1460 1470 } 1461 1471 … … 1492 1502 1493 1503 // delete combined cells 1494 xDelete<int>(D);D_size=0; for(int i=0;i<n;i++)if(m[i]!=99999)D_size++; D=xNew<int>(D_size);1504 D_size=0; for(int i=0;i<n;i++)if(m[i]!=99999)D_size++; D=xNew<int>(D_size); 1495 1505 D_size=0; for(int i=0;i<n;i++)if(m[i]!=99999){ D[D_size] = i; D_size++;} 1496 1506 … … 1507 1517 celldelete(&EW,n,D,D_size); 1508 1518 n=D_size; 1519 xDelete<int>(D); 1509 1520 1510 1521 // check if any of the top 10 cell depths are too large … … 1586 1597 sumE1 = cellsum(EI,n) + cellsum(EW,n); 1587 1598 1599 /*checks: */ 1600 for(int i=0;i<n;i++) if (W[i]<0) _error_("negative pore water generated in melt equations\n"); 1601 1602 /*only in forward mode! avoid round in AD mode as it is not differentiable: */ 1603 #ifndef _HAVE_ADOLC_ 1588 1604 dm = round(mSum0 - mSum1 + mAdd); 1589 1605 dE = round(sumE0 - sumE1 - sumER + addE); 1590 1591 for(int i=0;i<n;i++) if (W[i]<0) _error_("negative pore water generated in melt equations\n");1592 1593 1606 if (dm !=0 || dE !=0) _error_("mass or energy are not conserved in melt equations\n" 1594 1607 << "dm: " << dm << " dE: " << dE << "\n"); 1595 1608 #endif 1596 1609 1597 1610 /*Free ressources:*/
Note:
See TracChangeset
for help on using the changeset viewer.