|
| 1 | +%required Data |
| 2 | +accpath = ['/home/ModelData/Greenland/RACMO2Accumulation/SMBGreenland/smb_1961-1990.mat']; |
| 3 | +velpath = ['/home/ModelData/Greenland/VelMouginot/RignotGreenland2012Vel.mat']; |
| 4 | + |
| 5 | +%WARNING: we do have a levelset here, so we must set it to one even for stressbalances... |
| 6 | +md.transient.ismovingfront=1; |
| 7 | + |
| 8 | +disp(' Interpolating mask'); |
| 9 | +mask = int8(interpBedmachineGreenland(md.mesh.x,md.mesh.y,'mask')); |
| 10 | +md.mask.ice_levelset= -1*ones(md.mesh.numberofvertices,1); |
| 11 | +pos = find(mask<1); |
| 12 | +md.mask.ice_levelset(pos)=1; |
| 13 | + |
| 14 | +disp(' reading MC bed (assumes no floating ice)'); |
| 15 | +md.geometry.bed = interpBedmachineGreenland(md.mesh.x,md.mesh.y,'bed'); |
| 16 | +md.geometry.base = md.geometry.bed; |
| 17 | + |
| 18 | +disp(' reading Howat surface'); |
| 19 | +md.geometry.surface=interpBedmachineGreenland(md.mesh.x,md.mesh.y,'surface'); |
| 20 | +pos = find(md.mask.ice_levelset>0); |
| 21 | +md.geometry.surface(pos) = md.geometry.base(pos)+10; %Minimum thickness |
| 22 | + |
| 23 | +md.geometry.thickness = md.geometry.surface - md.geometry.bed; |
| 24 | +pos=find(md.geometry.thickness<=10); |
| 25 | +md.geometry.surface(pos) = md.geometry.base(pos)+10; %Minimum thickness |
| 26 | +md.geometry.thickness = md.geometry.surface - md.geometry.bed; |
| 27 | + |
| 28 | +md.masstransport.min_thickness = 10; |
| 29 | + |
| 30 | +disp(' Adjusting ice mask'); |
| 31 | +%Tricky part here: we want to offset the mask by one element so that we don't end up with a cliff at the transition |
| 32 | +pos = find(max(md.mask.ice_levelset(md.mesh.elements),[],2)>0); |
| 33 | +md.mask.ice_levelset(md.mesh.elements(pos,:)) = 1; |
| 34 | +% For the region where surface is NaN, set thickness to small value (consistency requires >0) |
| 35 | +pos=find((md.mask.ice_levelset<0).*(md.geometry.surface<0)); |
| 36 | +md.mask.ice_levelset(pos)=1; |
| 37 | +pos=find((md.mask.ice_levelset<0).*(isnan(md.geometry.surface))); |
| 38 | +md.mask.ice_levelset(pos)=1; |
| 39 | + |
| 40 | +disp(' -- reconstruct thickness'); |
| 41 | +md.geometry.thickness=md.geometry.surface-md.geometry.base; |
| 42 | + |
| 43 | +disp(' reading velocities '); |
| 44 | +[md.inversion.vx_obs md.inversion.vy_obs]=interpJoughinCompositeGreenland(md.mesh.x,md.mesh.y); |
| 45 | +pos=find(isnan(md.inversion.vx_obs) | isnan(md.inversion.vy_obs)); |
| 46 | +md.inversion.vx_obs(pos)=0; |
| 47 | +md.inversion.vy_obs(pos)=0; |
| 48 | +md.inversion.vel_obs = sqrt(md.inversion.vx_obs.^2+md.inversion.vy_obs.^2); |
| 49 | +md.initialization.vx = md.inversion.vx_obs; |
| 50 | +md.initialization.vy = md.inversion.vy_obs; |
| 51 | +md.initialization.vz = zeros(md.mesh.numberofvertices,1); |
| 52 | +md.initialization.vel = md.inversion.vel_obs; |
| 53 | + |
| 54 | +%drag md.drag or stress |
| 55 | +md.friction.coefficient = 20*ones(md.mesh.numberofvertices,1); %q = 1. |
| 56 | +md.friction.p = ones(md.mesh.numberofelements,1); |
| 57 | +md.friction.q = ones(md.mesh.numberofelements,1); |
| 58 | + |
| 59 | +%No friction on PURELY ocean element |
| 60 | +pos_e = find(min(md.mask.ice_levelset(md.mesh.elements),[],2)<0); |
| 61 | +flags=ones(md.mesh.numberofvertices,1); |
| 62 | +flags(md.mesh.elements(pos_e,:))=0; |
| 63 | +md.friction.coefficient(find(flags))=0; |
| 64 | + |
| 65 | +%flow law |
| 66 | +disp(' Creating flow law parameters (assume ice is at 0°C for now)'); |
| 67 | +md.materials.rheology_n = 3*ones(md.mesh.numberofelements,1); |
| 68 | +md.materials.rheology_B = cuffey(273.15 - 10)*ones(md.mesh.numberofvertices,1); |
| 69 | + |
| 70 | +md.basalforcings.groundedice_melting_rate = zeros(md.mesh.numberofvertices,1); |
| 71 | +md.basalforcings.floatingice_melting_rate = zeros(md.mesh.numberofvertices,1); |
| 72 | + |
| 73 | +disp(' Geothermal flux from Shapiro et al.'); |
| 74 | +md.basalforcings.geothermalflux=interpSeaRISE(md.mesh.x,md.mesh.y,'bheatflx'); |
| 75 | + |
| 76 | +disp(' Setting up thermal model'); |
| 77 | +md.initialization.temperature=min(0,interpSeaRISE(md.mesh.x,md.mesh.y,'surftemp'))+273.15; |
| 78 | +md.initialization.waterfraction=zeros(md.mesh.numberofvertices,1); |
| 79 | +md.initialization.watercolumn=zeros(md.mesh.numberofvertices,1); |
| 80 | +md.thermal.spctemperature=md.initialization.temperature; |
| 81 | +md.thermal.isenthalpy=1; |
| 82 | +md.thermal.isdynamicbasalspc=1; |
| 83 | + |
| 84 | +%Deal with boundary conditions: |
| 85 | +disp(' Set Boundary conditions'); |
| 86 | +md.stressbalance.spcvx=NaN*ones(md.mesh.numberofvertices,1); |
| 87 | +md.stressbalance.spcvy=NaN*ones(md.mesh.numberofvertices,1); |
| 88 | +md.stressbalance.spcvz=NaN*ones(md.mesh.numberofvertices,1); |
| 89 | +md.stressbalance.referential=NaN*ones(md.mesh.numberofvertices,6); |
| 90 | +md.stressbalance.loadingforce=0*ones(md.mesh.numberofvertices,3); |
| 91 | +pos=find((md.mask.ice_levelset<0).*(md.mesh.vertexonboundary)); |
| 92 | +md.stressbalance.spcvx(pos)=md.initialization.vx(pos); |
| 93 | +md.stressbalance.spcvy(pos)=md.initialization.vy(pos); |
| 94 | +md.stressbalance.spcvz(pos)=0; |
0 commit comments