Changeset 980
- Timestamp:
- 06/13/09 11:21:49 (16 years ago)
- Location:
- issm/trunk/src/m/solutions/cielo
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/m/solutions/cielo/control.m
r773 r980 5 5 6 6 %Build all models requested for control simulation 7 models.analysis_type='control'; 7 8 md.analysis_type='control'; 8 9 md.sub_analysis_type=''; 9 m =CreateFemModel(md);10 models.dh=CreateFemModel(md); 10 11 11 12 % figure out number of dof: just for information purposes. 12 md.dof=m .nodesets.fsize; %biggest dof number13 md.dof=modelsize(models); 13 14 14 15 %initialize control parameters, gradients and observations 15 u_g_obs=m .parameters.u_g_obs;16 u_g=m .parameters.u_g;17 param_g=m .parameters.param_g;18 grad_g=zeros(m .nodesets.gsize,1);16 u_g_obs=models.dh.parameters.u_g_obs; 17 u_g=models.dh.parameters.u_g; 18 param_g=models.dh.parameters.param_g; 19 grad_g=zeros(models.dh.nodesets.gsize,1); 19 20 20 21 %set optimization options. 21 options=ControlOptions(m .parameters);22 options=ControlOptions(models.dh.parameters); 22 23 23 %initialize inputs, ie m .nparameters on which we invert.24 %initialize inputs, ie models.dh.nparameters on which we invert. 24 25 inputs=inputlist; 25 inputs=add(inputs,m .parameters.control_type,param_g,'doublevec',2,m.parameters.numberofnodes);26 inputs=add(inputs,'velocity',u_g,'doublevec',3,m .parameters.numberofnodes);26 inputs=add(inputs,models.dh.parameters.control_type,param_g,'doublevec',2,models.dh.parameters.numberofnodes); 27 inputs=add(inputs,'velocity',u_g,'doublevec',3,models.dh.parameters.numberofnodes); 27 28 28 for n=1:m .parameters.nsteps,29 for n=1:models.dh.parameters.nsteps, 29 30 30 31 %set options 31 options=optimset(options,'MaxFunEvals',m .parameters.maxiter(n));32 options=optimset(options,'MaxFunEvals',models.dh.parameters.maxiter(n)); 32 33 33 disp(sprintf('\n%s%s%s%s\n',[' control method step ' num2str(n) '/' num2str(m .parameters.nsteps)]));34 disp(sprintf('\n%s%s%s%s\n',[' control method step ' num2str(n) '/' num2str(models.dh.parameters.nsteps)])); 34 35 35 36 %update inputs with new fit 36 inputs=add(inputs,'fit',m .parameters.fit(n),'double');37 inputs=add(inputs,m .parameters.control_type,param_g,'doublevec',2,m.parameters.numberofnodes);37 inputs=add(inputs,'fit',models.dh.parameters.fit(n),'double'); 38 inputs=add(inputs,models.dh.parameters.control_type,param_g,'doublevec',2,models.dh.parameters.numberofnodes); 38 39 39 40 %Update inputs in datasets 40 [m .elements,m.nodes,m.loads,m.materials]=UpdateFromInputs(m.elements,m.nodes,m.loads,m.materials,inputs);41 [models.dh.elements,models.dh.nodes,models.dh.loads,models.dh.materials]=UpdateFromInputs(models.dh.elements,models.dh.nodes,models.dh.loads,models.dh.materials,inputs); 41 42 42 43 disp(' computing gradJ...'); 43 [u_g c(n).grad_g]=GradJCompute(m ,inputs,u_g_obs,md.analysis_type,md.sub_analysis_type);44 inputs=add(inputs,'velocity',u_g,'doublevec',2,m .parameters.numberofnodes);44 [u_g c(n).grad_g]=GradJCompute(models.dh,inputs,u_g_obs,md.analysis_type,md.sub_analysis_type); 45 inputs=add(inputs,'velocity',u_g,'doublevec',2,models.dh.parameters.numberofnodes); 45 46 disp(' done.'); 46 47 … … 54 55 55 56 %visualize direction. 56 if m .parameters.plot57 if models.dh.parameters.plot 57 58 plot_direction; 58 59 end 59 60 60 61 disp(' optimizing along gradient direction...'); 61 [search_scalar c(n).J]=ControlOptimization('objectivefunctionC',0,1,options,m ,inputs,param_g,u_g_obs,c(n).grad_g,n,md.analysis_type,md.sub_analysis_type);62 [search_scalar c(n).J]=ControlOptimization('objectivefunctionC',0,1,options,models.dh,inputs,param_g,u_g_obs,c(n).grad_g,n,md.analysis_type,md.sub_analysis_type); 62 63 disp(' done.'); 63 64 64 65 disp(' updating parameter using optimized search scalar...'); 65 param_g=param_g+search_scalar*m .parameters.optscal(n)*c(n).grad_g;66 param_g=param_g+search_scalar*models.dh.parameters.optscal(n)*c(n).grad_g; 66 67 disp(' done.'); 67 68 68 69 disp(' constraining the new distribution...'); 69 param_g=ControlConstrain(param_g,m .parameters);70 param_g=ControlConstrain(param_g,models.dh.parameters); 70 71 disp(' done.'); 71 72 72 73 %visualize direction. 73 if m .parameters.plot,74 if models.dh.parameters.plot, 74 75 plot_newdistribution; 75 76 end … … 77 78 %some temporary saving 78 79 if(mod(n,5)==0), 79 solution=controlfinalsol(c,m ,param_g,inputs,md.analysis_type,md.sub_analysis_type);80 solution=controlfinalsol(c,models.dh,param_g,inputs,md.analysis_type,md.sub_analysis_type); 80 81 save temporary_control_results solution 81 82 end … … 86 87 %Create final solution 87 88 disp(' preparing final velocity solution...'); 88 solution=controlfinalsol(c,m,param_g,inputs,md.analysis_type,md.sub_analysis_type);89 results=controlfinalsol(c,models.dh,param_g,inputs,md.analysis_type,md.sub_analysis_type); 89 90 disp(' done.'); 90 91 91 92 disp(' load results ontol model...'); 92 md=loadcontrolfinalsol(md,solution); 93 if ~isstruct(md.results), md.results=struct(); end 94 md.results.control=processresults(models,results); 93 95 disp(' done.'); 94 96 -
issm/trunk/src/m/solutions/cielo/controlfinalsol.m
r465 r980 1 function solution=controlfinalsol(c,m,p_g,inputs,analysis_type,sub_analysis_type); 1 function results=controlfinalsol(c,m,param_g,inputs,analysis_type,sub_analysis_type); 2 3 %initialize results 4 results.time=0; 5 results.step=1; 2 6 3 7 %From parameters, build inputs for icediagnostic_core, using the final parameters 4 inputs=add(inputs,m.parameters.control_type,p_g,'doublevec',2,m.parameters.numberofnodes); 5 u_g=diagnostic_core_nonlinear(m,inputs,analysis_type,sub_analysis_type); 6 7 %Build partitioning vectors to recover solution 8 indx=[1:2:m.nodesets.gsize]; 9 indy=[2:2:m.nodesets.gsize]; 10 11 %Recover velocity, and parameters, in the correct partitioning. 12 vx=u_g(indx); 13 vy=u_g(indy); 14 vel=sqrt(vx.^2+vy.^2); 15 parameter=p_g(indx); 8 inputs=add(inputs,m.parameters.control_type,param_g,'doublevec',2,m.parameters.numberofnodes); 9 results.u_g=diagnostic_core_nonlinear(m,inputs,analysis_type,sub_analysis_type); 16 10 17 11 %Recover misfit at each iteration of the control method … … 20 14 J(i)=c(i).J; 21 15 end 16 results.J=J; 22 17 23 %Store in solution 24 solution.vx=vx; 25 solution.vy=vy; 26 solution.vel=vel; 27 solution.J=J; 28 solution.parameter=parameter; 18 %store param_g 19 results.param_g=param_g; -
issm/trunk/src/m/solutions/cielo/processresults.m
r972 r980 26 26 isstokes=m_ds.parameters.isstokes; 27 27 end 28 if strcmpi(analysis_type,'control'), 29 m_dh=models.dh; 30 31 %some flags needed 32 dim=m_dh.parameters.dim; 33 ishutter=m_dh.parameters.ishutter; 34 ismacayealpattyn=m_dh.parameters.ismacayealpattyn; 35 isstokes=m_dh.parameters.isstokes; 36 end 28 37 if (strcmpi(analysis_type,'thermal') | strcmpi(analysis_type,'transient')), 29 38 m_m=models.m; … … 43 52 44 53 u_g=results(i).u_g; 45 yts=m_d s.parameters.yts;54 yts=m_dh.parameters.yts; 46 55 47 56 if dim==2,
Note:
See TracChangeset
for help on using the changeset viewer.