Changeset 5903


Ignore:
Timestamp:
09/20/10 10:13:52 (14 years ago)
Author:
Eric.Larour
Message:

New way of running the petsc solver, that provides more flexibilty.
We have a new petscoptions field in the model, that can be filled
with petsc options, instead of the solver_string, which disappers.
The petscoptins gets resolved into a petscrc string (for serial runs)
and a petsc.rc file (for parallel runs) at runtime. The petscrc string
acts the same way than the solver_string. But the petsc.rc file acts
in a different way. Itt is loaded at runtime, when first doing Petsc Initialize.
This allows tweaking and rerunning of the same deck, each time using different
options.

Location:
issm/trunk
Files:
2 added
1 deleted
22 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h

    r5803 r5903  
    365365        NodalEnum,
    366366        ResponseDescriptorsEnum,
    367         SolverStringEnum,
     367        PetscRcEnum,
    368368        SparsityEnum,
    369369        TolXEnum,
  • TabularUnified issm/trunk/src/c/EnumDefinitions/EnumToString.cpp

    r5803 r5903  
    327327                case NodalEnum : return "Nodal";
    328328                case ResponseDescriptorsEnum : return "ResponseDescriptors";
    329                 case SolverStringEnum : return "SolverString";
     329                case PetscRcEnum : return "PetscRc";
    330330                case SparsityEnum : return "Sparsity";
    331331                case TolXEnum : return "TolX";
  • TabularUnified issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp

    r5803 r5903  
    325325        else if (strcmp(name,"Nodal")==0) return NodalEnum;
    326326        else if (strcmp(name,"ResponseDescriptors")==0) return ResponseDescriptorsEnum;
    327         else if (strcmp(name,"SolverString")==0) return SolverStringEnum;
     327        else if (strcmp(name,"PetscRc")==0) return PetscRcEnum;
    328328        else if (strcmp(name,"Sparsity")==0) return SparsityEnum;
    329329        else if (strcmp(name,"TolX")==0) return TolXEnum;
  • TabularUnified issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r5772 r5903  
    6464        parameters->AddObject(new DoubleParam(ViscosityOvershootEnum,iomodel->viscosity_overshoot));
    6565        parameters->AddObject(new BoolParam(WaitOnLockEnum,iomodel->waitonlock));
    66         parameters->AddObject(new StringParam(SolverStringEnum,iomodel->solverstring));
     66        parameters->AddObject(new StringParam(PetscRcEnum,iomodel->petscrc));
    6767        parameters->AddObject(new IntParam(NumberOfElementsEnum,iomodel->numberofelements));
    6868        parameters->AddObject(new BoolParam(KffEnum,iomodel->kff));
  • TabularUnified issm/trunk/src/c/modules/Solverx/Solverx.cpp

    r5896 r5903  
    2727        PetscTruth flag;
    2828        int solver_type;
    29         char* solver_string=NULL;
     29        char* petscrc=NULL;
     30        bool  fromlocalsize=true;
     31
    3032
    3133        /*Display message*/
     
    4446        }
    4547        else{
    46                 MatGetLocalSize(Kff,&local_m,&local_n);uf=NewVec(local_n,true);
     48                MatGetLocalSize(Kff,&local_m,&local_n);uf=NewVec(local_n,fromlocalsize);
    4749        }
    4850
    49         /*Before preparing the solver, add options to the options database*/
    50         parameters->FindParam(&solver_string,SolverStringEnum);
    51         PetscOptionsInsertMultipleString(solver_string);
    5251
    53         /*Process solver_string to see if we are not using special types of external solvers: */
    54         PetscOptionsDetermineSolverType(&solver_type,solver_string);
     52        /*Process petscrc to see if we are not using special types of external solvers: */
     53        parameters->FindParam(&petscrc,PetscRcEnum);
     54        PetscOptionsDetermineSolverType(&solver_type,petscrc);
     55       
     56        /*In serial mode, we don't have a petsc.rc file to boot the Petsc options. Do it now
     57         * using the petscrc string recover in the parameters: */
     58        #ifdef _SERIAL_
     59                PetscOptionsInsertMultipleString(petscrc);
    5560
    56         #if _PETSC_VERSION_ == 2
    57         if (solver_type==MUMPSPACKAGE_LU){
    58                 /*Convert Kff to MATTAIJMUMPS: */
    59                 MatConvert(Kff,MATAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
    60         }
    61         if (solver_type==MUMPSPACKAGE_CHOL){
    62                 /*Convert Kff to MATTSBAIJMUMPS: */
    63                 MatConvert(Kff,MATSBAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
    64         }
    65         if (solver_type==SPOOLESPACKAGE_LU){
    66                 /*Convert Kff to MATTSBAIJMUMPS: */
    67                 MatConvert(Kff,MATAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
    68         }
    69         if (solver_type==SPOOLESPACKAGE_CHOL){
    70                 /*Convert Kff to MATTSBAIJMUMPS: */
    71                 MatConvert(Kff,MATSBAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
    72         }
    73         if (solver_type==SUPERLUDISTPACKAGE){
    74                 /*Convert Kff to MATTSBAIJMUMPS: */
    75                 MatConvert(Kff,MATSUPERLU_DIST,MAT_REUSE_MATRIX,&Kff);
    76         }
     61                /*In serial mode, matrices have been loaded at MPIAIJ or AIJ matrices.
     62                 * We need to convert them if we are going to run the solvers successfully: */
     63                #if _PETSC_VERSION_ == 2
     64                        if (solver_type==MUMPSPACKAGE_LU){
     65                                /*Convert Kff to MATTAIJMUMPS: */
     66                                MatConvert(Kff,MATAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
     67                        }
     68                        if (solver_type==MUMPSPACKAGE_CHOL){
     69                                /*Convert Kff to MATTSBAIJMUMPS: */
     70                                MatConvert(Kff,MATSBAIJMUMPS,MAT_REUSE_MATRIX,&Kff);
     71                        }
     72                        if (solver_type==SPOOLESPACKAGE_LU){
     73                                /*Convert Kff to MATTSBAIJMUMPS: */
     74                                MatConvert(Kff,MATAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
     75                        }
     76                        if (solver_type==SPOOLESPACKAGE_CHOL){
     77                                /*Convert Kff to MATTSBAIJMUMPS: */
     78                                MatConvert(Kff,MATSBAIJSPOOLES,MAT_REUSE_MATRIX,&Kff);
     79                        }
     80                        if (solver_type==SUPERLUDISTPACKAGE){
     81                                /*Convert Kff to MATTSBAIJMUMPS: */
     82                                MatConvert(Kff,MATSUPERLU_DIST,MAT_REUSE_MATRIX,&Kff);
     83                        }
     84                #endif
    7785        #endif
    7886
     
    8290        KSPSetFromOptions(ksp);
    8391
    84         #if _PETSC_VERSION_ == 3
    85         /*specific solver?: */
    86         KSPGetPC(ksp,&pc);
    87         if (solver_type==MUMPSPACKAGE_LU){
    88                 PCFactorSetMatSolverPackage(pc,MAT_SOLVER_MUMPS);
    89         }
     92        #ifdef _SERIAL_
     93                #if _PETSC_VERSION_ == 3
     94                /*specific solver?: */
     95                KSPGetPC(ksp,&pc);
     96                if (solver_type==MUMPSPACKAGE_LU){
     97                        PCFactorSetMatSolverPackage(pc,MAT_SOLVER_MUMPS);
     98                }
     99                #endif
    90100        #endif
    91101
     
    98108                }
    99109        }
     110
     111        /*Solve: */
    100112        KSPSolve(ksp,pf,uf);
    101113       
     
    106118        /*Free ressources:*/
    107119        KSPFree(&ksp);
    108         xfree((void**)&solver_string);
     120        xfree((void**)&petscrc);
    109121       
    110122        /*Assign output pointers:*/
  • TabularUnified issm/trunk/src/c/modules/SystemMatricesx/SystemMatricesx.cpp

    r5895 r5903  
    160160                }
    161161        }
    162        
     162
    163163        /*Assign output pointers: */
    164164        if(pKgg) *pKgg=Kgg;
  • TabularUnified issm/trunk/src/c/objects/IoModel.cpp

    r5772 r5903  
    4848                xfree((void**)&this->gridonpattyn);
    4949        }
    50         xfree((void**)&this->solverstring);
     50        xfree((void**)&this->petscrc);
    5151        xfree((void**)&this->elementonbed);
    5252        xfree((void**)&this->elementonsurface);
     
    182182        IoModelFetchData(&this->connectivity,iomodel_handle,"connectivity");
    183183        IoModelFetchData(&this->lowmem,iomodel_handle,"lowmem");
    184         IoModelFetchData(&this->solverstring,iomodel_handle,"solverstring");
     184        IoModelFetchData(&this->petscrc,iomodel_handle,"petscrc");
    185185        IoModelFetchData(&this->viscosity_overshoot,iomodel_handle,"viscosity_overshoot");
    186186        IoModelFetchData(&this->artdiff,iomodel_handle,"artificial_diffusivity");
     
    227227        this->control_analysis=0;
    228228        this->control_parameter=NULL;
    229         this->solverstring=NULL;
     229        this->petscrc=NULL;
    230230        this->numberofvariables=0;
    231231        this->numvariabledescriptors=0;
  • TabularUnified issm/trunk/src/c/objects/IoModel.h

    r5772 r5903  
    2222                int     qmu_analysis;
    2323                int     control_analysis;
    24                 char*   solverstring;
     24                char*   petscrc;
    2525
    2626                /*2d mesh: */
  • TabularUnified issm/trunk/src/c/solutions/issm.cpp

    r5471 r5903  
    4242
    4343        /*Initialize Petsc and get start time*/
    44         PetscInitialize(&argc,&argv,(char *)0,""); 
     44        PetscInitialize(&argc,&argv,"petsc.rc",""); 
    4545        MPI_Barrier(MPI_COMM_WORLD); start=MPI_Wtime();
    4646
  • TabularUnified issm/trunk/src/m/classes/@model/model.m

    r5772 r5903  
    270270
    271271        %PETSc and MATLAB solver string
    272         md.solverstring='';
    273         md.solver_type='';
     272        md.petscoptions=NaN;
     273        md.petscrc='';
    274274
    275275        %Analysis and sub_analysis
  • TabularUnified issm/trunk/src/m/classes/@model/setdefaultparameters.m

    r5772 r5903  
    250250md.alloc_cleanup=1;
    251251
    252 %the string of solverstring is used directly by PETSc to solve finite element
    253 %systems KU=F. By default, we use MUMPS solver
     252%set petsc options cell array, so that PETSC uses the correct solvers
    254253md=solversettomumps(md);
    255 
    256 %Ice solver: 'general' for Matlab's default solver (or 'lu' or 'sholesky')
    257 md.solver_type='general';
    258254
    259255%solution speed-up
  • TabularUnified issm/trunk/src/m/enum/EnumToString.m

    r5804 r5903  
    322322case NodalEnum(), string='Nodal'; return
    323323case ResponseDescriptorsEnum(), string='ResponseDescriptors'; return
    324 case SolverStringEnum(), string='SolverString'; return
     324case PetscRcEnum(), string='PetscRc'; return
    325325case SparsityEnum(), string='Sparsity'; return
    326326case TolXEnum(), string='TolX'; return
  • TabularUnified issm/trunk/src/m/enum/StringToEnum.m

    r5804 r5903  
    320320                        elseif (strcmpi(name,'Nodal')), enum=NodalEnum(); return
    321321                        elseif (strcmpi(name,'ResponseDescriptors')), enum=ResponseDescriptorsEnum(); return
    322                         elseif (strcmpi(name,'SolverString')), enum=SolverStringEnum(); return
     322                        elseif (strcmpi(name,'PetscRc')), enum=PetscRcEnum(); return
    323323                        elseif (strcmpi(name,'Sparsity')), enum=SparsityEnum(); return
    324324                        elseif (strcmpi(name,'TolX')), enum=TolXEnum(); return
  • TabularUnified issm/trunk/src/m/model/marshall.m

    r5772 r5903  
    134134WriteData(fid,md.lowmem,'Integer','lowmem');
    135135WriteData(fid,md.optscal,'Mat','optscal');
    136 WriteData(fid,md.solverstring,'String','solverstring');
     136WriteData(fid,md.petscrc,'String','petscrc');
    137137WriteData(fid,md.viscosity_overshoot,'Scalar','viscosity_overshoot');
    138138WriteData(fid,md.stokesreconditioning,'Scalar','stokesreconditioning');
  • TabularUnified issm/trunk/src/m/model/presolve.m

    r2382 r5903  
    3333        count=count+numpairsforthisrift;
    3434end
     35
     36%deal with petsc options
     37md.petscrc=PetscOptions2PetscRc(md.petscoptions,'petsc.rc');
  • TabularUnified issm/trunk/src/m/model/queue/LaunchQueueJob.m

    r5615 r5903  
    2222       
    2323        %compress the files into one zip.
    24         compressstring=['tar -zcf ' md.runtimename '.tar.gz ' md.name '.bin ' md.name '.queue '];
     24        compressstring=['tar -zcf ' md.runtimename '.tar.gz ' md.name '.bin ' md.name '.queue petsc.rc'];
    2525        if md.qmu_analysis,
    2626                compressstring=[compressstring md.name '.qmu.in'];
  • TabularUnified issm/trunk/src/m/model/solvers/solversettoasm.m

    r5894 r5903  
    55%      md=solversettoasm(md)
    66
    7 %md.solverstring=' -mat_type aij -ksp_type cgs -pc_type asm -sub_mat_type mumps -sub_pc_type lu -pc_asm_overlap 4 -pc_factor_shift_positive_definite true';
    8 %md.solverstring=' -mat_type aij -ksp_type cgs -pc_type asm -sub_pc_type lu -pc_asm_overlap 4 ';
    9 md.solverstring=' -mat_type aij -ksp_type gmres -pc_type asm -sub_pc_type lu -pc_asm_overlap 4 ';
     7%md.petscoptions={{'mat_type','aij'},{'ksp_type','cgs'},{'pc_type','asm'},{sub_mat_type','mumps'},{'sub_pc_type','lu'},{'pc_asm_overlap',4},{'pc_factor_shift_positive_definite','true'}};
     8%md.petscoptions={{'mat_type','aij'},{'ksp_type','cgs'},{'pc_type','asm'},{'sub_pc_type','lu'},{'pc_asm_overlap',4}};
     9md.petscoptions={{'mat_type','aij'},{'ksp_type','gmres'},{'pc_type','asm'},{'sub_pc_type','lu'},{'pc_asm_overlap',4}};
  • TabularUnified issm/trunk/src/m/model/solvers/solversettomatlab.m

    r5894 r5903  
    55%      md=solversettomatlab(md)
    66
    7 md.solverstring='-ksp_type matlab';
     7md.petscoptions={{'ksp_type','matlab'}};
  • TabularUnified issm/trunk/src/m/model/solvers/solversettomumps.m

    r5894 r5903  
    55%      md=solversettomumps(md)
    66
    7 md.solverstring='-mat_type aijmumps -ksp_type preonly -pc_type lu -mat_mumps_icntl_14 120 -pc_factor_shift_positive_definite true';
    8 
    9 %optional
    10 %md.solverstring=[md.solverstring ' -mat_mumps_icntl_14 40 -mat_mumps_icntl_4 0 -mat_mumps_sym 1 -mat_ignore_lower_triangular'];
     7md.petscoptions={{'mat_type','aijmumps'},{'ksp_type','preonly'},{'pc_type','lu'},{'mat_mumps_icntl_14',120},{'pc_factor_shift_positive_definite','true'}};
  • TabularUnified issm/trunk/src/m/model/solvers/solversettosor.m

    r5894 r5903  
    55%      md=solversettosor(md)
    66
    7 md.mat_type='aij';
    8 md.ksp_type='cg';
    9 md.pc_type='sor';
    10 md.solver_extra_option=' -pc_sor_omega 1.1 -pc_sor_its 2 ';
     7md.petscoptions={{'mat_type','aij'},{'ksp_type','cg'},{'pc_type','sor'},{'pc_sor_omega',1.1},{pc_sor_its',2}};
  • TabularUnified issm/trunk/src/mex/Solver/Solver.cpp

    r5698 r5903  
    1212        Vec         uf0           = NULL;
    1313        Vec         uf            = NULL;
    14         char       *solver_string = NULL;
     14        char       *petscrc = NULL;
    1515        Parameters *parameters    = NULL;
    1616        int         verbose;
     
    2727        /*First, check solver string: */
    2828        FetchParams(&parameters,PARAMETERS);
    29         parameters->FindParam(&solver_string,SolverStringEnum);
     29        parameters->FindParam(&petscrc,PetscRcEnum);
    3030        int verbose; parameters->FindParam(&verbose,VerboseEnum);
    3131       
    3232        /*Fetch rest of data only if not running the matlab solver: */
    33         if (strcmp(solver_string,matlabstring)!=0){
     33        if (strcmp(petscrc,matlabstring)!=0){
    3434                /*Input datasets: */
    3535                FetchData(&Kff,KFF);
     
    5555        VecFree(&uf);
    5656        delete parameters;
    57         xfree((void**)&solver_string);
     57        xfree((void**)&petscrc);
    5858
    5959        MODULEEND();
  • TabularUnified issm/trunk/test/NightlyRun/test104.m

    r5098 r5903  
    55md=setelementstype(md,'macayeal','all');
    66md.cluster=oshostname;
     7md.verbose=1;
    78md=solve(md,'analysis_type',DiagnosticSolutionEnum);
    89
Note: See TracChangeset for help on using the changeset viewer.