Changeset 16142


Ignore:
Timestamp:
09/16/13 22:05:45 (12 years ago)
Author:
Eric.Larour
Message:

CHG: added new type of matrix solver type, which allows us to make run time decisions
on the type of package we use to solve our matrix systems.

Location:
issm/trunk-jpl
Files:
2 added
16 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r16141 r16142  
    189189        /*Open input file on cpu 0: */
    190190        if(my_rank==0) IOMODEL = pfopen0(inputfilename ,"rb");
     191       
     192        /*Open toolkits file: */
     193        toolkitsoptionsfid=pfopen(toolkitsfilename,"r");
    191194
    192195        /*Initialize internal data: */
     
    203206
    204207        /*create datasets for all analyses*/
    205         ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,IOMODEL,rootpath,this->solution_type,nummodels,analyses);
     208        ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,IOMODEL,toolkitsoptionsfid,rootpath,this->solution_type,nummodels,analyses);
    206209
    207210        /*do the post-processing of the datasets to get an FemModel that can actually run analyses: */
     
    227230        }
    228231
    229         /*Close input file descriptors: */
     232        /*Close input file and toolkits file descriptors: */
    230233        if(my_rank==0) pfclose(IOMODEL,inputfilename);
     234        pfclose(toolkitsoptionsfid,toolkitsfilename);
    231235
    232236        /*Open output file once for all and add output file name and file descriptor to parameters*/
     
    238242        this->parameters->AddObject(new StringParam(LockFileNameEnum,lockfilename));
    239243
    240         /*Now, deal with toolkits options, which need to be put into the parameters dataset: */
    241         toolkitsoptionsfid=pfopen(toolkitsfilename,"r");
    242         ParseToolkitsOptionsx(this->parameters,toolkitsoptionsfid);
    243         pfclose(toolkitsoptionsfid,toolkitsfilename);
    244 }
     244        }
    245245/*}}}*/
    246246/*FUNCTION FemModel::OutputResults {{{*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp

    r16141 r16142  
    2121        int*        indices=NULL;
    2222        int         num_indices;
     23        char* options=NULL;
    2324
    2425        IssmDouble* xp=NULL;
     
    116117                /*initialize a placeholder to store solver pointers: {{{*/
    117118                GenericParam<Adolc_edf> *theAdolcEDF_p=new GenericParam<Adolc_edf>(AdolcParamEnum);
    118                 #ifdef _HAVE_GSL_
    119                 theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p=reg_ext_fct(EDF_for_solverx);
    120                 #endif
    121                 #ifdef _HAVE_MUMPS_
    122                 theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p=reg_ext_fct(mumpsSolveEDF);
    123                 #endif
     119
     120                /*Solver pointers depend on what type of solver we are implementing: */
     121                options=OptionsFromAnalysis(parameters,DefaultAnalysisEnum); //options database is not filled in yet, use default.
     122                ToolkitOptions::Init(options);
     123
     124                switch(IssmSolverTypeFromToolkitOptions()){
     125                        case MumpsEnum:{
     126                                #ifdef _HAVE_MUMPS_
     127                                theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p=reg_ext_fct(mumpsSolveEDF);
     128                                #else
     129                                _error_("requesting mumps solver without MUMPS being compiled in!");
     130                                #endif
     131                                break;
     132                                                        }
     133                        case GslEnum: {
     134                                #ifdef _HAVE_GSL_
     135                                theAdolcEDF_p->GetParameterValue().myEDF_for_solverx_p=reg_ext_fct(EDF_for_solverx);
     136                                #endif
     137                            break;
     138                                                  }
     139                        default:
     140                                _error_("solver type not supported yet!");
     141                }
     142
    124143                // to save some space:
    125144                // we know we won't use adolc inside of  the solver:
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateDataSets.cpp

    r16007 r16142  
    1414#include "./ModelProcessorx.h"
    1515
    16 void CreateDataSets(Elements** pelements,Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads,Parameters** pparameters,IoModel* iomodel,char* rootpath,const int solution_type,const int analysis_type,const int nummodels,int analysis_counter){
     16void CreateDataSets(Elements** pelements,Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads,Parameters** pparameters,IoModel* iomodel,FILE* toolkitfile,char* rootpath,const int solution_type,const int analysis_type,const int nummodels,int analysis_counter){
    1717
    1818        Elements   *elements   = NULL;
     
    178178
    179179        /*Generate objects that are not dependent on any analysis_type: */
    180         CreateParameters(pparameters,iomodel,rootpath,solution_type,analysis_type,analysis_counter);
     180        CreateParameters(pparameters,iomodel,rootpath,toolkitfile,solution_type,analysis_type,analysis_counter);
    181181
    182182        /*Update Elements in case we are running a transient solution: */
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r15877 r16142  
    1313#include "../../shared/shared.h"
    1414#include "../MeshPartitionx/MeshPartitionx.h"
     15#include "../ParseToolkitsOptionsx/ParseToolkitsOptionsx.h"
    1516#include "./ModelProcessorx.h"
    1617
    17 void CreateParameters(Parameters** pparameters,IoModel* iomodel,char* rootpath,const int solution_type,int analysis_type,int analysis_counter){
     18void CreateParameters(Parameters** pparameters,IoModel* iomodel,char* rootpath,FILE* toolkitsoptionsfid,const int solution_type,int analysis_type,int analysis_counter){
    1819
    1920        int         i,j,m,k;
     
    244245        CreateParametersDakota(&parameters,iomodel,rootpath,solution_type,analysis_type);
    245246        #endif
     247       
     248        /*Now, deal with toolkits options, which need to be put into the parameters dataset: */
     249        ParseToolkitsOptionsx(parameters,toolkitsoptionsfid);
    246250
    247251        #ifdef _HAVE_ADOLC_
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.cpp

    r15771 r16142  
    1313#include "./ModelProcessorx.h"
    1414
    15 void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters, FILE* IOMODEL,char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_list){
     15void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters, FILE* IOMODEL,FILE* toolkitfile, char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_list){
    1616
    1717        int   i,analysis_type,verbose;
     
    6565
    6666                if(VerboseMProcessor()) _printf0_("   creating datasets for analysis " << EnumToStringx(analysis_type) << "\n");
    67                 CreateDataSets(&elements,&nodes,&vertices,&materials,&constraints,&loads,&parameters,iomodel,rootpath,solution_type,analysis_type,nummodels,i);
     67                CreateDataSets(&elements,&nodes,&vertices,&materials,&constraints,&loads,&parameters,iomodel,toolkitfile,rootpath,solution_type,analysis_type,nummodels,i);
    6868        }
    6969        if(VerboseMProcessor()) _printf0_("   done with model processor \n");
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h

    r16007 r16142  
    1010#include "../../classes/classes.h"
    1111
    12 void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters, FILE* iomodel_handle,char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_listh);
     12void ModelProcessorx(Elements** pelements, Nodes** pnodes, Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads, Parameters** pparameters, FILE* iomodel_handle,FILE* toolkitfile, char* rootpath,const int solution_type,const int nummodels,const int* analysis_type_listh);
    1313
    1414/*Creation of fem datasets: general drivers*/
    15 void CreateDataSets(Elements** pelements,Nodes** pnodes,Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads,Parameters** pparameters,IoModel* iomodel,char* rootpath,const int solution_type,int analysis_type,const int nummodels,int analysis_counter);
     15void CreateDataSets(Elements** pelements,Nodes** pnodes,Vertices** pvertices, Materials** pmaterials, Constraints** pconstraints, Loads** ploads,Parameters** pparameters,IoModel* iomodel,FILE* toolkitfile,char* rootpath,const int solution_type,int analysis_type,const int nummodels,int analysis_counter);
    1616void CreateElementsVerticesAndMaterials(Elements** pelements,Vertices** pvertices,Materials** pmaterials, IoModel* iomodel,const int nummodels);
    17 void CreateParameters(Parameters** pparameters,IoModel* iomodel,char* rootpath,const int solution_type,int analysis_type,int analysis_counter);
     17void CreateParameters(Parameters** pparameters,IoModel* iomodel,char* rootpath,FILE* toolkitfile,const int solution_type,int analysis_type,int analysis_counter);
    1818void CreateParametersAutodiff(Parameters** pparameters,IoModel* iomodel,int solution_type,int analysis_type);
    1919void CreateParametersControl(Parameters** pparameters,IoModel* iomodel,int solution_type,int analysis_type);
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r16026 r16142  
    608608        SeqEnum,
    609609        MpiEnum,
     610        MumpsEnum,
     611        GslEnum,
    610612        /*}}}*/
    611613        /*Options{{{*/
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r16029 r16142  
    582582                case SeqEnum : return "Seq";
    583583                case MpiEnum : return "Mpi";
     584                case MumpsEnum : return "Mumps";
     585                case GslEnum : return "Gsl";
    584586                case OptionEnum : return "Option";
    585587                case GenericOptionEnum : return "GenericOption";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r16030 r16142  
    594594              else if (strcmp(name,"Seq")==0) return SeqEnum;
    595595              else if (strcmp(name,"Mpi")==0) return MpiEnum;
     596              else if (strcmp(name,"Mumps")==0) return MumpsEnum;
     597              else if (strcmp(name,"Gsl")==0) return GslEnum;
    596598              else if (strcmp(name,"Option")==0) return OptionEnum;
    597599              else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
  • issm/trunk-jpl/src/c/toolkits/issm/IssmMpiDenseMat.h

    r16070 r16142  
    513513                        pf=(IssmMpiVec<IssmDouble>*)pfin;
    514514
    515                         /*Initialize output: */
    516                         uf=pf->Duplicate();
    517 
    518                         /*Let's try and use the MUMPS solver here: */
    519                         #ifdef _HAVE_MUMPS_
    520                         MpiDenseMumpsSolve(/*output*/ uf->vector,uf->M,uf->m, /*stiffness matrix:*/ this->matrix,this->M,this->N,this->m, /*right hand side load vector: */ pf->vector,pf->M,pf->m,parameters);
    521                         #else
    522                         _error_("IssmMpiDenseMat solver requires MUMPS solver");
    523                         #endif
    524                         return (IssmAbsVec<IssmDouble>*)uf;
     515                                               
     516                        switch(IssmSolverTypeFromToolkitOptions()){
     517                                case MumpsEnum: {
     518                                        /*Initialize output: */
     519                                        uf=pf->Duplicate();
     520                                        #ifdef _HAVE_MUMPS_
     521                                        MpiDenseMumpsSolve(/*output*/ uf->vector,uf->M,uf->m, /*stiffness matrix:*/ this->matrix,this->M,this->N,this->m, /*right hand side load vector: */ pf->vector,pf->M,pf->m,parameters);
     522                                        #else
     523                                        _error_("IssmMpiDenseMat solver requires MUMPS solver");
     524                                        #endif
     525                                        return (IssmAbsVec<IssmDouble>*)uf;
     526                                        break;
     527                                                                }
     528                                case GslEnum: {
     529
     530                                        IssmDouble* x=NULL;
     531                                        #ifdef _HAVE_GSL_
     532
     533                                        DenseGslSolve(/*output*/ &x,/*stiffness matrix:*/ this->matrix,this->M,this->N, /*right hand side load vector: */ pf->vector,pf->M,parameters);
     534
     535                                        uf=new IssmMpiVec<IssmDouble>(x,this->N); xDelete(x);
     536
     537                                        return (IssmAbsVec<IssmDouble>*)uf;
     538                                        break;
     539                                        #else
     540                                        _error_("GSL support not compiled in!");
     541                                        #endif
     542                                                          }
     543                                default:
     544                                        _error_("solver type not supported yet!");
     545                        }
    525546
    526547                }/*}}}*/
  • issm/trunk-jpl/src/c/toolkits/issm/IssmToolkitUtils.cpp

    r15839 r16142  
    3636        mat_type=ToolkitOptions::GetToolkitOptionValue("mat_type");
    3737
    38         if ((strcmp(mat_type,"mpidense")==0) || (strcmp(mat_type,"dense")==0)){
    39                 if (isparallel) mat_type_enum=MpiDenseEnum;
     38        if (strcmp(mat_type,"mpidense")==0){
     39                mat_type_enum=MpiDenseEnum;
     40        }
     41        else if (strcmp(mat_type,"dense")==0){
     42                if (isparallel) _error_("Dense matrix type not supported for parallel runs with num_procs>1");
    4043                else mat_type_enum=DenseEnum;
    4144        }
     
    6265         *we try and stick with the Petsc vector types: */
    6366        vec_type=ToolkitOptions::GetToolkitOptionValue("vec_type");
    64 
    65         if ((strcmp(vec_type,"mpi")==0) || (strcmp(vec_type,"seq")==0)){
    66                 if (isparallel) vec_type_enum=MpiEnum;
     67       
     68        if (strcmp(vec_type,"mpi")==0){
     69                vec_type_enum=MpiEnum;
     70        }
     71        else if (strcmp(vec_type,"seq")==0){
     72                if (isparallel) _error_("Dense vector type not supported for parallel runs with num_procs>1");
    6773                else vec_type_enum=SeqEnum;
    6874        }
     
    7581        return vec_type_enum;
    7682} /*}}}*/ 
     83int IssmSolverTypeFromToolkitOptions(void){ /*{{{*/
     84
     85        char* solver_type=NULL;
     86        int   solver_type_enum;
     87        int   num_procs=0;
     88        bool  isparallel=false;
     89
     90        /*first, figure out if we are running in parallel: */
     91        num_procs=IssmComm::GetSize();
     92        if(num_procs>1)isparallel=true;
     93
     94        /*retrieve solver type as a string, from the Toolkits Options database, similar to what Petsc does. Actually,
     95         *we try and stick with the Petsc vector types: */
     96        solver_type=ToolkitOptions::GetToolkitOptionValue("solver_type");
     97
     98        if (strcmp(solver_type,"mumps")==0){
     99                solver_type_enum=MumpsEnum;
     100        }
     101        else if (strcmp(solver_type,"gsl")==0){
     102                if (isparallel) _error_("Gsl solver type not supported for parallel runs with num_procs>1");
     103                else solver_type_enum=GslEnum;
     104        }
     105        else _error_("solver type not supported yet!");
     106
     107        /*free ressources: */
     108        xDelete<char>(solver_type);
     109
     110        /*return: */
     111        return solver_type_enum;
     112} /*}}}*/ 
  • issm/trunk-jpl/src/c/toolkits/issm/IssmToolkitUtils.h

    r14656 r16142  
    1818int IssmMatTypeFromToolkitOptions(void);
    1919int IssmVecTypeFromToolkitOptions(void);
     20int IssmSolverTypeFromToolkitOptions(void);
    2021
    2122#endif //#ifndef _ISSMMAT_H_
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r16028 r16142  
    574574def SeqEnum(): return StringToEnum("Seq")[0]
    575575def MpiEnum(): return StringToEnum("Mpi")[0]
     576def MumpsEnum(): return StringToEnum("Mumps")[0]
     577def GslEnum(): return StringToEnum("Gsl")[0]
    576578def OptionEnum(): return StringToEnum("Option")[0]
    577579def GenericOptionEnum(): return StringToEnum("GenericOption")[0]
  • issm/trunk-jpl/src/m/solvers/issmsolver.m

    r14728 r16142  
    1313issmoptions.mat_type=getfieldvalue(options,'mat_type','mpidense');
    1414issmoptions.vec_type=getfieldvalue(options,'vec_type','mpi');
     15issmoptions.solver_type=getfieldvalue(options,'solver_type','mumps');
  • issm/trunk-jpl/src/m/solvers/issmsolver.py

    r15907 r16142  
    99        arguments=pairoptions(*args)
    1010       
    11         options=[['toolkit','issm'],['mat_type','mpidense'],['vec_type','mpi']];
     11        options=[['toolkit','issm'],['mat_type','mpidense'],['vec_type','mpi'],['solver_type','mumps']];
    1212
    1313        #now, go through our arguments, and write over default options.
  • issm/trunk-jpl/test/NightlyRun/testad.m

    r16141 r16142  
    11%test reverse scalar vs forward vectorial drivers in ADOLC, using the test3009 setup, equivalent to test109 setup.
    2 md=triangle(model(),'../Exp/Square.exp',100000.);
     2md=triangle(model(),'../Exp/Square.exp',500000.);
    33md=setmask(md,'all','');
    44md=parameterize(md,'../Par/SquareShelfConstrained.par');
    55md=setflowequation(md,'SSA','all');
    6 md.cluster=generic('name',oshostname(),'np',1);
     6md.cluster=generic('name',oshostname(),'np',2);
    77%md.debug.valgrind=true;
    88%md.verbose=verbose('11111111')
    99md.toolkits.DefaultAnalysis=issmsolver();
     10%md.toolkits.DefaultAnalysis.solver_type='gsl';
    1011
    1112md.autodiff.isautodiff=true;
Note: See TracChangeset for help on using the changeset viewer.