source: issm/trunk/src/m/solutions/ice/transient2d.m@ 739

Last change on this file since 739 was 739, checked in by Mathieu Morlighem, 16 years ago

minor

File size: 3.7 KB
Line 
1function md=transient2d(md);
2%ICETRANSIENT2D - transient solution of 2d models
3%
4% Usage:
5% md=transient2d(md)
6
7global gridset
8
9%Create fem structure (input of diagnostic2d)
10fem=struct();
11
12%Figure out which type of elements are present
13fem.ishutter=md.ishutter;
14fem.ismacayealpattyn=md.ismacayealpattyn;
15fem.isstokes=md.isstokes;
16
17%First, build elements,grids,loads, etc ... for horizontal model
18if fem.ishutter,
19 fem.m_ss=CreateFemModel(md,'surface_slope_compute');
20 fem.m_dhu=CreateFemModel(md,'diagnostic_hutter');
21end
22if fem.ismacayealpattyn,
23 fem.m_dh=CreateFemModel(md,'diagnostic_horiz');
24end
25m_p=CreateFemModel(md,'prognostic');
26
27%initialize (velocity,pressure)
28solution.u_g=zeros(m_p.gridset.gsize,1);
29if ~isnan(md.vx), solution.u_g(1:6:m_p.gridset.gsize)=md.vx/md.yts; end
30if ~isnan(md.vy), solution.u_g(2:6:m_p.gridset.gsize)=md.vy/md.yts; end
31
32%initialize geometry and time
33solution.thickness=zeros(m_p.gridset.gsize,1);solution.thickness(1:6:m_p.gridset.gsize)=md.thickness;
34solution.surface=zeros(m_p.gridset.gsize,1);solution.surface(1:6:m_p.gridset.gsize)=md.surface;
35solution.bed=zeros(m_p.gridset.gsize,1);solution.bed(1:6:m_p.gridset.gsize)=md.bed;
36solution.time=0;
37
38%melting and accumulation are taken constant for all iterations
39melting=zeros(m_p.gridset.gsize,1);
40accumulation=zeros(m_p.gridset.gsize,1);
41melting(1:6:end)=md.melting/md.yts; %from m/yr to m/s
42accumulation(1:6:end)=md.accumulation/md.yts; %from m/yr to m/s
43
44%build constant inputs
45fem.inputs=struct();
46fem.inputs.accumulation=accumulation;
47fem.inputs.melting=melting;
48fem.inputs.dt=md.dt;
49
50%first time step is given by model.
51dt=md.dt;
52finaltime=md.ndt;
53time=dt;
54n=1; %counter
55
56while time<finaltime+dt, %make sure we run up to finaltime.
57
58 disp(sprintf('\n%s%g%s%g%s%g\n','time [yr]: ',time/md.yts,' iteration number: ',n,'/',floor(finaltime/dt)));
59
60 solution(n+1).time=time;
61
62 %update inputs
63 fem.inputs.velocity=solution(n).u_g;
64 fem.inputs.thickness=solution(n).thickness;
65 fem.inputs.bed=solution(n).bed;
66 fem.inputs.surface=solution(n).surface;
67
68 %Deal with velocities.
69
70 %Get horizontal solution.
71 solution(n+1).u_g=diagnostic2d(md,fem);
72
73 %compute new thickness
74 disp(sprintf('%s',' computing new thickness...'));
75 fem.inputs.velocity_average=solution(n+1).u_g;
76 new_thickness=prognostic_core(m_p,'prognostic',fem.inputs);
77
78 %update surface and bed using the new thickness
79 disp(sprintf('%s',' updating geometry...'));
80 indx=1:6:m_p.gridset.gsize; indx=indx(m_p.tpart);
81 [new_bed,new_surface,new_thickness]=UpdateGeometry(md,new_thickness(indx),solution(n).bed(indx),solution(n).surface(indx));
82
83 %Record bed surface and thickness in the solution
84 solution(n+1).thickness=zeros(m_p.gridset.gsize,1);solution(n+1).thickness(1:6:m_p.gridset.gsize)=new_thickness;
85 solution(n+1).bed=zeros(m_p.gridset.gsize,1);solution(n+1).bed(1:6:m_p.gridset.gsize)=new_bed;
86 solution(n+1).surface=zeros(m_p.gridset.gsize,1);solution(n+1).surface(1:6:m_p.gridset.gsize)=new_surface;
87
88 %figure out if time stepping is good
89 disp(sprintf('%s',' checking time stepping...'));
90 [back,dt,time]=TimeStepping(md,solution,dt,time);
91 if back,
92 continue;
93 end
94
95 %update time and counter
96 time=time+dt;
97 n=n+1;
98
99end
100
101%load results onto model
102indx=1:6:m_p.gridset.gsize; indx=indx(m_p.tpart);
103indy=2:6:m_p.gridset.gsize; indy=indy(m_p.tpart);
104for i=1:length(solution),
105 solution2(i).vx=solution(i).u_g(indx)*md.yts;
106 solution2(i).vy=solution(i).u_g(indy)*md.yts;
107 solution2(i).vel=sqrt(solution2(i).vx.^2+solution2(i).vy.^2);
108 solution2(i).thickness=solution(i).thickness(indx);
109 solution2(i).surface=solution(i).surface(indx);
110 solution2(i).bed=solution(i).bed(indx);
111 solution2(i).time=solution(i).time/md.yts;
112 solution2(i).step=i;
113end
114md.results.transient=solution2;
Note: See TracBrowser for help on using the repository browser.