source: issm/trunk-jpl/src/c/solvers/solver_newton.cpp@ 14891

Last change on this file since 14891 was 14891, checked in by Eric.Larour, 12 years ago

CHG: replacing xdelete with delete. Gradual change. Nightlys seem to accomodate this change

File size: 4.3 KB
RevLine 
[11322]1/*!\file: solver_nonlinear.cpp
2 * \brief: core of a non-linear solution, using fixed-point method
3 */
4
5#include "../toolkits/toolkits.h"
[12832]6#include "../classes/objects/objects.h"
[11322]7#include "../io/io.h"
8#include "../EnumDefinitions/EnumDefinitions.h"
9#include "../modules/modules.h"
10#include "../solutions/solutions.h"
11#include "./solvers.h"
12
13void solver_newton(FemModel* femmodel){
14
15 /*intermediary: */
[11327]16 bool converged;
[14416]17 int count,newton;
[12477]18 IssmDouble kmax;
[13216]19 Matrix<IssmDouble>* Kff = NULL;
20 Matrix<IssmDouble>* Kfs = NULL;
21 Matrix<IssmDouble>* Jff = NULL;
22 Vector<IssmDouble>* ug = NULL;
23 Vector<IssmDouble>* old_ug = NULL;
24 Vector<IssmDouble>* uf = NULL;
25 Vector<IssmDouble>* old_uf = NULL;
26 Vector<IssmDouble>* duf = NULL;
27 Vector<IssmDouble>* pf = NULL;
28 Vector<IssmDouble>* pJf = NULL;
29 Vector<IssmDouble>* df = NULL;
30 Vector<IssmDouble>* ys = NULL;
[11322]31
32 /*parameters:*/
33 int max_nonlinear_iterations;
34 int configuration_type;
35
36 /*Recover parameters: */
37 femmodel->parameters->FindParam(&max_nonlinear_iterations,DiagnosticMaxiterEnum);
38 femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
[14416]39 femmodel->parameters->FindParam(&newton,DiagnosticIsnewtonEnum);
[13693]40 femmodel->UpdateConstraintsx();
[11322]41
42 count=1;
43 converged=false;
44
45 /*Start non-linear iteration using input velocity: */
46 GetSolutionFromInputsx(&ug,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
47 Reducevectorgtofx(&uf,ug,femmodel->nodes,femmodel->parameters);
48
49 //Update once again the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
50 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,converged,ConvergedEnum);
51 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug);
52
53 for(;;){
54
[14891]55 delete old_ug;old_ug=ug;
56 delete old_uf;old_uf=uf;
[11322]57
[11324]58 /*Solver forward model*/
[14416]59 if(count==1 || newton==2){
60 femmodel->SystemMatricesx(&Kff, &Kfs, &pf, &df, NULL);
61 CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
[14891]62 Reduceloadx(pf,Kfs,ys);delete Kfs;
63 Solverx(&uf,Kff,pf,old_uf,df,femmodel->parameters);delete df;
64 Mergesolutionfromftogx(&ug,uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
65 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug);delete ug;
66 delete old_ug;old_ug=ug;
67 delete old_uf;old_uf=uf;
[14416]68 }
69 uf=old_uf->Duplicate(); old_uf->Copy(uf);
70
71 /*Prepare next iteration using Newton's method*/
[14891]72 femmodel->SystemMatricesx(&Kff, &Kfs, &pf, &df, NULL);delete df;
[11322]73 CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
[14891]74 Reduceloadx(pf,Kfs,ys);delete Kfs;
[14416]75
76 pJf=pf->Duplicate();
[14891]77 Kff->MatMult(uf,pJf);// delete Kff);
78 pJf->Scale(-1.0); pJf->AXPY(pf,+1.0); //delete pf);
[14416]79
80 femmodel->CreateJacobianMatrixx(&Jff,kmax);
[14891]81 Solverx(&duf,Jff,pJf,NULL,NULL,femmodel->parameters); delete Jff; delete pJf;
82 uf->AXPY(duf, 1.0); delete duf;
83 Mergesolutionfromftogx(&ug,uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
[14416]84 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug);
[11322]85
[11324]86 /*Check convergence*/
87 convergence(&converged,Kff,pf,uf,old_uf,femmodel->parameters);
[14891]88 delete Kff; delete pf;
[12271]89 if(converged==true){
90 bool max_iteration_state=false;
91 int tempStep=1;
[12477]92 IssmDouble tempTime=1.0;
[13325]93 femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
[12271]94 break;
95 }
[11322]96 if(count>=max_nonlinear_iterations){
[12519]97 _pprintLine_(" maximum number of Newton iterations (" << max_nonlinear_iterations << ") exceeded");
[12271]98 bool max_iteration_state=true;
99 int tempStep=1;
[12477]100 IssmDouble tempTime=1.0;
[13325]101 femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
[11322]102 break;
103 }
[11324]104
[11332]105 count++;
[11322]106 }
107
[12515]108 if(VerboseConvergence()) _pprintLine_("\n total number of iterations: " << count-1);
[11322]109
110 /*clean-up*/
[14891]111 delete uf;
112 delete ug;
113 delete old_ug;
114 delete old_uf;
[11322]115}
Note: See TracBrowser for help on using the repository browser.