Changeset 4134
- Timestamp:
- 06/22/10 18:15:17 (15 years ago)
- Location:
- issm/trunk/src/m/solutions
- Files:
-
- 2 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/m/solutions/control_core.m
r4131 r4134 25 25 26 26 %initialize control parameters 27 param_g= model.parameters.param_g;27 param_g=femmodel.parameters.param_g; 28 28 29 29 %set optimization options. 30 options=ControlOptions( model.parameters);30 options=ControlOptions(femmodel.parameters); 31 31 32 for n=1: model.parameters.NSteps,32 for n=1:nsteps, 33 33 34 34 %set options 35 options=optimset(options,'MaxFunEvals', model.parameters.MaxIter(n));35 options=optimset(options,'MaxFunEvals',femmodel.parameters.MaxIter(n)); 36 36 37 disp(sprintf('\n%s%s%s%s\n',[' control method step ' num2str(n) '/' num2str(model.parameters.NSteps)])); 37 disp(sprintf('\n%s%s%s%s\n',[' control method step ' num2str(n) '/' num2str(femmodel.parameters.NSteps)])); 38 [femmodel.elements,femmodel.loads]=InputUpdateFromConstant(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,fit(n),FitEnum); 38 39 39 40 %In case we are running a steady state control method, compute new temperature field using new parameter distribution: 40 if model.parameters.ControlSteady; 41 steadystate_results=steadystate_core(models); t_g=steadystate_results.t_g; 42 inputs=add(inputs,'temperature',t_g,'doublevec',1,model.parameters.NumberOfNodes); 41 if control_steady; 42 femmodel=steadystate_core(femmodel); 43 43 end 44 44 45 %update inputs with new fit46 inputs=add(inputs,'fit',model.parameters.Fit(n),'double');47 inputs=add(inputs,model.parameters.ControlType,param_g,'doublevec',1,model.parameters.NumberOfNodes);48 49 45 %Update inputs in datasets 50 [ model.elements,model.nodes,model.vertices,model.loads,model.materials,model.parameters]=UpdateFromInputs(model.elements,model.nodes,model.vertices,model.loads,model.materials,model.parameters);46 [femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters]=UpdateFromInputs(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters); 51 47 52 48 displaystring(verbose,'\n%s',[' computing gradJ...']); 53 results_grad=gradjcompute_core(models); 54 u_g=results_grad.u_g; c(n).grad_g=results_grad.grad_g; 55 if dim==3, 56 if isstokes, 57 inputs=add(inputs,'velocity',u_g,'doublevec',4,model.parameters.NumberOfNodes); 58 else 59 if model.parameters.ControlSteady; 60 inputs=add(inputs,'velocity',u_g,'doublevec',3,model.parameters.NumberOfNodes); 61 else 62 inputs=add(inputs,'velocity',u_g,'doublevec',2,model.parameters.NumberOfNodes); 63 end 64 end 65 else 66 inputs=add(inputs,'velocity',u_g,'doublevec',2,model.parameters.NumberOfNodes); 67 end 49 femmodel=gradient_core(femmodel); 68 50 69 if n>=2 & search_scalar==0, 70 displaystring(verbose,'\n%s',[' normalizing directions...']); 71 c(n).grad_g=Orth(c(n).grad_g,c(n-1).grad_g); 72 else 73 c(n).grad_g=Orth(c(n).grad_g,{}); 74 end 75 76 %visualize direction. 77 if model.parameters.Plot 78 plot_direction; 51 %Return gradient if asked 52 if cm_gradient, 53 InputToResult(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel.parameters,GradientEnum); 54 %%%%%%%%%%%%%%%%%%%%%% PROBLEM MUST GO TO THE END (SEE PARALLEL) 55 error 56 break; 79 57 end 80 58 81 59 displaystring(verbose,'\n%s',[' optimizing along gradient direction...']); 82 [search_scalar c(n).J]=ControlOptimization('objectivefunctionC',0,1,options, models,param_g,c(n).grad_g,n,model.parameters);60 [search_scalar c(n).J]=ControlOptimization('objectivefunctionC',0,1,options,femmodel,param_g,c(n).grad_g,n,femmodel.parameters); 83 61 84 62 displaystring(verbose,'\n%s',[' updating parameter using optimized search scalar...']); 85 param_g=param_g+search_scalar* model.parameters.Optscal(n)*c(n).grad_g;63 param_g=param_g+search_scalar*femmodel.parameters.Optscal(n)*c(n).grad_g; 86 64 87 65 displaystring(verbose,'\n%s',[' constraining the new distribution...']); 88 param_g=ControlConstrain(param_g, model.parameters);66 param_g=ControlConstrain(param_g,femmodel.parameters); 89 67 90 68 disp([' value of misfit J after optimization #' num2str(n) ':' num2str(c(n).J)]); 91 69 92 70 %Has convergence been reached? 93 convergence=0; 94 if ~isnan(eps_cm), 95 i=n-2; 96 %go through the previous misfits(starting from n-2) 97 while (i>=1), 98 if (fit(i)==fit(n)), 99 %convergence test only if we have the same misfits 100 if ((c(i).J-c(n).J)/c(n).J <= eps_cm), 101 %convergence if convergence criteria fullfilled 102 convergence=1; 103 displaystring(verbose,'\n%s%g%s%g\n',' Convergence criterion: dJ/J = ',(c(i).J-c(n).J)/c(n).J,'<',eps_cm); 104 else 105 displaystring(verbose,'\n%s%g%s%g\n',' Convergence criterion: dJ/J = ',(c(i).J-c(n).J)/c(n).J,'>',eps_cm); 106 end 107 break; 108 end 109 i=i-1; 110 end 71 converged=controlconvergence(J,fit,eps_cm,n); 72 if converged, 73 break; 111 74 end 112 %stop if convergence has been reached 113 if (convergence), break; end 75 76 %Temporary saving every five iterations 77 if mod(n+1,5)==0; 78 displaystring(verbose,'\n%s',[' saving temporary results...']); 79 controlrestart(femmmodel,J); 80 end 114 81 115 82 end … … 117 84 %generate output 118 85 displaystring(verbose,'\n%s',[' preparing final velocity solution...']); 119 120 %compute final velocity from diagnostic_core (horiz+vertical) 121 if model.parameters.ControlSteady; 122 inputs=add(inputs,model.parameters.ControlType,param_g,'doublevec',1,model.parameters.NumberOfNodes); 123 steadystate_results=steadystate_core(models); t_g=steadystate_results.t_g; 124 u_g=steadystate_results.u_g; 125 t_g=steadystate_results.t_g; 126 m_g=steadystate_results.m_g; 86 if control_steady, 87 femmodel=steadystate_core(femmodel); 127 88 else 128 inputs=add(inputs,model.parameters.ControlType,param_g,'doublevec',1,model.parameters.NumberOfNodes); 129 results_diag=diagnostic_core(models); 130 u_g=results_diag.u_g; 89 femmodel=diagnostic_core(femmodel); 131 90 end 132 91 133 %Recover misfit at each iteration of the control method 134 J=zeros(length(c),1); 135 for i=1:length(c), 136 J(i)=c(i).J; 137 end 92 %Some results not computed by diagnostic or steadystate 93 InputToResult(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type); 94 femmodel.results.JEnum=J; 95 femmodel.results.ControlTypeEnum=EnumAsString(control_type); 138 96 139 %build results 140 results.time=0; 141 results.step=1; 142 results.J=J; 143 results.param_g=param_g; 144 results.u_g=u_g; 145 if model.parameters.ControlSteady, 146 results.t_g=t_g; 147 results.m_g=m_g; 148 end 97 end %end function
Note:
See TracChangeset
for help on using the changeset viewer.