[19049] | 1 | %Test Name: EISMINTRoundIceSheetStaticFS
|
---|
[15566] | 2 | %The aim of this program is to compare a model with an analytical solution given in SSA EISMINT : Lessons in Ice-Sheet Modeling.
|
---|
[5765] | 3 | printingflag=false;
|
---|
| 4 |
|
---|
[5117] | 5 | numlayers=10;
|
---|
[14134] | 6 | resolution=30000.;
|
---|
[5117] | 7 |
|
---|
| 8 | %To begin with the numerical model
|
---|
[13663] | 9 | md=model();
|
---|
[14134] | 10 | md=roundmesh(md,750000.,resolution);
|
---|
[9641] | 11 | md=setmask(md,'',''); %We can not test iceshelves nor ice rises with this analytical solution
|
---|
[5117] | 12 | md=parameterize(md,'../Par/RoundSheetStaticEISMINT.par');
|
---|
| 13 |
|
---|
| 14 | %Calculation of the analytical 2d velocity field
|
---|
| 15 | constant=0.3;
|
---|
[14134] | 16 | vx_obs=constant/2.*md.mesh.x.*(md.geometry.thickness).^-1;
|
---|
| 17 | vy_obs=constant/2.*md.mesh.y.*(md.geometry.thickness).^-1;
|
---|
| 18 | vel_obs=sqrt((md.inversion.vx_obs).^2+(md.inversion.vy_obs).^2);
|
---|
[5117] | 19 |
|
---|
| 20 | %We extrude the model to have a 3d model
|
---|
[13671] | 21 | md=extrude(md,numlayers,1.);
|
---|
[15565] | 22 | md=setflowequation(md,'FS','all');
|
---|
[5117] | 23 |
|
---|
[8304] | 24 | %Spc the nodes on the bed
|
---|
[17610] | 25 | pos=find(md.mesh.vertexonbase);
|
---|
[15771] | 26 | md.stressbalance.spcvx(pos)=0.;
|
---|
| 27 | md.stressbalance.spcvy(pos)=0.;
|
---|
| 28 | md.stressbalance.spcvz(pos)=0.;
|
---|
[5117] | 29 |
|
---|
| 30 | %Now we can solve the problem
|
---|
[8630] | 31 | md.cluster=generic('name',oshostname(),'np',8);
|
---|
[21049] | 32 | md=solve(md,'StressbalanceSolution');
|
---|
[5117] | 33 |
|
---|
| 34 | %Calculate the depth averaged velocity field (2d):
|
---|
[15771] | 35 | vx=(md.results.StressbalanceSolution.Vx);
|
---|
| 36 | vy=(md.results.StressbalanceSolution.Vy);
|
---|
[9725] | 37 | vel=zeros(md.mesh.numberofvertices2d,1);
|
---|
[5117] | 38 |
|
---|
[9725] | 39 | for i=1:md.mesh.numberofvertices2d
|
---|
[14134] | 40 | node_vel=0.;
|
---|
| 41 | for j=1:md.mesh.numberoflayers-1
|
---|
| 42 | node_vel=node_vel+1./(2.*(md.mesh.numberoflayers-1))*...
|
---|
| 43 | (sqrt(vx(i+j*md.mesh.numberofvertices2d,1).^2+vy(i+j*md.mesh.numberofvertices2d,1).^2)+...
|
---|
[9725] | 44 | sqrt(vx(i+(j-1)*md.mesh.numberofvertices2d,1).^2+vy(i+(j-1)*md.mesh.numberofvertices2d,1).^2));
|
---|
[5117] | 45 | end
|
---|
[8304] | 46 | vel(i,1)=node_vel;
|
---|
[5117] | 47 | end
|
---|
| 48 |
|
---|
| 49 | %Plot of the velocity from the exact and calculated solutions
|
---|
| 50 | figure(1)
|
---|
| 51 | subplot(2,2,1)
|
---|
[9734] | 52 | p=patch('Faces',md.mesh.elements2d,'Vertices',[md.mesh.x2d md.mesh.y2d],'FaceVertexCData',...
|
---|
[5117] | 53 | vel,'FaceColor','interp','EdgeColor','none');
|
---|
| 54 | title('Modelled velocity','FontSize',14,'FontWeight','bold')
|
---|
| 55 | colorbar;
|
---|
| 56 | caxis([0 200]);
|
---|
| 57 |
|
---|
| 58 | subplot(2,2,2)
|
---|
[9734] | 59 | p=patch('Faces',md.mesh.elements2d,'Vertices',[md.mesh.x2d md.mesh.y2d],'FaceVertexCData',...
|
---|
[5117] | 60 | vel_obs,'FaceColor','interp','EdgeColor','none');
|
---|
| 61 | title('Analytical velocity','FontSize',14,'FontWeight','bold')
|
---|
| 62 | colorbar;
|
---|
| 63 | caxis([0 200]);
|
---|
| 64 |
|
---|
| 65 | subplot(2,2,3)
|
---|
| 66 | hold on;
|
---|
[9734] | 67 | plot(sqrt((md.mesh.x(1:md.mesh.numberofvertices2d)).^2+(md.mesh.y(1:md.mesh.numberofvertices2d)).^2),vel,'r.');
|
---|
| 68 | plot(sqrt((md.mesh.x2d).^2+(md.mesh.y2d).^2),vel_obs,'b.');
|
---|
[5117] | 69 | title('Analytical vs calculated velocity','FontSize',14,'FontWeight','bold');
|
---|
| 70 | xlabel('distance to the center of the icesheet [m]','FontSize',14,'FontWeight','bold');
|
---|
| 71 | ylabel('velocity [m/yr]','FontSize',14,'FontWeight','bold');
|
---|
| 72 | legend('calculated velocity','exact velocity');
|
---|
| 73 | axis([0 750000 0 200]);
|
---|
| 74 | hold off;
|
---|
| 75 |
|
---|
| 76 | subplot(2,2,4)
|
---|
[9734] | 77 | p=patch('Faces',md.mesh.elements2d,'Vertices',[md.mesh.x2d md.mesh.y2d],'FaceVertexCData',...
|
---|
[5117] | 78 | abs(vel-vel_obs)./vel_obs*100,'FaceColor','interp','EdgeColor','none');
|
---|
| 79 | title('Relative misfit [%]','FontSize',14,'FontWeight','bold')
|
---|
| 80 | colorbar;
|
---|
| 81 | caxis([0 100]);
|
---|
| 82 |
|
---|
[14134] | 83 | if printingflag,
|
---|
[5765] | 84 | set(gcf,'Color','w')
|
---|
[15565] | 85 | printmodel('FSstatic','png','margin','on','marginsize',25,'frame','off','resolution',0.7,'hardcopy','off');
|
---|
| 86 | system(['mv FSstatic.png ' ISSM_DIR '/website/doc_pdf/validation/Images/EISMINT/IceSheet']);
|
---|
[5765] | 87 | end
|
---|
| 88 |
|
---|
[5117] | 89 | %Fields and tolerances to track changes
|
---|
| 90 | field_names ={ ...
|
---|
| 91 | 'Vx','Vy','Vel', ...
|
---|
| 92 | };
|
---|
[14134] | 93 | field_tolerances={ ...
|
---|
[6330] | 94 | 1e-12,1e-12,1e-12, ...
|
---|
[5117] | 95 | };
|
---|
[14134] | 96 | field_values={ ...
|
---|
[5117] | 97 | vx,vy,vel, ...
|
---|
| 98 | };
|
---|