1 | /*!\file: solver_stokescoupling_nonlinear.cpp
|
---|
2 | * \brief: core of the coupling between stokes and macayealpattyn
|
---|
3 | */
|
---|
4 |
|
---|
5 | #include "../toolkits/toolkits.h"
|
---|
6 | #include "../objects/objects.h"
|
---|
7 | #include "../EnumDefinitions/EnumDefinitions.h"
|
---|
8 | #include "../io/io.h"
|
---|
9 | #include "../modules/modules.h"
|
---|
10 | #include "../solutions/solutions.h"
|
---|
11 | #include "./solvers.h"
|
---|
12 |
|
---|
13 | void solver_stokescoupling_nonlinear(FemModel* femmodel,bool conserve_loads){
|
---|
14 |
|
---|
15 | /*intermediary: */
|
---|
16 | Mat Kff_horiz = NULL, Kfs_horiz = NULL;
|
---|
17 | Vec ug_horiz = NULL, uf_horiz = NULL, old_uf_horiz = NULL;
|
---|
18 | Vec pf_horiz = NULL;
|
---|
19 | Vec df_horiz = NULL;
|
---|
20 | Mat Kff_vert = NULL, Kfs_vert = NULL;
|
---|
21 | Vec ug_vert = NULL, uf_vert = NULL;
|
---|
22 | Vec pf_vert = NULL;
|
---|
23 | Vec df_vert = NULL;
|
---|
24 | Vec ys = NULL;
|
---|
25 | bool converged;
|
---|
26 | int constraints_converged;
|
---|
27 | int num_unstable_constraints;
|
---|
28 | int count;
|
---|
29 |
|
---|
30 | /*parameters:*/
|
---|
31 | int min_mechanical_constraints;
|
---|
32 | int max_nonlinear_iterations;
|
---|
33 | int configuration_type;
|
---|
34 |
|
---|
35 | /*Recover parameters: */
|
---|
36 | femmodel->parameters->FindParam(&min_mechanical_constraints,DiagnosticRiftPenaltyThresholdEnum);
|
---|
37 | femmodel->parameters->FindParam(&max_nonlinear_iterations,DiagnosticMaxiterEnum);
|
---|
38 | UpdateConstraintsx(femmodel->nodes,femmodel->constraints,femmodel->parameters);
|
---|
39 |
|
---|
40 | count=1;
|
---|
41 | converged=false;
|
---|
42 |
|
---|
43 | /*First get ug_horiz:*/
|
---|
44 | femmodel->SetCurrentConfiguration(DiagnosticHorizAnalysisEnum);
|
---|
45 | GetSolutionFromInputsx(&ug_horiz, femmodel->elements, femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters);
|
---|
46 | Reducevectorgtofx(&uf_horiz, ug_horiz, femmodel->nodes,femmodel->parameters);
|
---|
47 |
|
---|
48 | for(;;){
|
---|
49 |
|
---|
50 | /*First diagnostic horiz:*/
|
---|
51 | femmodel->SetCurrentConfiguration(DiagnosticHorizAnalysisEnum);
|
---|
52 | femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
|
---|
53 |
|
---|
54 | //Update once again the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
|
---|
55 | InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug_horiz);
|
---|
56 | VecFree(&ug_horiz);
|
---|
57 |
|
---|
58 | //save pointer to old velocity
|
---|
59 | VecFree(&old_uf_horiz);old_uf_horiz=uf_horiz;
|
---|
60 |
|
---|
61 | /*solve: */
|
---|
62 | SystemMatricesx(&Kff_horiz, &Kfs_horiz, &pf_horiz, &df_horiz, NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
|
---|
63 | CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
|
---|
64 | Reduceloadx(pf_horiz, Kfs_horiz, ys); MatFree(&Kfs_horiz);
|
---|
65 | Solverx(&uf_horiz, Kff_horiz, pf_horiz, old_uf_horiz, df_horiz,femmodel->parameters);
|
---|
66 | Mergesolutionfromftogx(&ug_horiz, uf_horiz,ys,femmodel->nodes,femmodel->parameters); VecFree(&ys);
|
---|
67 | InputUpdateFromSolutionx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug_horiz);
|
---|
68 |
|
---|
69 | convergence(&converged,Kff_horiz,pf_horiz,uf_horiz,old_uf_horiz,femmodel->parameters); MatFree(&Kff_horiz);VecFree(&pf_horiz); VecFree(&df_horiz);
|
---|
70 |
|
---|
71 | /*Second compute vertical velocity: */
|
---|
72 | femmodel->SetCurrentConfiguration(DiagnosticVertAnalysisEnum);
|
---|
73 | femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
|
---|
74 |
|
---|
75 | /*solve: */
|
---|
76 | SystemMatricesx(&Kff_vert, &Kfs_vert, &pf_vert, &df_vert,NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
|
---|
77 | CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
|
---|
78 | Reduceloadx(pf_vert, Kfs_vert, ys); MatFree(&Kfs_vert);
|
---|
79 | Solverx(&uf_vert, Kff_vert, pf_vert, NULL, df_vert,femmodel->parameters); MatFree(&Kff_vert); VecFree(&pf_vert); VecFree(&df_vert);
|
---|
80 | Mergesolutionfromftogx(&ug_vert, uf_vert,ys,femmodel->nodes,femmodel->parameters);VecFree(&uf_vert); VecFree(&ys);
|
---|
81 | InputUpdateFromSolutionx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug_vert);
|
---|
82 | VecFree(&ug_vert); VecFree(&uf_vert);
|
---|
83 |
|
---|
84 | /*Increase count: */
|
---|
85 | count++;
|
---|
86 | if(converged==true)break;
|
---|
87 | if(count>=max_nonlinear_iterations){
|
---|
88 | _printf_(true," maximum number of iterations (%i) exceeded\n",max_nonlinear_iterations);
|
---|
89 | break;
|
---|
90 | }
|
---|
91 | }
|
---|
92 |
|
---|
93 | /*clean-up*/
|
---|
94 | VecFree(&old_uf_horiz);
|
---|
95 | VecFree(&uf_horiz);
|
---|
96 | VecFree(&ug_horiz);
|
---|
97 | VecFree(&ys);
|
---|
98 | }
|
---|