Changeset 4134


Ignore:
Timestamp:
06/22/10 18:15:17 (15 years ago)
Author:
seroussi
Message:

start changing control_core

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  
    2525
    2626%initialize control parameters
    27 param_g=model.parameters.param_g;
     27param_g=femmodel.parameters.param_g;
    2828
    2929%set optimization options.
    30 options=ControlOptions(model.parameters);
     30options=ControlOptions(femmodel.parameters);
    3131
    32 for n=1:model.parameters.NSteps,
     32for n=1:nsteps,
    3333
    3434        %set options
    35         options=optimset(options,'MaxFunEvals',model.parameters.MaxIter(n));
     35        options=optimset(options,'MaxFunEvals',femmodel.parameters.MaxIter(n));
    3636
    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);
    3839
    3940        %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);
    4343        end
    4444
    45         %update inputs with new fit
    46         inputs=add(inputs,'fit',model.parameters.Fit(n),'double');
    47         inputs=add(inputs,model.parameters.ControlType,param_g,'doublevec',1,model.parameters.NumberOfNodes);
    48 
    4945        %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);
    5147
    5248        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);
    6850
    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;
    7957        end
    8058
    8159        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);
    8361
    8462        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;
    8664
    8765        displaystring(verbose,'\n%s',['      constraining the new distribution...']);
    88         param_g=ControlConstrain(param_g,model.parameters);
     66        param_g=ControlConstrain(param_g,femmodel.parameters);
    8967       
    9068        disp(['      value of misfit J after optimization #' num2str(n) ':' num2str(c(n).J)]);
    9169
    9270        %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;
    11174        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
    11481
    11582end
     
    11784%generate output
    11885displaystring(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;
     86if control_steady,
     87        femmodel=steadystate_core(femmodel);
    12788else
    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);
    13190end
    13291
    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
     93InputToResult(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,control_type);
     94femmodel.results.JEnum=J;
     95femmodel.results.ControlTypeEnum=EnumAsString(control_type);
    13896
    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
     97end %end function
Note: See TracChangeset for help on using the changeset viewer.