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

Last change on this file since 22758 was 22758, checked in by Mathieu Morlighem, 7 years ago

merged trunk-jpl and trunk for revision 22757

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