Changeset 5997


Ignore:
Timestamp:
09/23/10 14:59:06 (14 years ago)
Author:
Mathieu Morlighem
Message:

merged the two solvers

Location:
issm/trunk/src/c
Files:
2 deleted
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/Makefile.am

    r5989 r5997  
    11461146                                        ./solvers/solver_adjoint_linear.cpp\
    11471147                                        ./solvers/solver_diagnostic_nonlinear.cpp\
    1148                                         ./solvers/solver_diagnostic_nonlinear_kgg.cpp\
    1149                                         ./solvers/solver_diagnostic_nonlinear_kff.cpp\
    11501148                                        ./solvers/solver_thermal_nonlinear.cpp\
    11511149                                        ./modules/Bamgx/Bamgx.cpp\
  • issm/trunk/src/c/solvers/solver_diagnostic_nonlinear.cpp

    r5772 r5997  
    1212void solver_diagnostic_nonlinear(FemModel* femmodel,bool conserve_loads){
    1313
     14        /*intermediary: */
     15        Mat Kgg = NULL, Kff = NULL, Kfs   = NULL;
     16        Vec ug  = NULL, uf  = NULL, old_ug= NULL, old_uf = NULL;
     17        Vec pg  = NULL, pf  = NULL;
     18        Loads* loads=NULL;
     19        int converged;
     20        int constraints_converged;
     21        int num_unstable_constraints;
     22        int count;
     23
    1424        /*parameters:*/
     25        int  verbose=0;
    1526        bool kff=false;
     27        int min_mechanical_constraints;
     28        int max_nonlinear_iterations;
    1629
    1730        /*Recover parameters: */
     31        femmodel->parameters->FindParam(&verbose,VerboseEnum);
    1832        femmodel->parameters->FindParam(&kff,KffEnum);
     33        femmodel->parameters->FindParam(&min_mechanical_constraints,MinMechanicalConstraintsEnum);
     34        femmodel->parameters->FindParam(&max_nonlinear_iterations,MaxNonlinearIterationsEnum);
     35       
     36        /*Were loads requested as output? : */
     37        if(conserve_loads) loads=(Loads*)femmodel->loads->Copy(); //protect loads from being modified by the solution
     38        else               loads=(Loads*)femmodel->loads;         //modify loads  in this solution
    1939
    20         if(!kff) solver_diagnostic_nonlinear_kgg(femmodel,conserve_loads);
    21         else     solver_diagnostic_nonlinear_kff(femmodel,conserve_loads);
     40        count=1;
     41        converged=0;
    2242
     43        /*Start non-linear iteration using input velocity: */
     44        GetSolutionFromInputsx(&ug, femmodel->elements, femmodel->nodes, femmodel->vertices, loads, femmodel->materials, femmodel->parameters);
     45        Reducevectorgtofx(&uf, ug, femmodel->nodesets,femmodel->parameters);
     46
     47        //Update once again the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
     48        InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug);
     49
     50        for(;;){
     51
     52                //save pointer to old velocity
     53                VecFree(&old_ug);old_ug=ug;
     54                VecFree(&old_uf);old_uf=uf;
     55
     56                if(kff){
     57                        SystemMatricesx(NULL,&Kff, &Kfs, NULL,&pf, NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,loads,femmodel->materials,femmodel->parameters);
     58                        Reduceloadx(pf, Kfs, femmodel->ys, femmodel->parameters); MatFree(&Kfs);
     59                }
     60                else{
     61                        SystemMatricesx(&Kgg, NULL, NULL, &pg,NULL, NULL,femmodel->elements,femmodel->nodes,femmodel->vertices,loads,femmodel->materials,femmodel->parameters);
     62                        Reducematrixfromgtofx(&Kff,&Kfs,Kgg,femmodel->nodesets,femmodel->parameters); MatFree(&Kgg);
     63                        Reduceloadfromgtofx(&pf, pg, Kfs, femmodel->ys, femmodel->nodesets,femmodel->parameters); VecFree(&pg); MatFree(&Kfs);
     64                }
     65               
     66                Solverx(&uf, Kff, pf, old_uf, femmodel->parameters);
     67
     68                Mergesolutionfromftogx(&ug, uf,femmodel->ys,femmodel->nodesets,femmodel->parameters);
     69
     70                InputUpdateFromSolutionx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug);
     71
     72                PenaltyConstraintsx(&constraints_converged, &num_unstable_constraints, femmodel->elements,femmodel->nodes,femmodel->vertices,loads,femmodel->materials,femmodel->parameters);
     73                if(verbose)_printf_("   number of unstable constraints: %i\n",num_unstable_constraints);
     74
     75                convergence(&converged,Kff,pf,uf,old_uf,femmodel->parameters); MatFree(&Kff);VecFree(&pf);
     76               
     77                InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,converged,ConvergedEnum);
     78
     79                //rift convergence
     80                if (!constraints_converged) {
     81                        if (converged){
     82                                if (num_unstable_constraints <= min_mechanical_constraints) converged=1;
     83                                else converged=0;
     84                        }
     85                }
     86
     87                /*Increase count: */
     88                count++;
     89                if(converged==1)break;
     90                if(count>=max_nonlinear_iterations){
     91                        _printf_("   maximum number of iterations (%i) exceeded\n",max_nonlinear_iterations);
     92                        break;
     93                }
     94        }
     95
     96        /*clean-up*/
     97        if(conserve_loads) delete loads;
     98        VecFree(&uf);
     99        VecFree(&ug);
     100        VecFree(&old_uf);
     101        VecFree(&old_ug);
    23102}
  • issm/trunk/src/c/solvers/solvers.h

    r5772 r5997  
    1414void solver_thermal_nonlinear(FemModel* femmodel);
    1515void solver_diagnostic_nonlinear(FemModel* femmodel,bool conserve_loads);
    16 void solver_diagnostic_nonlinear_kgg(FemModel* femmodel,bool conserve_loads);
    17 void solver_diagnostic_nonlinear_kff(FemModel* femmodel,bool conserve_loads);
    1816void solver_linear(FemModel* femmodel);
    1917void solver_adjoint_linear(FemModel* femmodel);
Note: See TracChangeset for help on using the changeset viewer.