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

Last change on this file since 21729 was 21729, checked in by Mathieu Morlighem, 8 years ago

merged trunk-jpl and trunk for revision 21727

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