Changeset 22558


Ignore:
Timestamp:
03/18/18 14:28:54 (7 years ago)
Author:
Mathieu Morlighem
Message:

CHG: better handling of toolkits, now remove option toolkit from options so that mkl does not get confused

Location:
issm/trunk-jpl/src/c
Files:
11 edited

Legend:

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

    r22471 r22558  
    572572
    573573/*Methods relating to parameters: */
    574 char* OptionsFromAnalysis(Parameters* parameters,int analysis_type){ /*{{{*/
     574char* OptionsFromAnalysis(char** pouttoolkit,Parameters* parameters,int analysis_type){ /*{{{*/
    575575
    576576        /* figure out ISSM options for current analysis, return a string. */
    577577
    578578        /*output: */
    579         char*   outstring=NULL;
     579        char *outstring  = NULL;
     580        char *outtoolkit = NULL;
    580581
    581582        /*intermediary: */
    582583        int          dummy;
    583         IssmDouble  *analyses    = NULL;
     584        int         *analyses    = NULL;
    584585        char       **strings     = NULL;
    585586        char        *string      = NULL;
     587        char       **toolkits    = NULL;
     588        char        *toolkit     = NULL;
    586589        int          numanalyses;
    587590        int          found       = -1;
    588591        int          i;
    589592
    590         numanalyses=0;
    591593        parameters->FindParam(&strings,&numanalyses,ToolkitsOptionsStringsEnum);
    592 
    593         parameters->FindParam(&analyses,&dummy,ToolkitsOptionsAnalysesEnum);
     594        parameters->FindParam(&toolkits,&dummy,ToolkitsTypesEnum); _assert_(dummy==numanalyses);
     595        parameters->FindParam(&analyses,&dummy,ToolkitsOptionsAnalysesEnum); _assert_(dummy==numanalyses);
    594596
    595597        if(numanalyses==0)return NULL; //we did not find petsc options, don't bother.
     
    611613                }
    612614        }
    613         if (found==-1){
     615        if(found==-1){
    614616                _error_("could find neither a default analysis nor analysis " << EnumToStringx(analysis_type));
    615617        }
    616618
    617         /*ok, grab the option string: */
     619        /*1. Grab the option toolkit: */
     620        outtoolkit=xNew<char>(strlen(toolkits[found])+1);
     621        strcpy(outtoolkit,toolkits[found]);
     622        *pouttoolkit = outtoolkit;
     623
     624        /*2. Grab the option string: */
    618625        outstring=xNew<char>(strlen(strings[found])+1);
    619626        strcpy(outstring,strings[found]);
    620627
    621628        /*Free ressources*/
    622         xDelete<IssmDouble>(analyses);
    623629        for(i=0;i<numanalyses;i++){
    624                 string=strings[i];
    625                 xDelete<char>(string);
    626         }
     630                xDelete<char>(toolkits[i]);
     631                xDelete<char>(strings[i]);
     632        }
     633        xDelete<char*>(toolkits);
    627634        xDelete<char*>(strings);
     635        xDelete<int>(analyses);
    628636        return outstring;
    629637}
     
    638646         */
    639647
    640         char* options=NULL;
     648        char* options = NULL;
     649        char* toolkit = NULL;
    641650
    642651        /*Recover first the options string for this analysis: */
    643         options=OptionsFromAnalysis(parameters,analysis_type);
     652        options=OptionsFromAnalysis(&toolkit,parameters,analysis_type);
    644653
    645654        /*Initialize our Toolkit Options: */
    646         ToolkitOptions::Init(options);
     655        ToolkitOptions::Init(toolkit,options);
    647656
    648657        #ifdef _HAVE_PETSC_
     
    672681
    673682        xDelete<char>(options);
     683        xDelete<char>(toolkit);
    674684}
    675685/*}}}*/
  • issm/trunk-jpl/src/c/main/globals.h

    r19714 r22558  
    1616 * database if we use Petsc. Can also be used to characterize the ISSM toolkit,
    1717 * often used when Petsc is not allowed*/
     18char* ToolkitOptions::toolkittype;
    1819char* ToolkitOptions::toolkitoptions;
    1920#endif
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Autodiff/CreateParametersAutodiff.cpp

    r20698 r22558  
    2121        int         num_indices;
    2222        char* options=NULL;
     23        char* toolkit=NULL;
    2324
    2425        IssmDouble* xp=NULL;
     
    3536
    3637                /*Solver pointers depend on what type of solver we are implementing: */
    37                 options=OptionsFromAnalysis(parameters,DefaultAnalysisEnum); //options database is not filled in yet, use default.
    38                 ToolkitOptions::Init(options);
     38                options=OptionsFromAnalysis(&toolkit,parameters,DefaultAnalysisEnum);
     39                ToolkitOptions::Init(toolkit,options);
    3940
    4041                switch(IssmSolverTypeFromToolkitOptions()){
  • issm/trunk-jpl/src/c/modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp

    r15838 r22558  
    1919void ParseToolkitsOptionsx(Parameters* parameters,FILE* fid){
    2020
    21         char line [1000];
     21        char line[1000];
     22        char word1[1000];
     23        char word2[1000];
    2224        int my_rank;
    2325        int i;
    2426
    2527        /*intermediary: */
    26         IssmDouble* analyses=NULL;
    27         char** strings=NULL;
    28         int numanalyses;
    29         char* string=NULL;
    30         char* newstring=NULL;
    31         char* catstring=NULL;
    32         int   stringlength;
     28        int         *analyses     = NULL;
     29        char       **strings      = NULL;
     30        char        *string       = NULL;
     31        char       **toolkits     = NULL;
     32        char        *toolkit      = NULL;
     33        char        *newstring    = NULL;
     34        char        *catstring    = NULL;
     35        int          numanalyses;
     36        int          stringlength,toolkitlength;
    3337
    3438        /*Get my_rank:*/
     
    3943                /*Now, go through lines and figure out how many analyses we have: */
    4044                numanalyses=0;
    41                 while ( fgets(line, sizeof line, fid) ){
     45                while(fgets(line, sizeof line, fid)){
    4246                        /*skip comments and empty lines: */
    43                         if ((line[0]=='%') || (line[0]=='\n') || (line[0]==' ') || (line[0]=='\t') || (line[0]=='\r'))continue;
     47                        if ((line[0]=='%') || (line[0]=='\n') || (line[0]==' ') || (line[0]=='\t') || (line[0]=='\r')) continue;
    4448                        /*ok, first time, we should get an analysis enum, starting with a +: */
    45                         if (line[0]=='+')numanalyses++;
    46                         else continue;
     49                        if (line[0]=='+'){
     50                                numanalyses++;
     51                        }
     52                        else{
     53                                continue;
     54                        }
    4755                }
    4856
    4957                /*Now, allocate analyses and strings: */
    50                 analyses=xNew<IssmDouble>(numanalyses);
    51                 strings=xNew<char*>(numanalyses);
    52                 for(i=0;i<numanalyses;i++)strings[i]=NULL;
     58                analyses = xNew<int>(numanalyses);
     59                strings  = xNew<char*>(numanalyses);
     60                toolkits = xNew<char*>(numanalyses);
     61                for(i=0;i<numanalyses;i++) strings[i]  = NULL;
     62                for(i=0;i<numanalyses;i++) toolkits[i] = NULL;
    5363
    5464                /*Go back to beginning of file:*/
    5565                fseek(fid,0,SEEK_SET);
    5666                numanalyses=0;
    57                 while ( fgets(line, sizeof line, fid) ){
     67                while( fgets(line, sizeof line, fid)){
    5868
    5969                        /*skip comments and empty lines: */
     
    6373                        line[strlen(line)-1]='\0';
    6474
    65                         if (line[0]=='+'){ /*this is the analysis line: */
     75                        if(line[0]=='+'){ /*this is the analysis line: */
    6676                                analyses[numanalyses]=StringToEnumx(&line[1]);  //skip the '+'
    6777                                numanalyses++;
     78                                /*Now get toolkit (should be following line)*/
     79                                if(!fgets(line, sizeof line, fid)) _error_("could not read toolkit for analysis " << &line[1]);
     80                                sscanf(line,"-%s %s",&word1[0],&word2[0]);
     81                                if(strcmp(word1,"toolkit")!=0) _error_("toolkit option does not follow analysis");
     82                                toolkit=xNew<char>((strlen(word2)+1));
     83                                xMemCpy<char>(toolkit,word2,(strlen(word2)+1));
     84                                toolkits[numanalyses-1]=toolkit;
     85                                continue;
    6886                        }
    69                         else{ /*this is an option corresponding to analysis numanalyses-1. Add it
    70                         to the already existing options*/
     87                        else{
     88                                /*this is an option corresponding to analysis numanalyses-1. Add it to the already existing options*/
    7189                                if(strings[numanalyses-1]==NULL){
    7290                                        string=xNew<char>((strlen(line)+1));
     
    97115        ISSM_MPI_Bcast(&numanalyses,1,ISSM_MPI_INT,0,IssmComm::GetComm());
    98116        if(my_rank!=0){
    99                 analyses=xNew<IssmDouble>(numanalyses);
    100                 strings=xNew<char*>(numanalyses);
     117                analyses  = xNew<int>(numanalyses);
     118                toolkits  = xNew<char*>(numanalyses);
     119                strings   = xNew<char*>(numanalyses);
    101120        }
    102         ISSM_MPI_Bcast(analyses,numanalyses,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
     121        ISSM_MPI_Bcast(analyses,numanalyses,ISSM_MPI_INT,0,IssmComm::GetComm());
    103122        for(i=0;i<numanalyses;i++){
     123                char* toolkit=toolkits[i];
     124                if(my_rank==0){
     125                        if(toolkit==NULL) _error_("PETSc options for analysis " << EnumToStringx(reCast<int>(analyses[i])) << " have been declared but were not found");
     126                }
     127                if(my_rank==0)toolkitlength=(strlen(toolkit)+1)*sizeof(char);
     128                ISSM_MPI_Bcast(&toolkitlength,1,ISSM_MPI_INT,0,IssmComm::GetComm());
     129                if(my_rank!=0)toolkit=xNew<char>(toolkitlength);
     130                ISSM_MPI_Bcast(toolkit,toolkitlength,ISSM_MPI_CHAR,0,IssmComm::GetComm());
     131                if(my_rank!=0)toolkits[i]=toolkit;
     132
    104133                char* string=strings[i];
    105134                if(my_rank==0){
     
    115144        /*Ok, out of strings and analyses and numanalyses, create parameters, and plug them into parameters container: */
    116145        parameters->AddObject(new StringArrayParam(ToolkitsOptionsStringsEnum,strings,numanalyses));
    117         parameters->AddObject(new DoubleVecParam(ToolkitsOptionsAnalysesEnum,analyses,numanalyses));
     146        parameters->AddObject(new StringArrayParam(ToolkitsTypesEnum,toolkits,numanalyses));
     147        parameters->AddObject(new IntVecParam(ToolkitsOptionsAnalysesEnum,analyses,numanalyses));
    118148
    119149        /*Clean up and return*/
    120150        for(i=0;i<numanalyses;i++) xDelete<char>(strings[i]);
     151        for(i=0;i<numanalyses;i++) xDelete<char>(toolkits[i]);
    121152        xDelete<char*>(strings);
    122         xDelete<IssmDouble>(analyses);
     153        xDelete<char*>(toolkits);
     154        xDelete<int>(analyses);
    123155        return;
    124156}
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r22539 r22558  
    809809        LockFileNameEnum,
    810810        RestartFileNameEnum,
     811        ToolkitsTypesEnum,
    811812        ToolkitsOptionsAnalysesEnum,
    812813        ToolkitsOptionsStringsEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r22539 r22558  
    797797                case LockFileNameEnum : return "LockFileName";
    798798                case RestartFileNameEnum : return "RestartFileName";
     799                case ToolkitsTypesEnum : return "ToolkitsTypes";
    799800                case ToolkitsOptionsAnalysesEnum : return "ToolkitsOptionsAnalyses";
    800801                case ToolkitsOptionsStringsEnum : return "ToolkitsOptionsStrings";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r22539 r22558  
    815815              else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum;
    816816              else if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum;
     817              else if (strcmp(name,"ToolkitsTypes")==0) return ToolkitsTypesEnum;
    817818              else if (strcmp(name,"ToolkitsOptionsAnalyses")==0) return ToolkitsOptionsAnalysesEnum;
    818819              else if (strcmp(name,"ToolkitsOptionsStrings")==0) return ToolkitsOptionsStringsEnum;
     
    874875              else if (strcmp(name,"SealevelriseTransitions")==0) return SealevelriseTransitionsEnum;
    875876              else if (strcmp(name,"SealevelriseRequestedOutputs")==0) return SealevelriseRequestedOutputsEnum;
    876               else if (strcmp(name,"SealevelriseNumRequestedOutputs")==0) return SealevelriseNumRequestedOutputsEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"LoveNfreq")==0) return LoveNfreqEnum;
     880              if (strcmp(name,"SealevelriseNumRequestedOutputs")==0) return SealevelriseNumRequestedOutputsEnum;
     881              else if (strcmp(name,"LoveNfreq")==0) return LoveNfreqEnum;
    881882              else if (strcmp(name,"LoveFrequencies")==0) return LoveFrequenciesEnum;
    882883              else if (strcmp(name,"LoveShNmax")==0) return LoveShNmaxEnum;
     
    997998              else if (strcmp(name,"SegInput")==0) return SegInputEnum;
    998999              else if (strcmp(name,"Tria")==0) return TriaEnum;
    999               else if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"Tetra")==0) return TetraEnum;
     1003              if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
     1004              else if (strcmp(name,"Tetra")==0) return TetraEnum;
    10041005              else if (strcmp(name,"TetraInput")==0) return TetraInputEnum;
    10051006              else if (strcmp(name,"Penta")==0) return PentaEnum;
     
    11201121              else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
    11211122              else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
    1122               else if (strcmp(name,"P1xP4")==0) return P1xP4Enum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
     1126              if (strcmp(name,"P1xP4")==0) return P1xP4Enum;
     1127              else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
    11271128              else if (strcmp(name,"P1P1")==0) return P1P1Enum;
    11281129              else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
  • issm/trunk-jpl/src/c/toolkits/ToolkitOptions.cpp

    r15728 r22558  
    99#include "../shared/MemOps/MemOps.h"
    1010
    11 void ToolkitOptions::Init(char* options){ /*{{{*/
     11void  ToolkitOptions::Init(const char* toolkit_in,const char* options){ /*{{{*/
    1212
    1313        /*First, avoid a leak: */
    1414        xDelete<char>(toolkitoptions);
     15        xDelete<char>(toolkittype);
    1516
    1617        /*copy options into toolkitoptions:*/
     18        _assert_(toolkit_in);
    1719        _assert_(options);
    18         toolkitoptions= xNew<char>(strlen(options)+1);
    19         sprintf(toolkitoptions,   "%s",options);
    20 
     20        toolkittype = xNew<char>(strlen(toolkit_in)+1);
     21        sprintf(toolkittype,"%s",toolkit_in);
     22        toolkitoptions = xNew<char>(strlen(options)+1);
     23        sprintf(toolkitoptions,"%s",options);
    2124}/*}}}*/
    2225char* ToolkitOptions::GetToolkitType(){  /*{{{*/
    2326
    24         /*Look for token: -toolkit, and return value:*/
    25 
    26         return TokenValue(toolkitoptions,"toolkit");
    27 
     27        _assert_(toolkittype);
     28        char* toolkittype_out = xNew<char>(strlen(toolkittype)+1);
     29        sprintf(toolkittype_out,"%s",toolkittype);
     30        return toolkittype_out;
    2831}/*}}}*/
    2932char* ToolkitOptions::GetToolkitOptionValue(const char* option){  /*{{{*/
  • issm/trunk-jpl/src/c/toolkits/ToolkitOptions.h

    r15728 r22558  
    1111
    1212        private:
     13                static char* toolkittype;
    1314                static char* toolkitoptions;
    1415
    1516        public:
    16                 static void Init(char* options);
     17                static void Init(const char* type_in,const char* options);
    1718                static char* GetToolkitType(void);
    1819                static char* GetToolkitOptionValue(const char* option);
  • issm/trunk-jpl/src/c/toolkits/objects/Matrix.h

    r18063 r22558  
    127127                void InitCheckAndSetType(void){/*{{{*/
    128128
    129                         char* toolkittype=NULL;
    130 
    131129                        #ifdef _HAVE_PETSC_
    132130                        pmatrix=NULL;
     
    135133
    136134                        /*retrieve toolkittype: */
    137                         toolkittype=ToolkitOptions::GetToolkitType();
     135                        char* toolkittype=ToolkitOptions::GetToolkitType();
    138136
    139137                        /*set matrix type: */
     
    149147                                type=IssmMatType;
    150148                        }
    151                         else _error_("unknow toolkit type ");
     149                        else{
     150                                _error_("unknow toolkit type ");
     151                        }
    152152
    153153                        /*Free ressources: */
  • issm/trunk-jpl/src/c/toolkits/objects/Vector.h

    r19977 r22558  
    9898                void InitCheckAndSetType(void){ /*{{{*/
    9999
    100                         char* toolkittype=NULL;
    101 
    102100                        #ifdef _HAVE_PETSC_
    103101                        pvector=NULL;
     
    106104
    107105                        /*retrieve toolkittype: */
    108                         toolkittype=ToolkitOptions::GetToolkitType();
     106                        char* toolkittype=ToolkitOptions::GetToolkitType();
     107                        _assert_(toolkittype);
    109108
    110109                        /*set vector type: */
    111                         if (strcmp(toolkittype,"petsc")==0){
     110                        if(strcmp(toolkittype,"petsc")==0){
    112111                                #ifdef _HAVE_PETSC_
    113112                                type=PetscVecType;
     
    120119                                type=IssmVecType;
    121120                        }
    122                         else _error_("unknow toolkit type ");
     121                        else{
     122                                _error_("unknow toolkit type ");
     123                        }
    123124
    124125                        /*Free ressources: */
Note: See TracChangeset for help on using the changeset viewer.