source: issm/trunk/src/m/solve/solve.m@ 26744

Last change on this file since 26744 was 26744, checked in by Mathieu Morlighem, 3 years ago

merged trunk-jpl and trunk for revision 26742

File size: 6.5 KB
Line 
1function md=solve(md,solutionstring,varargin)
2%SOLVE - apply solution sequence for this model
3%
4% Usage:
5% md=solve(md,solutionstring,varargin)
6%
7% where varargin is a lit of paired arguments of string OR enums
8%
9% Solution types available comprise:
10% - 'Stressbalance' or 'sb'
11% - 'Masstransport' or 'mt'
12% - 'Oceantransport' or 'oceant'
13% - 'Thermal' or 'th'
14% - 'Steadystate' or 'ss'
15% - 'Transient' or 'tr'
16% - 'Balancethickness' or 'mc'
17% - 'Balancethickness2'
18% - 'BalancethicknessSoft' or 'mcsoft'
19% - 'Balancevelocity' or 'bv'
20% - 'BedSlope' or 'bsl'
21% - 'SurfaceSlope' or 'ssl'
22% - 'Hydrology' or 'hy'
23% - 'DamageEvolution' or 'da'
24% - 'Gia' or 'gia'
25% - 'Love' or 'lv'
26% - 'Esa' or 'esa'
27% - 'Sampling' or 'smp'
28%
29% Extra options:
30% - loadonly : do not solve, only load results
31% - runtimename : true or false (default is true); makes name unique
32% - checkconsistency : 'yes' or 'no' (default is 'yes'); checks consistency of model
33% - restart : directory name (relative to the execution directory)
34% where the restart file is located
35%
36% Examples:
37% md=solve(md,'Stressbalance');
38% md=solve(md,'sb');
39
40if ~ischar(solutionstring)
41 error('ISSM''s solve function only accepts strings for solution sequences. Type help solve to get a list of supported solutions');
42end
43
44%recover and process solve options
45if strcmpi(solutionstring,'sb') || strcmpi(solutionstring,'Stressbalance')
46 solutionstring = 'StressbalanceSolution';
47elseif strcmpi(solutionstring,'mt') || strcmpi(solutionstring,'Masstransport')
48 solutionstring = 'MasstransportSolution';
49elseif strcmpi(solutionstring,'oceant') || strcmpi(solutionstring,'Oceantransport')
50 solutionstring = 'OceantransportSolution';
51elseif strcmpi(solutionstring,'th') || strcmpi(solutionstring,'Thermal')
52 solutionstring = 'ThermalSolution';
53elseif strcmpi(solutionstring,'ss') || strcmpi(solutionstring,'Steadystate')
54 solutionstring = 'SteadystateSolution';
55elseif strcmpi(solutionstring,'tr') || strcmpi(solutionstring,'Transient')
56 solutionstring = 'TransientSolution';
57elseif strcmpi(solutionstring,'mc') || strcmpi(solutionstring,'Balancethickness')
58 solutionstring = 'BalancethicknessSolution';
59elseif strcmpi(solutionstring,'Balancethickness2')
60 solutionstring = 'Balancethickness2Solution';
61elseif strcmpi(solutionstring,'mcsoft') || strcmpi(solutionstring,'BalancethicknessSoft')
62 solutionstring = 'BalancethicknessSoftSolution';
63elseif strcmpi(solutionstring,'bv') || strcmpi(solutionstring,'Balancevelocity')
64 solutionstring = 'BalancevelocitySolution';
65elseif strcmpi(solutionstring,'bsl') || strcmpi(solutionstring,'BedSlope')
66 solutionstring = 'BedSlopeSolution';
67elseif strcmpi(solutionstring,'ssl') || strcmpi(solutionstring,'SurfaceSlope')
68 solutionstring = 'SurfaceSlopeSolution';
69elseif strcmpi(solutionstring,'hy') || strcmpi(solutionstring,'Hydrology')
70 solutionstring = 'HydrologySolution';
71elseif strcmpi(solutionstring,'da') || strcmpi(solutionstring,'DamageEvolution')
72 solutionstring = 'DamageEvolutionSolution';
73elseif strcmpi(solutionstring,'gia') || strcmpi(solutionstring,'Gia')
74 solutionstring = 'GiaSolution';
75elseif strcmpi(solutionstring,'lv') || strcmpi(solutionstring,'Love')
76 solutionstring = 'LoveSolution';
77elseif strcmpi(solutionstring,'esa') || strcmpi(solutionstring,'Esa')
78 solutionstring = 'EsaSolution';
79elseif strcmpi(solutionstring,'smp') || strcmpi(solutionstring,'Sampling')
80 solutionstring = 'SamplingSolution';
81else
82 error(['solutionstring ' solutionstring ' not supported!']);
83end
84options=pairoptions(varargin{:},'solutionstring',solutionstring);
85
86%recover some fields
87md.private.solution=solutionstring;
88cluster=md.cluster;
89if strcmpi(getfieldvalue(options,'batch','no'),'yes')
90 batch=1;
91else
92 batch=0;
93end
94
95%check model consistency
96if strcmpi(getfieldvalue(options,'checkconsistency','yes'),'yes'),
97 if md.verbose.solution,
98 disp('checking model consistency');
99 end
100 ismodelselfconsistent(md),
101end
102
103%If we are restarting, actually use the provided runtime name:
104restart=getfieldvalue(options,'restart','');
105%First, build a runtime name that is unique
106if restart==1
107 %Leave the runtimename as is
108else
109 if ~isempty(restart),
110 md.private.runtimename=restart;
111 elseif getfieldvalue(options,'runtimename',true),
112 c=clock;
113 md.private.runtimename=sprintf('%s-%02i-%02i-%04i-%02i-%02i-%02i-%i',md.miscellaneous.name,c(2),c(3),c(1),c(4),c(5),floor(c(6)),feature('GetPid'));
114 else
115 md.private.runtimename=md.miscellaneous.name;
116 end
117end
118
119%if running QMU analysis, some preprocessing of Dakota files using model fields needs to be carried out.
120if md.qmu.isdakota,
121 md=preqmu(md,options);
122end
123
124%Do we load results only?
125if getfieldvalue(options,'loadonly',false),
126 md=loadresultsfromcluster(md);
127 return;
128end
129
130%Write all input files
131marshall(md); % bin file
132ToolkitsFile(md.toolkits,[md.miscellaneous.name '.toolkits']); % toolkits file
133BuildQueueScript(cluster,md.private.runtimename,md.miscellaneous.name,md.private.solution,md.settings.io_gather,md.debug.valgrind,md.debug.gprof,md.qmu.isdakota,md.transient.isoceancoupling); % queue file
134
135%Upload all required files
136modelname = md.miscellaneous.name;
137filelist = {[modelname '.bin'] [modelname '.toolkits']};
138if ispc,
139 filelist{end+1}=[modelname '.bat'];
140else
141 filelist{end+1}=[modelname '.queue'];
142end
143
144if md.qmu.isdakota,
145 filelist{end+1} = [modelname '.qmu.in'];
146end
147
148if isempty(restart),
149 UploadQueueJob(cluster,md.miscellaneous.name,md.private.runtimename,filelist);
150end
151
152%launch queue job:
153LaunchQueueJob(cluster,md.miscellaneous.name,md.private.runtimename,filelist,restart,batch);
154
155%return if batch:
156if batch,
157 if md.verbose.solution,
158 disp('batch mode requested: not launching job interactively');
159 disp('launch solution sequence on remote cluster by hand');
160 end
161 return;
162end
163
164%wait on lock
165if isnan(md.settings.waitonlock),
166 %load when user enters 'y'
167 disp('solution launched on remote cluster. log in to detect job completion.');
168 choice=input('Is the job successfully completed? (y/n)','s');
169 if ~strcmp(choice,'y'),
170 disp('Results not loaded... exiting');
171 else
172 md=loadresultsfromcluster(md);
173 end
174elseif md.settings.waitonlock>0,
175 %wait for done file
176 done=waitonlock(md);
177 if md.verbose.solution,
178 disp('loading results from cluster');
179 end
180 md=loadresultsfromcluster(md);
181elseif md.settings.waitonlock==0,
182 disp('Model results must be loaded manually with md=loadresultsfromcluster(md);');
183end
Note: See TracBrowser for help on using the repository browser.