Changeset 25427


Ignore:
Timestamp:
08/18/20 17:42:43 (5 years ago)
Author:
adhikari
Message:

CHG: added rotational feedbacks to original SESAW solver

Location:
issm/trunk-jpl/src/m/contrib/adhikari/adhikari2016GMD_slr_solver
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/contrib/adhikari/adhikari2016GMD_slr_solver/SESAWslr.m

    r25417 r25427  
    1 function [eust,rsl] = SESAWslr(index,greens,para)
     1function [eust,rsl] = SESAWslr(index,lat,long,greens,para)
    22%SESAWslr :: computes GRD slr due to applied surface loads based on SESAW method.
    33%
     
    55%
    66%   Usage:
    7 %      [eus,rsl]=greensfunctions(md.mesh.elements,greens,para)
     7%      [eus,rsl]=greensfunctions(md.mesh.elements,md.mesh.lat,md.mesh.long,greens,para)
    88%     
    99%      greens.Grigid = Gravitational Green's function for the rigid planet.
     
    1818%      para.loads_density = land loads (ice or freshwater) density [kg/m^3]
    1919%      para.rel_tol = relative tolerance for iterative SLR solver
     20%
    2021%      para.solidearth = rheological model for solid Earth: 'rigid' or 'elastic'
    21 %      para.isgrd_R = Do we want to account for Rotational feedback? 0 or 1.
     22%
     23%      para.rotational.flag = Do we want to accoutn for rotational feedback? 1 (yes) or 0 (no)
     24%      para.rotational.earth_radius = mean radius of the Earth [m]
     25%      para.rotational.load_love_k2 = degree 2 load love number k 
     26%      para.rotational.tide_love_k2 = degree 2 tide love number k 
     27%      para.rotational.tide_love_h2 = degree 2 tide love number h
     28%      para.rotational.tide_love_k2secular = degree 2 secular tide love number k 
     29%      para.rotational.moi_p = polar moment of inertia [kg m^2] 
     30%      para.rotational.moi_e = mean equatorial moment of inertia [kg m^2] 
     31%      para.rotational.omega = mean rotational velocity of earth [rad per second] 
    2232
    2333area_element = para.area_element;
     
    2939rel_tol = para.rel_tol;
    3040
     41rot_flag = para.rotational.flag;
     42
    3143% total Green's function for elastic earth, i.e. (1+k_l-h_l)
    3244if strcmpi(para.solidearth,'rigid')
    3345        Galpha = greens.Grigid;
    3446elseif strcmpi(para.solidearth,'elastic')
    35         Galpha = greens.Grigid + greens.Gelast- greens.Uelast;         
     47        Galpha = greens.Grigid + greens.Gelast - greens.Uelast;         
    3648else
    3749        error(['Unknown solidearth model:' para.solidearth, '; Should be rigid or elastic']);
    3850end
    3951
     52if rot_flag
     53        % set up parameters for rotationalfeedback function.
     54        para_rot = para.rotational;
     55        para_rot.area_element =  para.area_element;
     56        para_rot.loads_element = para.loads_element
     57        para_rot.loads_density = para.loads_density; 
     58end
     59
     60% densitity ratios
    4061density_o_e = rho_o/rho_e;
    4162density_l_e = rho_l/rho_e;
    4263density_l_o = rho_l/rho_o;
    4364
     65% ocean and earth's surface areas:
     66ocean_area = sum(ocean_element.*area_element);
     67earth_area = sum(area_element);
     68
    4469% eustatic term
    45 eust=-density_l_o*sum(loads_element.*area_element)/sum(ocean_element.*area_element);
     70eust = -density_l_o*sum(loads_element.*area_element)/ocean_area;
    4671
    47 term1=3*density_l_e.*sum(bsxfun(@times,Galpha,(loads_element.*area_element)'),2)./sum(area_element);
    48 func3=mean(term1(index),2).*ocean_element;
    49 term3=sum(func3.*area_element)./sum(ocean_element.*area_element);
     72term1 = 3*density_l_e.*sum(bsxfun(@times,Galpha,(loads_element.*area_element)'),2)./earth_area;
     73if rot_flag
     74        term1 = term1 + rotationalfeedback(index,lat,long,para_rot);
     75end
     76func3 = mean(term1(index),2).*ocean_element;
     77term3 = sum(func3.*area_element)./ocean_area;
    5078
    5179% computation of sea level change
    52 rsl=eust+term1-term3;
     80rsl = eust+term1-term3;
    5381
    54 norm_diff = 10;                 p = 0;
    55 
     82norm_diff = 10; p = 0;
    5683while norm_diff > rel_tol
    5784        norm_old = sqrt(sum(rsl.^2));
     85        %
     86        term2 = 3*density_o_e.*sum(bsxfun(@times,Galpha,(mean(rsl(index),2).*ocean_element.*area_element)'),2)./earth_area;
     87        if rot_flag
     88                para_rot.loads_element = mean(rsl(index),2).*ocean_element;
     89                para_rot.loads_density = para.ocean_density;
     90                term2 = term2 + rotationalfeedback(index,lat,long,para_rot);
     91        end
     92        func4 = mean(term2(index),2).*ocean_element;
     93        term4 = sum(func4.*area_element)./ocean_area;
    5894        %
    59         term2=3*density_o_e.*sum(bsxfun(@times,Galpha,(mean(rsl(index),2).*ocean_element.*area_element)'),2)./sum(area_element);
    60         func4=mean(term2(index),2).*ocean_element;
    61         term4=sum(func4.*area_element)./sum(ocean_element.*area_element);
    62         %
    63         rsl=eust+term1+term2-term3-term4;
     95        rsl = eust+term1+term2-term3-term4;
    6496        norm_new  = sqrt(sum(rsl.^2));
    6597        norm_diff = abs(norm_new-norm_old)./norm_old;
  • issm/trunk-jpl/src/m/contrib/adhikari/adhikari2016GMD_slr_solver/greensfunctions.m

    r25417 r25427  
    1 function [Grigid,Gelastic,Uelastic] = greensfunctions(md_mesh,love_numbers)
     1function [Grigid,Gelastic,Uelastic] = greensfunctions(mesh_elements,mesh_lat,mesh_long,love_numbers)
    22%greensfunctions :: computes Greens funtions for rigid and elastic Earth.
    33%
    44%   Usage:
    5 %      [Grigid,Gelastic,Uelastic]=greensfunctions(md_mesh,love_numbers)
     5%      [Grigid,Gelastic,Uelastic]=greensfunctions(md.mesh.elements,md.mesh.lat,md.mesh.long,md.solidearth.lovenumbers);
    66
    7 nv=md_mesh.numberofvertices;
    8 ne=md_mesh.numberofelements;
     7ne = length(mesh_elements);
     8nv = length(mesh_lat);
    99
    1010% compute lat,long at elemental centroids.
    11 [late,longe] = latelonge(md_mesh);
     11[late,longe] = latelonge(mesh_elements,mesh_lat,mesh_long);
    1212
    1313% love numbers.
     
    3636qq=1;
    3737for j=1:nv
    38         phi1(:,1)=md_mesh.lat(j)./180.*pi;      lambda1(:,1)=md_mesh.long(j)./180.*pi; % size #vertices
     38        phi1(:,1)=mesh_lat(j)./180.*pi; lambda1(:,1)=mesh_long(j)./180.*pi; % size #vertices
    3939        delPhi=abs(phi2-phi1);                                  delLambda=abs(lambda2-lambda1);
    4040        alpha=2.*asin(sqrt(sin(delPhi./2).^2+cos(phi1).*cos(phi2).*sin(delLambda./2).^2));
     
    4343        Uelastic(j,:)=interp1(xx,elast_loveH,cos(alpha));
    4444        if (j==500*qq)
    45                 display([num2str(j),' of ', num2str(md_mesh.numberofvertices),' vertices done!']);
     45                display([num2str(j),' of ', num2str(nv),' vertices done!']);
    4646                qq=qq+1;
    4747        end
  • issm/trunk-jpl/src/m/contrib/adhikari/adhikari2016GMD_slr_solver/latelonge.m

    r25417 r25427  
    1 function [late,longe] = latelonge(md_mesh)
     1function [late,longe] = latelonge(mesh_elements,mesh_lat,mesh_long)
    22%latelonge :: computes lat,long at elemental centroids on spherical surface
    33%
    44%   Usage:
    5 %      [late,longe]=latelonge(md.mesh)
     5%      [late,longe]=latelonge(md.mesh.elements,md.mesh.lat,md.mesh.long)
    66
    7 nv = md_mesh.numberofvertices;
    8 if length(md_mesh.lat)~=nv | length(md_mesh.long)~=nv
    9         error('lat,long not defined properly at vertices.');
    10 end
     7ne = length(mesh_elements);
     8nv = length(mesh_lat);
    119
    1210% lat -> [0,180]; long -> [0,360] to compute centroids
    13 lat=90-md_mesh.lat;             lon=md_mesh.long;
     11lat=90-mesh_lat;                lon=mesh_long;
    1412lon(lon<0)=180+(180+lon(lon<0));
    1513
    16 ax_0=lat(md_mesh.elements(:,1)); ay_0=lon(md_mesh.elements(:,1));
    17 bx_0=lat(md_mesh.elements(:,2)); by_0=lon(md_mesh.elements(:,2));
    18 cx_0=lat(md_mesh.elements(:,3)); cy_0=lon(md_mesh.elements(:,3));
     14ax_0=lat(mesh_elements(:,1)); ay_0=lon(mesh_elements(:,1));
     15bx_0=lat(mesh_elements(:,2)); by_0=lon(mesh_elements(:,2));
     16cx_0=lat(mesh_elements(:,3)); cy_0=lon(mesh_elements(:,3));
    1917% find whether long is 0 or 360! This is important to compute centroids as well as elemental area
    20 for ii=1:md_mesh.numberofelements
     18for ii=1:ne
    2119        if (min([ay_0(ii),by_0(ii),cy_0(ii)])==0 && max([ay_0(ii),by_0(ii),cy_0(ii)])>180)
    2220                if ay_0(ii)==0
Note: See TracChangeset for help on using the changeset viewer.