Changeset 22612


Ignore:
Timestamp:
03/22/18 15:38:35 (7 years ago)
Author:
erobo
Message:

CHG/ADD: adding Cfgradcoeff class and making other code work for adolc

Location:
issm/trunk-jpl/src/c
Files:
2 added
13 edited

Legend:

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

    r22580 r22612  
    7777                                        ./classes/Misfit.cpp\
    7878                                        ./classes/Cfsurfacesquare.cpp\
     79                                        ./classes/Cfdragcoeffabsgrad.cpp\
    7980                                        ./classes/Cfsurfacelogvel.cpp\
    8081                                        ./classes/Regionaloutput.cpp\
  • issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp

    r22507 r22612  
    3333        this->datatime=0.;
    3434        this->timepassedflag = false;
     35        this->last_time=0.;
    3536
    3637}
     
    105106         /*recover time parameters: */
    106107         femmodel->parameters->FindParam(&time,TimeEnum);
    107 
    108 /*ELLEN UNFINISHED*/
     108         if(time < last_time) timepassedflag = false;
     109         last_time = time;
     110
    109111                 int i;
    110112                 IssmDouble J=0.;
  • issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.h

    r22507 r22612  
    33 */
    44
    5 #ifndef _CFSURFACESQUARE_H_
    6 #define _CFSURFACESQUARE_H_
     5#ifndef _CFSURFACELOGVEL_H_
     6#define _CFSURFACELOGVEL_H_
    77
    88/*Headers:*/
     
    2121                IssmDouble      datatime;
    2222                bool                    timepassedflag;
     23                IssmDouble      last_time;
    2324               
    2425                int         lock; // if lock is on, we just return the value stored in "misfit".  this is used so we don't compute misfit past the final_time
     
    4445                IssmDouble Cfsurfacelogvel_Calculation(Element* element, int definitionenum);
    4546};
    46 #endif  /* _CFSURFACESQUARE_H_ */
     47#endif  /* _CFSURFACELOGVEL_H_ */
  • issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp

    r22517 r22612  
    3636        this->datatime=0.;
    3737        this->timepassedflag = false;
     38        this->last_time = 0.;
    3839
    3940}
     
    108109/*}}}*/
    109110IssmDouble Cfsurfacesquare::Response(FemModel* femmodel){/*{{{*/
    110                  
    111111         /*diverse: */
    112112         IssmDouble time;
     
    114114         /*recover time parameters: */
    115115         femmodel->parameters->FindParam(&time,TimeEnum);
     116         if(time < last_time) timepassedflag = false;
     117         last_time = time;
    116118
    117119                 int i;
    118120                 IssmDouble J=0.;
    119121                 IssmDouble J_sum=0.;
     122
    120123         if(datatime<=time && !timepassedflag){
    121124                 for(i=0;i<femmodel->elements->Size();i++){
     
    130133                 timepassedflag = true;
    131134                 return J;
    132                 }
     135        }
    133136         else return J;
    134137 }
  • issm/trunk-jpl/src/c/classes/Cfsurfacesquare.h

    r22507 r22612  
    33 */
    44
    5 #ifndef _TIMEMISFIT_H_
    6 #define _TIMEMISFIT_H_
     5#ifndef _CFSURFACESQUARE_H_
     6#define _CFSURFACESQUARE_H_
    77
    88/*Headers:*/
     
    2626                IssmDouble      datatime;
    2727                bool                    timepassedflag;
     28                IssmDouble      last_time;
    2829               
    2930                int         lock; // if lock is on, we just return the value stored in "misfit".  this is used so we don't compute misfit past the final_time
     
    4950                IssmDouble Cfsurfacesquare_Calculation(Element* element, int model_enum, int observation_enum, int weights_enum);
    5051};
    51 #endif  /* _TIMEMISFIT_H_ */
     52#endif  /* _CFSURFACESQUARE_H_ */
  • issm/trunk-jpl/src/c/classes/classes.h

    r22507 r22612  
    2121#include "./Numberedcostfunction.h"
    2222#include "./Cfsurfacesquare.h"
     23#include "./Cfdragcoeffabsgrad.h"
    2324#include "./Cfsurfacelogvel.h"
    2425#include "./Masscon.h"
  • issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp

    r22515 r22612  
    6565        /*Recover Arguments*/
    6666        m1qn3_struct *input_struct = (m1qn3_struct*)dzs;
    67         FemModel     *femmodel     = input_struct->femmodel;
     67
     68        FemModel* femmodel = input_struct->femmodel;
     69        int num_responses,num_controls,numberofvertices,solution_type;
     70        femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
     71       
     72        if (solution_type == TransientSolutionEnum){
     73                femmodel = input_struct->femmodel->copy();
     74                }
     75
    6876        IssmPDouble  *Jlist        = input_struct->Jlist;
    6977        int           JlistM       = input_struct->M;
     
    7381
    7482        /*Recover some parameters*/
    75         int num_responses,num_controls,numberofvertices,solution_type;
    7683        IssmDouble* scaling_factors = NULL;
    7784        femmodel->parameters->FindParam(&num_responses,InversionNumCostFunctionsEnum);
    7885        femmodel->parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
    7986        femmodel->parameters->FindParam(&scaling_factors,NULL,InversionControlScalingFactorsEnum);
    80         femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
    8187        numberofvertices=femmodel->vertices->NumberOfVertices();
    8288
     
    98104        simul_starttrace(femmodel);
    99105
    100         /*Set X as our new control input abd as INDEPENDENT!!*/
     106        /*Set X as our new control input and as INDEPENDENT*/
    101107#ifdef _HAVE_AD_
    102108        IssmDouble* aX=xNew<IssmDouble>(num_controls*numberofvertices,"t");
     
    112118        SetControlInputsFromVectorx(femmodel,aX);
    113119        xDelete<IssmDouble>(aX);
    114 
     120       
    115121        /*Compute solution (forward)*/
    116122        void (*solutioncore)(FemModel*)=NULL;
    117123        CorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type);
    118124        solutioncore(femmodel);
     125
     126
     127        /*Reset the time to zero for next optimization*/
     128        if(solution_type==TransientSolutionEnum){
     129                IssmDouble restart_time;
     130       
     131                femmodel->parameters->FindParam(&restart_time,TimesteppingStartTimeEnum);
     132                femmodel->parameters->SetParam(restart_time,TimeEnum);
     133
     134        }
    119135
    120136        /*Get Dependents*/
     
    123139        IssmPDouble *dependents;
    124140        DataSet*    dependent_objects=NULL;
    125 
     141        IssmDouble      J=0.;
     142       
    126143        femmodel->parameters->FindParam(&num_dependents,AutodiffNumDependentsEnum);
    127144        femmodel->parameters->FindParam(&dependent_objects,AutodiffDependentObjectsEnum);
     
    131148        for(int i=0;i<dependent_objects->Size();i++){
    132149                DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
    133                 dep->Responsex(&output_value,femmodel);
     150                if(solution_type==TransientSolutionEnum) output_value = dep->GetValue();
     151                if(solution_type!=TransientSolutionEnum) dep->Responsex(&output_value,femmodel);
    134152                if (my_rank==0) {
    135153                        output_value>>=dependents[i];
     154                        J+=output_value;
    136155                }
    137156        }
     
    218237        /* Ok, now we are going to call the fos_reverse in a loop on the index, from 0 to num_dependents, so
    219238         * as to generate num_dependents gradients: */
    220         totalgradient=xNewZeroInit<IssmPDouble>(num_independents);
     239        totalgradient=xNewZeroInit<IssmPDouble>(num_independents_old);
    221240
    222241        for(int aDepIndex=0;aDepIndex<num_dependents_old;aDepIndex++){
     
    253272        /*Broadcast gradient to other ranks*/
    254273        ISSM_MPI_Bcast(totalgradient,num_independents_old,ISSM_MPI_PDOUBLE,0,IssmComm::GetComm());
    255 
    256274        /*Check size of Jlist to avoid crashes*/
    257275        _assert_((*Jlisti)<JlistM);
     
    259277
    260278        /*Compute objective function*/
    261         IssmDouble* Jtemp = NULL;
    262         IssmDouble J;
    263         femmodel->CostFunctionx(&J,&Jtemp,NULL);
    264279        *pf = reCast<double>(J);
    265280        _printf0_("f(x) = "<<setw(12)<<setprecision(7)<<*pf<<"  |  ");
    266281
    267282        /*Record cost function values and delete Jtemp*/
    268         for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = reCast<IssmPDouble>(Jtemp[i]);
     283        for(int i=0;i<num_responses;i++) Jlist[(*Jlisti)*JlistN+i] = reCast<IssmPDouble>(dependents[i]);
    269284        Jlist[(*Jlisti)*JlistN+num_responses] = reCast<IssmPDouble>(J);
    270         xDelete<IssmDouble>(Jtemp);
    271285
    272286        if(*indic==0){
     
    285299
    286300        /*Compute gradient*/
    287         for(long i=0;i<num_independents_old;i++) G[i] = totalgradient[i];
     301        for(long i=0;i<num_independents_old;i++)        G[i] = totalgradient[i];
    288302
    289303        /*Constrain Gradient*/
     
    359373        Vector<double> *Xpetsc = NULL;
    360374
    361         /*THIS IS WHERE IT FAILS*/
    362375        GetPassiveVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
    363376        X = Xpetsc->ToMPISerial();
     
    397410        /*Initialize Gradient and cost function of M1QN3*/
    398411        indic = 4; /*gradient required*/
    399 printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
     412        printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
    400413        simul_ad(&indic,&n,X,&f,G,izs,rzs,(void*)&mystruct);
     414        printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
    401415        /*Estimation of the expected decrease in f during the first iteration*/
    402416        double df1=f;
    403417
     418printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
    404419        /*Call M1QN3 solver*/
    405420        m1qn3_(simul_ptr,prosca,&ctonbe_,&ctcabe_,
     
    407422                                &gttol,normtype,&impres,&io,imode,&omode,&niter,&nsim,iz,dz,&ndz,
    408423                                &reverse,&indic,izs,rzs,(void*)&mystruct);
     424        printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
    409425        switch(int(omode)){
    410426                case 0:  _printf0_("   Stop requested (indic = 0)\n"); break;
     
    420436        /*Constrain solution vector*/
    421437        double  *XL = NULL;
     438        printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
    422439        double  *XU = NULL;
    423440        GetPassiveVectorFromControlInputsx(&XL,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"lowerbound");
     441        printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
    424442        GetPassiveVectorFromControlInputsx(&XU,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"upperbound");
    425443
     444        printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__);
    426445        for(int i=0;i<numberofvertices;i++){
    427446                for(int c=0;c<num_controls;c++){
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp

    r22607 r22612  
    8686
    8787                                parameters->AddObject(new IntVecParam(InversionControlParametersEnum,ind_enums,num_independent_objects));
    88                                 //iomodel->FetchData(&num_costfunc,"md.numberedcostfunction.num_cost_functions");
     88                                iomodel->FindConstant(&cm_responses,&num_costfunc,"md.autodiff.dependent_object_names");
    8989                                      _assert_(num_costfunc>0);
    90                                 iomodel->FindConstant(&cm_responses,&num_costfunc,"md.autodiff.dependent_object_names");
    9190                                if(num_costfunc<1) _error_ ("no cost functions found");
    9291                                int* costfunc_enums=xNew<int>(num_costfunc);
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp

    r22515 r22612  
    249249                                /*}}}*/
    250250                        }
     251                        else if (output_definition_enums[i]==CfdragcoeffabsgradEnum){
     252                                /*Deal with cfdragcoeffabsgrad: {{{*/
     253                               
     254                                /*cfdragcoeffabsgrad variables: */
     255                                int          num_cfdragcoeffabsgrads;
     256                                char**       cfdragcoeffabsgrad_name_s                                          = NULL;   
     257                                char**           cfdragcoeffabsgrad_definitionstring_s          = NULL;   
     258                                IssmDouble** cfdragcoeffabsgrad_weights_s                                       = NULL;
     259                                int*         cfdragcoeffabsgrad_weights_M_s                             = NULL;
     260                                int*         cfdragcoeffabsgrad_weights_N_s                             = NULL;
     261                                char**       cfdragcoeffabsgrad_weights_string_s                = NULL;
     262                                int*                     cfdragcoeffabsgrad_datatime_s                          = NULL;
     263
     264                                /*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cfdragcoeffabsgrad.m): */
     265                                iomodel->FetchMultipleData(&cfdragcoeffabsgrad_name_s,&num_cfdragcoeffabsgrads,                                                        "md.cfdragcoeffabsgrad.name");
     266                                iomodel->FetchMultipleData(&cfdragcoeffabsgrad_definitionstring_s,&num_cfdragcoeffabsgrads,                                            "md.cfdragcoeffabsgrad.definitionstring");
     267                                iomodel->FetchMultipleData(&cfdragcoeffabsgrad_weights_s,&cfdragcoeffabsgrad_weights_M_s,&cfdragcoeffabsgrad_weights_N_s,&num_cfdragcoeffabsgrads,             "md.cfdragcoeffabsgrad.weights");
     268                                iomodel->FetchMultipleData(&cfdragcoeffabsgrad_weights_string_s,&num_cfdragcoeffabsgrads,                                              "md.cfdragcoeffabsgrad.weights_string");
     269                                iomodel->FetchMultipleData(&cfdragcoeffabsgrad_datatime_s,&num_cfdragcoeffabsgrads,                                                                                                                                      "md.cfdragcoeffabsgrad.datatime");
     270
     271                                for(j=0;j<num_cfdragcoeffabsgrads;j++){
     272
     273                                        int weight_vector_type=0;
     274                                        if ((cfdragcoeffabsgrad_weights_M_s[j]==iomodel->numberofvertices) || (cfdragcoeffabsgrad_weights_M_s[j]==iomodel->numberofvertices+1)){
     275                                                weight_vector_type=1;
     276                                        }
     277                                        else if ((cfdragcoeffabsgrad_weights_M_s[j]==iomodel->numberofelements) || (cfdragcoeffabsgrad_weights_M_s[j]==iomodel->numberofelements+1)){
     278                                                weight_vector_type=2;
     279                                        }
     280                                        else
     281                                         _error_("cfdragcoeffabsgrad weight size not supported yet");
     282
     283                                        /*First create a cfdragcoeffabsgrad object for that specific string (cfdragcoeffabsgrad_model_string_s[j]):*/
     284                                        output_definitions->AddObject(new Cfdragcoeffabsgrad(cfdragcoeffabsgrad_name_s[j],StringToEnumx(cfdragcoeffabsgrad_definitionstring_s[j]),StringToEnumx(cfdragcoeffabsgrad_weights_string_s[j]),cfdragcoeffabsgrad_datatime_s[j],false));
     285
     286                                        /*Now, for this particular cfdragcoeffabsgrad object, make sure we plug into the elements: the observation, and the weights.*/
     287                                        for(int k=0;k<elements->Size();k++){
     288
     289                                                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
     290                                               
     291                                                element->DatasetInputAdd(StringToEnumx(cfdragcoeffabsgrad_definitionstring_s[j]),cfdragcoeffabsgrad_weights_s[j], iomodel,cfdragcoeffabsgrad_weights_M_s[j],cfdragcoeffabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfdragcoeffabsgrad_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
     292
     293                                        }
     294
     295                                }
     296
     297                                /*Free ressources:*/
     298                                for(j=0;j<num_cfdragcoeffabsgrads;j++){
     299                                        char* string=NULL;
     300                                        IssmDouble* matrix = NULL;
     301
     302                                        string = cfdragcoeffabsgrad_definitionstring_s[j];              xDelete<char>(string);
     303                                        string = cfdragcoeffabsgrad_weights_string_s[j];                xDelete<char>(string);
     304                                        string = cfdragcoeffabsgrad_name_s[j];    xDelete<char>(string);
     305                                        matrix = cfdragcoeffabsgrad_weights_s[j]; xDelete<IssmDouble>(matrix);
     306                                }
     307                                xDelete<char*>(cfdragcoeffabsgrad_name_s);
     308                                xDelete<char*>(cfdragcoeffabsgrad_definitionstring_s);
     309                                xDelete<IssmDouble*>(cfdragcoeffabsgrad_weights_s);
     310                                xDelete<int>(cfdragcoeffabsgrad_weights_M_s);
     311                                xDelete<int>(cfdragcoeffabsgrad_weights_N_s);
     312                                xDelete<char*>(cfdragcoeffabsgrad_weights_string_s);
     313                                xDelete<int>(cfdragcoeffabsgrad_datatime_s);
     314                                /*}}}*/
     315                        }
    251316                        else if (output_definition_enums[i]==CfsurfacelogvelEnum){
    252317                                /*Deal with cfsurfacelogvel: {{{*/
     
    552617                                        for(int k=0;k<elements->Size();k++){
    553618                                                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k));
    554                                                 element->DatasetInputCreate(cost_functions_weights[i],cost_functions_weights_M[i],cost_functions_weights_N[i],cost_function_enums,num_cost_functions,iomodel,InversionCostFunctionsCoefficientsEnum);
     619                                                element->DatasetInputCreate(cost_functions_weights[j],cost_functions_weights_M[j],cost_functions_weights_N[j],cost_function_enums,num_cost_functions,iomodel,InversionCostFunctionsCoefficientsEnum);
    555620                                        }
    556621                                        output_definitions->AddObject(new Numberedcostfunction(ncf_name_s[j],StringToEnumx(ncf_definitionstring_s[j]),num_cost_functions,cost_function_enums));
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r22611 r22612  
    636636        CfsurfacelogvelEnum,
    637637        CfsurfacesquareEnum,
     638        CfdragcoeffabsgradEnum,
    638639        ClosedEnum,
    639640        ColinearEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r22611 r22612  
    640640                case CfsurfacelogvelEnum : return "Cfsurfacelogvel";
    641641                case CfsurfacesquareEnum : return "Cfsurfacesquare";
     642                case CfdragcoeffabsgradEnum : return "Cfdragcoeffabsgrad";
    642643                case ClosedEnum : return "Closed";
    643644                case ColinearEnum : return "Colinear";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r22611 r22612  
    655655              else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
    656656              else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
     657              else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum;
    657658              else if (strcmp(name,"Closed")==0) return ClosedEnum;
    658659              else if (strcmp(name,"Colinear")==0) return ColinearEnum;
     
    751752              else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
    752753              else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
    753               else if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"HydrologydcEplCompressibility")==0) return HydrologydcEplCompressibilityEnum;
     757              if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
     758              else if (strcmp(name,"HydrologydcEplCompressibility")==0) return HydrologydcEplCompressibilityEnum;
    758759              else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
    759760              else if (strcmp(name,"HydrologydcEplInitialThickness")==0) return HydrologydcEplInitialThicknessEnum;
     
    874875              else if (strcmp(name,"Mumps")==0) return MumpsEnum;
    875876              else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
    876               else if (strcmp(name,"Nodal")==0) return NodalEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"Nodalvalue")==0) return NodalvalueEnum;
     880              if (strcmp(name,"Nodal")==0) return NodalEnum;
     881              else if (strcmp(name,"Nodalvalue")==0) return NodalvalueEnum;
    881882              else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
    882883              else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
     
    997998              else if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
    998999              else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
    999               else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
     1003              if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
     1004              else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
    10041005              else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
    10051006              else if (strcmp(name,"Tria")==0) return TriaEnum;
     
    11201121              else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
    11211122              else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
    1122               else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum;
     1126              if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
     1127              else if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum;
    11271128              else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
    11281129              else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
  • issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp

    r22515 r22612  
    1313        int   input_enum = -1;
    1414
    15         if(strcmp(string_in,"Thickness")==0){
     15        if(strcmp(string_in,"Thickness")==0 || strcmp(string_in,"md.geometry.thickness")==0){
    1616                const char* field = "md.geometry.thickness";
    1717                input_enum        = ThicknessEnum;
Note: See TracChangeset for help on using the changeset viewer.