Changeset 25993


Ignore:
Timestamp:
02/15/21 13:49:48 (4 years ago)
Author:
schlegel
Message:

CHG: add options for Alex's newest Albedo scheme for GEMB

Location:
issm/trunk-jpl/src/c
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r25905 r25993  
    35513551        IssmDouble teValue=1.0;
    35523552        IssmDouble aValue=0.0;
     3553        IssmDouble szaValue=0.0;
     3554        IssmDouble cotValue=0.0;
     3555        IssmDouble ccsnowValue=0.0;
     3556        IssmDouble cciceValue=0.0;
    35533557        IssmDouble dt,time,smb_dt;
    35543558        int        aIdx=0;
     
    38333837        teValue_input->GetInputValue(&teValue,gauss);  // Emissivity [0-1]
    38343838        aValue_input->GetInputValue(&aValue,gauss);  // Albedo [0 1]
     3839        //Not implemented as input
     3840        //szaValue;  // Solar Zenith Angle [degree]
     3841        //cotValue;  // Cloud Optical Thickness
     3842        //ccsnowValue;//concentration of light absorbing carbon for snow [ppm1]
     3843        //cciceValue;//concentration of light absorbing carbon for ice [ppm1]
    38353844        //_printf_("Time: " << t << " Ta: " << Ta << " V: " << V << " dlw: " << dlw << " dsw: " << dsw << " P: " << P << " eAir: " << eAir << " pAir: " << pAir << "\n");
    38363845        /*}}}*/
     
    38403849
    38413850        /*Snow, firn and ice albedo:*/
    3842         if(isalbedo)albedo(&a,aIdx,re,dz,d,cldFrac,aIce,aSnow,aValue,adThresh,T,W,P,EC,Msurf,t0wet,t0dry,K,smb_dt,rho_ice,m,this->Sid());
     3851        if(isalbedo)albedo(&a,aIdx,re,dz,d,cldFrac,aIce,aSnow,aValue,adThresh,T,W,P,EC,Msurf,ccsnowValue,cciceValue,szaValue,cotValue,t0wet,t0dry,K,smb_dt,rho_ice,m,this->Sid());
    38433852
    38443853        /*Distribution of absorbed short wave radation with depth:*/
     
    39273936        /*Check mass conservation:*/
    39283937        if (dMass != 0.0){
    3929                 _printf_("total system mass not conserved in MB function \n");
     3938                _printf_("Time: " << setprecision(8) << timeinputs/365.0/24.0/3600.0 << ",total system mass not conserved in MB function \n");
     3939                _printf_("sumMass: " << sumMass << " sumR: " << sumR << " sumW: " << sumW << " sumP: " << sumP << " sumEC: " << sumEC << " initMass: " << initMass << " sumMassAdd: " << sumMassAdd << " \n");
    39303940        }
    39313941        #endif
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/Gembx.cpp

    r25851 r25993  
    410410
    411411}  /*}}}*/
    412 void albedo(IssmDouble** pa, int aIdx, IssmDouble* re, IssmDouble* dz, IssmDouble* d, IssmDouble cldFrac, IssmDouble aIce, IssmDouble aSnow, IssmDouble aValue, IssmDouble adThresh, IssmDouble* TK, IssmDouble* W, IssmDouble P, IssmDouble EC, IssmDouble Msurf, IssmDouble t0wet, IssmDouble t0dry, IssmDouble K, IssmDouble dt, IssmDouble dIce, int m,int sid) { /*{{{*/
     412void albedo(IssmDouble** pa, int aIdx, IssmDouble* re, IssmDouble* dz, IssmDouble* d, IssmDouble cldFrac, IssmDouble aIce, IssmDouble aSnow, IssmDouble aValue, IssmDouble adThresh, IssmDouble* TK, IssmDouble* W, IssmDouble P, IssmDouble EC, IssmDouble Msurf, IssmDouble clabSnow, IssmDouble clabIce, IssmDouble SZA, IssmDouble COT, IssmDouble t0wet, IssmDouble t0dry, IssmDouble K, IssmDouble dt, IssmDouble dIce, int m,int sid) { /*{{{*/
    413413
    414414        //// Calculates Snow, firn and ice albedo as a function of:
     
    432432        // Methods 1 & 2
    433433        //   re      = surface effective grain radius [mm]
     434        // Method 1, optional
     435        //  clabSnow = concentration of light absorbing carbon  [ppm1], default 0
     436        //  SZA      = solar zenith angle of the incident radiation [deg], default 0
     437        //  COT      = cloud optical thickness, default 0
     438        //  For TWO LAYER
     439        //  clabIce  = concentration of light absorbing carbon of first ice layer [ppm1], default 0
    434440
    435441        // Methods 3
     
    485491                        //function of effective grain radius
    486492
     493                        //gardnerAlb(S1, c1, SZA, t, z1, S2, c2)
     494                        //This is an implementation of the snow and ice broadband albedo
     495                        //  parameterization developed by Alex Gardner.
     496                        //Created By: Alex S. Gardner, Jet Propulsion Laboratory [alex.s.gardner@jpl.nasa.gov]
     497                        //  Last Modified: June, 2014
     498                        //Full Reference: Gardner, A. S., and Sharp, M. J.: A review of snow and
     499                        //  ice albedo and the development of a new physically based broadband albedo
     500                        //  parameterization, J. Geophys. Res., 115, F01009, 10.1029/2009jf001444,
     501                        //  2010.
     502
     503                        //INPUTS
     504                        // ONE LAYER
     505                        //  - S1    : specific surface area of the snow or ice [cm^2 g-1]
     506                        //  - c1    : concentration of light absorbing carbon  [ppm1]
     507                        //  - SZA   : solar zenith angle of the incident radiation [deg]
     508                        //  - t     : cloud optical thickness
     509                        // TWO LAYER
     510                        //  - z1    : depth of snow suface layer [mm w.e.]
     511                        //  - S2    : specific surface area of bottom ice layer [cm^2 g-1]
     512                        //  - c2    : concentration of light absorbing carbon of bottom ice
     513                        //             layer [ppm1]
     514                        IssmDouble c1=clabSnow;
     515                        IssmDouble c2=clabIce;
     516                        IssmDouble t=COT;
     517
     518                        //Single layer albedo parameterization
    487519                        //convert effective radius to specific surface area [cm2 g-1]
    488                         IssmDouble S = 3.0 / (0.091 * re[0]);
    489 
    490                         //determine broadband albedo
    491                         a[0]= 1.48 - pow(S,-0.07);
     520                        IssmDouble S1 = 3.0 / (0.091 * re[0]);
     521
     522                        //effective solar zenith angle
     523                        IssmDouble x = min(pow(t/(3*cos(Pi*SZA/180.0)),0.5), 1.0);
     524                        IssmDouble u = 0.64*x + (1-x)*cos(Pi*SZA/180.0);
     525
     526                        // pure snow albedo
     527                        IssmDouble as = 1.48 - pow(S1,-0.07);
     528
     529                        //change in pure snow albedo due to soot loading
     530                        IssmDouble dac = max(0.04 - as, pow(-c1,0.55)/(0.16 + 0.6*pow(S1,0.5) + (1.8*pow(c1,0.6))*pow(S1,-0.25)));
     531
     532                        //Two layer albedo parameterization
     533                        //  do two layer calculation if there is more than 1 layer
     534                        IssmDouble z1=0.0;
     535                        int lice=0;
     536                        for(int l=0;(l<m & d[l]<dPHC-Dtol);l++){
     537                                z1=z1+dz[l]*d[l]; //mm
     538                                lice=l+1;
     539                        }
     540                        if (m>0 & lice<m & z1 > Dtol){
     541                                // determine albedo values for bottom layer
     542                                IssmDouble S2 = 3.0 / (0.091 * re[lice]);
     543
     544                                // pure snow albedo
     545                                IssmDouble as2 = 1.48 - pow(S2,-0.07);
     546
     547                                // change in pure snow albedo due to soot loading
     548                                IssmDouble dac2 = max(0.04 - as2, pow(-c2,0.55)/(0.16 + 0.6*pow(S1,0.5) + (1.8*pow(c2,0.6))*pow(S2,-0.25)));
     549
     550                                // determine the effective change due to finite depth and soot loading
     551                                IssmDouble A = min(1.0, (2.1 * pow(z1,1.35*(1-as) - 0.1*c1 - 0.13)));
     552
     553                                dac =  (as2 + dac2 - as) + A*((as + dac) - (as2 + dac2));
     554                        }
     555
     556                        // change in albedo due to solar zenith angle
     557                        IssmDouble dasz = 0.53*as*(1 - (as + dac))*pow(1 - u,1.2);
     558
     559                        // change in albedo due to cloud (apart from change in diffuse fraction)
     560                        IssmDouble dat = (0.1*t*pow(as + dac,1.3)) / (pow(1 + 1.5*t,as));
     561
     562                        // Broadband albedo
     563                        a[0] = as + dac + dasz + dat;
    492564                }
    493565                else if(aIdx==2){
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h

    r25396 r25993  
    2929IssmDouble Marbouty(IssmDouble T, IssmDouble d, IssmDouble dT);
    3030void grainGrowth(IssmDouble** pre, IssmDouble** pgdn, IssmDouble** pgsp, IssmDouble* T,IssmDouble* dz,IssmDouble* d, IssmDouble* W,IssmDouble smb_dt,int m,int aIdx, int sid);
    31 void albedo(IssmDouble** a,int aIdx, IssmDouble* re, IssmDouble* dz, IssmDouble* d, IssmDouble cldFrac, IssmDouble aIce, IssmDouble aSnow, IssmDouble aValue, IssmDouble adThresh, IssmDouble* T, IssmDouble* W, IssmDouble P, IssmDouble EC, IssmDouble Msurf, IssmDouble t0wet, IssmDouble t0dry, IssmDouble K, IssmDouble dt, IssmDouble dIce, int m, int sid);
     31void albedo(IssmDouble** a,int aIdx, IssmDouble* re, IssmDouble* dz, IssmDouble* d, IssmDouble cldFrac, IssmDouble aIce, IssmDouble aSnow, IssmDouble aValue, IssmDouble adThresh, IssmDouble* T, IssmDouble* W, IssmDouble P, IssmDouble EC, IssmDouble Msurf, IssmDouble clabSnow, IssmDouble clabIce, IssmDouble SZA, IssmDouble COT, IssmDouble t0wet, IssmDouble t0dry, IssmDouble K, IssmDouble dt, IssmDouble dIce, int m, int sid);
    3232void shortwave(IssmDouble** pswf, int swIdx, int aIdx, IssmDouble dsw, IssmDouble as, IssmDouble* d, IssmDouble* dz, IssmDouble* re, IssmDouble dIce, int m, int sid);
    3333void thermo(IssmDouble* pEC, IssmDouble** T, IssmDouble* pulwrf, IssmDouble* dz, IssmDouble* d, IssmDouble* swf, IssmDouble dlw, IssmDouble Ta, IssmDouble V, IssmDouble eAir, IssmDouble pAir, IssmDouble teValue, IssmDouble Ws, IssmDouble dt0, int m, IssmDouble Vz, IssmDouble Tz, IssmDouble thermo_scaling, IssmDouble dIce, int sid, bool isconstrainsurfaceT);
Note: See TracChangeset for help on using the changeset viewer.