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

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

pressure in u_g generates a problem in core_nonlinear

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 %remove the pressure
73 solution(n+1).u_g(4:6:end)=0;
74
75 %compute new thickness
76 disp(sprintf('%s',' computing new thickness...'));
77 fem.inputs.velocity_average=solution(n+1).u_g;
78 new_thickness=prognostic_core(m_p,'prognostic',fem.inputs);
79
80 %update surface and bed using the new thickness
81 disp(sprintf('%s',' updating geometry...'));
82 indx=1:6:m_p.gridset.gsize; indx=indx(m_p.tpart);
83 [new_bed,new_surface,new_thickness]=UpdateGeometry(md,new_thickness(indx),solution(n).bed(indx),solution(n).surface(indx));
84
85 %Record bed surface and thickness in the solution
86 solution(n+1).thickness=zeros(m_p.gridset.gsize,1);solution(n+1).thickness(1:6:m_p.gridset.gsize)=new_thickness;
87 solution(n+1).bed=zeros(m_p.gridset.gsize,1);solution(n+1).bed(1:6:m_p.gridset.gsize)=new_bed;
88 solution(n+1).surface=zeros(m_p.gridset.gsize,1);solution(n+1).surface(1:6:m_p.gridset.gsize)=new_surface;
89
90 %figure out if time stepping is good
91 disp(sprintf('%s',' checking time stepping...'));
92 [back,dt,time]=TimeStepping(md,solution,dt,time);
93 if back,
94 continue;
95 end
96
97 %update time and counter
98 time=time+dt;
99 n=n+1;
100
101end
102
103%load results onto model
104indx=1:6:m_p.gridset.gsize; indx=indx(m_p.tpart);
105indy=2:6:m_p.gridset.gsize; indy=indy(m_p.tpart);
106for i=1:length(solution),
107 solution2(i).vx=solution(i).u_g(indx)*md.yts;
108 solution2(i).vy=solution(i).u_g(indy)*md.yts;
109 solution2(i).vel=sqrt(solution2(i).vx.^2+solution2(i).vy.^2);
110 solution2(i).thickness=solution(i).thickness(indx);
111 solution2(i).surface=solution(i).surface(indx);
112 solution2(i).bed=solution(i).bed(indx);
113 solution2(i).time=solution(i).time/md.yts;
114 solution2(i).step=i;
115end
116md.results.transient=solution2;
Note: See TracBrowser for help on using the repository browser.