Changeset 25427
- Timestamp:
- 08/18/20 17:42:43 (5 years ago)
- 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)1 function [eust,rsl] = SESAWslr(index,lat,long,greens,para) 2 2 %SESAWslr :: computes GRD slr due to applied surface loads based on SESAW method. 3 3 % … … 5 5 % 6 6 % 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) 8 8 % 9 9 % greens.Grigid = Gravitational Green's function for the rigid planet. … … 18 18 % para.loads_density = land loads (ice or freshwater) density [kg/m^3] 19 19 % para.rel_tol = relative tolerance for iterative SLR solver 20 % 20 21 % 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] 22 32 23 33 area_element = para.area_element; … … 29 39 rel_tol = para.rel_tol; 30 40 41 rot_flag = para.rotational.flag; 42 31 43 % total Green's function for elastic earth, i.e. (1+k_l-h_l) 32 44 if strcmpi(para.solidearth,'rigid') 33 45 Galpha = greens.Grigid; 34 46 elseif strcmpi(para.solidearth,'elastic') 35 Galpha = greens.Grigid + greens.Gelast - greens.Uelast;47 Galpha = greens.Grigid + greens.Gelast - greens.Uelast; 36 48 else 37 49 error(['Unknown solidearth model:' para.solidearth, '; Should be rigid or elastic']); 38 50 end 39 51 52 if 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; 58 end 59 60 % densitity ratios 40 61 density_o_e = rho_o/rho_e; 41 62 density_l_e = rho_l/rho_e; 42 63 density_l_o = rho_l/rho_o; 43 64 65 % ocean and earth's surface areas: 66 ocean_area = sum(ocean_element.*area_element); 67 earth_area = sum(area_element); 68 44 69 % eustatic term 45 eust =-density_l_o*sum(loads_element.*area_element)/sum(ocean_element.*area_element);70 eust = -density_l_o*sum(loads_element.*area_element)/ocean_area; 46 71 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); 72 term1 = 3*density_l_e.*sum(bsxfun(@times,Galpha,(loads_element.*area_element)'),2)./earth_area; 73 if rot_flag 74 term1 = term1 + rotationalfeedback(index,lat,long,para_rot); 75 end 76 func3 = mean(term1(index),2).*ocean_element; 77 term3 = sum(func3.*area_element)./ocean_area; 50 78 51 79 % computation of sea level change 52 rsl =eust+term1-term3;80 rsl = eust+term1-term3; 53 81 54 norm_diff = 10; p = 0; 55 82 norm_diff = 10; p = 0; 56 83 while norm_diff > rel_tol 57 84 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; 58 94 % 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; 64 96 norm_new = sqrt(sum(rsl.^2)); 65 97 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(m d_mesh,love_numbers)1 function [Grigid,Gelastic,Uelastic] = greensfunctions(mesh_elements,mesh_lat,mesh_long,love_numbers) 2 2 %greensfunctions :: computes Greens funtions for rigid and elastic Earth. 3 3 % 4 4 % 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); 6 6 7 n v=md_mesh.numberofvertices;8 n e=md_mesh.numberofelements;7 ne = length(mesh_elements); 8 nv = length(mesh_lat); 9 9 10 10 % compute lat,long at elemental centroids. 11 [late,longe] = latelonge(m d_mesh);11 [late,longe] = latelonge(mesh_elements,mesh_lat,mesh_long); 12 12 13 13 % love numbers. … … 36 36 qq=1; 37 37 for j=1:nv 38 phi1(:,1)=m d_mesh.lat(j)./180.*pi; lambda1(:,1)=md_mesh.long(j)./180.*pi; % size #vertices38 phi1(:,1)=mesh_lat(j)./180.*pi; lambda1(:,1)=mesh_long(j)./180.*pi; % size #vertices 39 39 delPhi=abs(phi2-phi1); delLambda=abs(lambda2-lambda1); 40 40 alpha=2.*asin(sqrt(sin(delPhi./2).^2+cos(phi1).*cos(phi2).*sin(delLambda./2).^2)); … … 43 43 Uelastic(j,:)=interp1(xx,elast_loveH,cos(alpha)); 44 44 if (j==500*qq) 45 display([num2str(j),' of ', num2str( md_mesh.numberofvertices),' vertices done!']);45 display([num2str(j),' of ', num2str(nv),' vertices done!']); 46 46 qq=qq+1; 47 47 end -
issm/trunk-jpl/src/m/contrib/adhikari/adhikari2016GMD_slr_solver/latelonge.m
r25417 r25427 1 function [late,longe] = latelonge(m d_mesh)1 function [late,longe] = latelonge(mesh_elements,mesh_lat,mesh_long) 2 2 %latelonge :: computes lat,long at elemental centroids on spherical surface 3 3 % 4 4 % Usage: 5 % [late,longe]=latelonge(md.mesh )5 % [late,longe]=latelonge(md.mesh.elements,md.mesh.lat,md.mesh.long) 6 6 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 7 ne = length(mesh_elements); 8 nv = length(mesh_lat); 11 9 12 10 % lat -> [0,180]; long -> [0,360] to compute centroids 13 lat=90-m d_mesh.lat; lon=md_mesh.long;11 lat=90-mesh_lat; lon=mesh_long; 14 12 lon(lon<0)=180+(180+lon(lon<0)); 15 13 16 ax_0=lat(m d_mesh.elements(:,1)); ay_0=lon(md_mesh.elements(:,1));17 bx_0=lat(m d_mesh.elements(:,2)); by_0=lon(md_mesh.elements(:,2));18 cx_0=lat(m d_mesh.elements(:,3)); cy_0=lon(md_mesh.elements(:,3));14 ax_0=lat(mesh_elements(:,1)); ay_0=lon(mesh_elements(:,1)); 15 bx_0=lat(mesh_elements(:,2)); by_0=lon(mesh_elements(:,2)); 16 cx_0=lat(mesh_elements(:,3)); cy_0=lon(mesh_elements(:,3)); 19 17 % find whether long is 0 or 360! This is important to compute centroids as well as elemental area 20 for ii=1: md_mesh.numberofelements18 for ii=1:ne 21 19 if (min([ay_0(ii),by_0(ii),cy_0(ii)])==0 && max([ay_0(ii),by_0(ii),cy_0(ii)])>180) 22 20 if ay_0(ii)==0
Note:
See TracChangeset
for help on using the changeset viewer.