Changeset 5281


Ignore:
Timestamp:
Aug 16, 2010, 11:37:04 AM (16 years ago)
Author:
Mathieu Morlighem
Message:

moved md.fit to md.cm_responses and 0-4 to enums

Location:
issm/trunk/src/c
Files:
1 deleted
24 edited

Legend:

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

    r5251 r5281  
    170170        BedSlopeYEnum,
    171171        BoundaryEnum,
     172        CmResponseEnum,
     173        CmResponsesEnum,
    172174        CmMaxDmpSlopeEnum,
    173175        CmMaxDmpValueEnum,
    … …  
    190192        EpsVelEnum,
    191193        FillEnum,
    192         FitEnum,
    193194        FractionIncrementEnum,
    194195        FrictionEnum,
    … …  
    197198        KflagEnum,
    198199        MassFluxEnum,
     200        SurfaceAbsVelMisfitEnum,
     201        SurfaceRelVelMisfitEnum,
     202        SurfaceLogVelMisfitEnum,
     203        SurfaceLogVxVyMisfitEnum,
     204        SurfaceAverageVelMisfitEnum,
    199205        MaxPenetrationEnum,
    200206        MeanVelEnum,
  • issm/trunk/src/c/EnumDefinitions/EnumToString.cpp

    r5251 r5281  
    144144                case BedSlopeYEnum : return "BedSlopeY";
    145145                case BoundaryEnum : return "Boundary";
     146                case CmResponseEnum : return "CmResponse";
     147                case CmResponsesEnum : return "CmResponses";
    146148                case CmMaxDmpSlopeEnum : return "CmMaxDmpSlope";
    147149                case CmMaxDmpValueEnum : return "CmMaxDmpValue";
    … …  
    164166                case EpsVelEnum : return "EpsVel";
    165167                case FillEnum : return "Fill";
    166                 case FitEnum : return "Fit";
    167168                case FractionIncrementEnum : return "FractionIncrement";
    168169                case FrictionEnum : return "Friction";
    … …  
    171172                case KflagEnum : return "Kflag";
    172173                case MassFluxEnum : return "MassFlux";
     174                case SurfaceAbsVelMisfitEnum : return "SurfaceAbsVelMisfit";
     175                case SurfaceRelVelMisfitEnum : return "SurfaceRelVelMisfit";
     176                case SurfaceLogVelMisfitEnum : return "SurfaceLogVelMisfit";
     177                case SurfaceLogVxVyMisfitEnum : return "SurfaceLogVxVyMisfit";
     178                case SurfaceAverageVelMisfitEnum : return "SurfaceAverageVelMisfit";
    173179                case MaxPenetrationEnum : return "MaxPenetration";
    174180                case MeanVelEnum : return "MeanVel";
  • issm/trunk/src/c/EnumDefinitions/StringToEnum.cpp

    r5251 r5281  
    142142        else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
    143143        else if (strcmp(name,"Boundary")==0) return BoundaryEnum;
     144        else if (strcmp(name,"CmResponse")==0) return CmResponseEnum;
     145        else if (strcmp(name,"CmResponses")==0) return CmResponsesEnum;
    144146        else if (strcmp(name,"CmMaxDmpSlope")==0) return CmMaxDmpSlopeEnum;
    145147        else if (strcmp(name,"CmMaxDmpValue")==0) return CmMaxDmpValueEnum;
    … …  
    162164        else if (strcmp(name,"EpsVel")==0) return EpsVelEnum;
    163165        else if (strcmp(name,"Fill")==0) return FillEnum;
    164         else if (strcmp(name,"Fit")==0) return FitEnum;
    165166        else if (strcmp(name,"FractionIncrement")==0) return FractionIncrementEnum;
    166167        else if (strcmp(name,"Friction")==0) return FrictionEnum;
    … …  
    169170        else if (strcmp(name,"Kflag")==0) return KflagEnum;
    170171        else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
     172        else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
     173        else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum;
     174        else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
     175        else if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
     176        else if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum;
    171177        else if (strcmp(name,"MaxPenetration")==0) return MaxPenetrationEnum;
    172178        else if (strcmp(name,"MeanVel")==0) return MeanVelEnum;
    … …  
    305311        else if (strcmp(name,"WaitOnLock")==0) return WaitOnLockEnum;
    306312        else if (strcmp(name,"Yts")==0) return YtsEnum;
    307         else ISSMERROR("Enum %s not found",name);
    308 
    309 }
  • issm/trunk/src/c/Makefile.am

    r5250 r5281  
    433433                                        ./modules/SurfaceAreax/SurfaceAreax.h\
    434434                                        ./modules/SurfaceAreax/SurfaceAreax.cpp\
    435                                         ./modules/Misfitx/Misfitx.h\
    436                                         ./modules/Misfitx/Misfitx.cpp\
     435                                        ./modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h\
     436                                        ./modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp\
     437                                        ./modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h\
     438                                        ./modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp\
     439                                        ./modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h\
     440                                        ./modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp\
     441                                        ./modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h\
     442                                        ./modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp\
     443                                        ./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h\
     444                                        ./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp\
    437445                                        ./modules/CostFunctionx/CostFunctionx.h\
    438446                                        ./modules/CostFunctionx/CostFunctionx.cpp\
    … …  
    968976                                        ./modules/SurfaceAreax/SurfaceAreax.h\
    969977                                        ./modules/SurfaceAreax/SurfaceAreax.cpp\
    970                                         ./modules/Misfitx/Misfitx.h\
    971                                         ./modules/Misfitx/Misfitx.cpp\
     978                                        ./modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h\
     979                                        ./modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp\
     980                                        ./modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h\
     981                                        ./modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp\
     982                                        ./modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h\
     983                                        ./modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp\
     984                                        ./modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h\
     985                                        ./modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp\
     986                                        ./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h\
     987                                        ./modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp\
    972988                                        ./modules/CostFunctionx/CostFunctionx.h\
    973989                                        ./modules/CostFunctionx/CostFunctionx.cpp\
  • issm/trunk/src/c/modules/CostFunctionx/CostFunctionx.cpp

    r4974 r5281  
    99#include "../../toolkits/toolkits.h"
    1010#include "../../EnumDefinitions/EnumDefinitions.h"
    11 #include "../SurfaceAreax/SurfaceAreax.h"
     11#include "../Responsex/Responsex.h"
    1212
    13 void CostFunctionx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
     13void CostFunctionx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,int response){
    1414
    1515        /*Intermediary*/
    … …  
    2020
    2121        /*output: */
    22         double J=0;
    23         double J_sum;
     22        double J;
     23        double Jreg=0;
     24        double Jreg_sum;
     25       
     26        /*Get response*/
     27        Responsex(&J,elements,nodes,vertices,loads,materials,parameters,(const char*)EnumToString(response),false); //False means DO NOT process units
    2428
    25         /*Compute surface area: */
    26         SurfaceAreax(&S,elements,nodes,vertices, loads,materials,parameters);
    27 
    28         /*add surface area to elements :*/
    29         for(i=0;i<elements->Size();i++){
    30                 Element* element=(Element*)elements->GetObjectByOffset(i);
    31                 element->InputUpdateFromVector(&S,SurfaceAreaEnum,ConstantEnum);
    32         }
    33        
    34         /*Compute cost function: */
     29        /*Add Regularization terms: */
    3530        for (i=0;i<elements->Size();i++){
    3631                element=(Element*)elements->GetObjectByOffset(i);
    37                 J+=element->CostFunction(process_units);
     32                Jreg+=element->RegularizeInversion();
    3833        }
    3934
    4035        /*Sum all J from all cpus of the cluster:*/
    41         MPI_Reduce (&J,&J_sum,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD );
    42         MPI_Bcast(&J_sum,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
    43         J=J_sum;
     36        MPI_Reduce (&Jreg,&Jreg_sum,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD );
     37        MPI_Bcast(&Jreg_sum,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
     38        J=J+Jreg_sum;
    4439
    4540        /*Assign output pointers: */
  • issm/trunk/src/c/modules/CostFunctionx/CostFunctionx.h

    r4974 r5281  
    1010
    1111/* local prototypes: */
    12 void CostFunctionx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
     12void CostFunctionx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,int response);
    1313
    14 #endif  /* _MISFITX_H */
    15 
     14#endif
  • issm/trunk/src/c/modules/MassFluxx/MassFluxx.cpp

    r5250 r5281  
    1010#include "../../EnumDefinitions/EnumDefinitions.h"
    1111
    12 void MassFluxx(double* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,char* descriptor,bool process_units){
     12void MassFluxx(double* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,const char* descriptor,bool process_units){
    1313
    1414        int i,j;
  • issm/trunk/src/c/modules/MassFluxx/MassFluxx.h

    r5250 r5281  
    1010
    1111/* local prototypes: */
    12 void MassFluxx(double* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,char* descriptor,bool process_units);
     12void MassFluxx(double* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,const char* descriptor,bool process_units);
    1313
    1414
  • issm/trunk/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp

    r5247 r5281  
    6060
    6161                /*Now, recover fit, optscal and maxiter as vectors: */
    62                 IoModelFetchData(&iomodel->fit,NULL,NULL,iomodel_handle,"fit");
     62                IoModelFetchData(&iomodel->cm_responses,NULL,NULL,iomodel_handle,"cm_responses");
    6363                IoModelFetchData(&iomodel->cm_jump,NULL,NULL,iomodel_handle,"cm_jump");
    6464                IoModelFetchData(&iomodel->optscal,NULL,NULL,iomodel_handle,"optscal");
    6565                IoModelFetchData(&iomodel->maxiter,NULL,NULL,iomodel_handle,"maxiter");
    6666
    67                 parameters->AddObject(new DoubleVecParam(FitEnum,iomodel->fit,iomodel->nsteps));
     67                parameters->AddObject(new DoubleVecParam(CmResponsesEnum,iomodel->cm_responses,iomodel->nsteps));
    6868                parameters->AddObject(new DoubleVecParam(CmJumpEnum,iomodel->cm_jump,iomodel->nsteps));
    6969                parameters->AddObject(new DoubleVecParam(OptScalEnum,iomodel->optscal,iomodel->nsteps));
    7070                parameters->AddObject(new DoubleVecParam(MaxIterEnum,iomodel->maxiter,iomodel->nsteps));
    7171
    72                 xfree((void**)&iomodel->fit);
     72                xfree((void**)&iomodel->cm_responses);
    7373                xfree((void**)&iomodel->cm_jump);
    7474                xfree((void**)&iomodel->optscal);
  • issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp

    r5240 r5281  
    207207                                qmu_mass_flux_present=true;
    208208                        }
    209 
    210                         if (strcmp(descriptor,"misfit")==0){
    211 
    212                                 /*We need the fit: */
    213                                 IoModelFetchData(&iomodel->fit,NULL,NULL,iomodel_handle,"fit");
    214                                 parameters->SetParam(iomodel->fit,iomodel->nsteps,FitEnum);
    215                                 xfree((void**)&iomodel->fit);
    216 
    217                         }
    218209                }
    219210               
  • issm/trunk/src/c/modules/Responsex/Responsex.cpp

    r5250 r5281  
    1616#include "../modules.h"
    1717
    18 void Responsex(double* presponse,Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,char* response_descriptor,bool process_units){
     18void Responsex(double* presponse,Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,const char* response_descriptor,bool process_units){
    1919
    2020        if(strcmp(response_descriptor,"MinVel")==0){
    … …  
    5151                MaxAbsVzx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
    5252        }
    53         else if(strcmp(response_descriptor,"Misfit")==0){
    54                 Misfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
     53        else if(strcmp(response_descriptor,"SurfaceAbsVelMisfit")==0){
     54                SurfaceAbsVelMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
    5555        }
    56         else if(strlen(response_descriptor)>=8){
    57                 if(strncmp(response_descriptor,"MassFlux",8)==0) MassFluxx(presponse,elements,nodes,vertices,loads,materials,parameters,response_descriptor,process_units);
     56        else if(strcmp(response_descriptor,"SurfaceRelVelMisfit")==0){
     57                SurfaceRelVelMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
     58        }
     59        else if(strcmp(response_descriptor,"SurfaceLogVelMisfit")==0){
     60                SurfaceLogVelMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
     61        }
     62        else if(strcmp(response_descriptor,"SurfaceLogVxVyMisfit")==0){
     63                SurfaceLogVxVyMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
     64        }
     65        else if(strcmp(response_descriptor,"SurfaceAverageVelMisfit")==0){
     66                SurfaceAverageVelMisfitx( presponse, elements,nodes, vertices, loads, materials, parameters,process_units);
     67        }
     68        else if(strncmp(response_descriptor,"MassFlux",8)==0){
     69                MassFluxx(presponse,elements,nodes,vertices,loads,materials,parameters,response_descriptor,process_units);
    5870        }
    5971        else{
    60                 ISSMERROR("%s%s%s"," response descriptor : ",response_descriptor," not supported yet!");
     72                ISSMERROR(" response descriptor \"%s\" not supported yet!",response_descriptor);
    6173        }
    6274}
  • issm/trunk/src/c/modules/Responsex/Responsex.h

    r5250 r5281  
    99#include "../../Container/Container.h"
    1010
    11 void Responsex(double* presponse,Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,char* response_descriptor,bool process_units);
     11void Responsex(double* presponse,Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,const char* response_descriptor,bool process_units);
    1212
    1313#endif  /* _RESPONSESXX_H */
  • issm/trunk/src/c/modules/modules.h

    r5250 r5281  
    5555#include "./MinVyx/MinVyx.h"
    5656#include "./MinVzx/MinVzx.h"
    57 #include "./Misfitx/Misfitx.h"
     57#include "./SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h"
     58#include "./SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h"
     59#include "./SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h"
     60#include "./SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h"
     61#include "./SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h"
    5862#include "./ModelProcessorx/ModelProcessorx.h"
    5963#include "./NodeConnectivityx/NodeConnectivityx.h"
  • issm/trunk/src/c/objects/Elements/Element.h

    r4974 r5281  
    4242                virtual void   GradjDrag(Vec gradient)=0;
    4343                virtual void   GradjB(Vec gradient)=0;
    44                 virtual double Misfit(bool process_units)=0;
    45                 virtual double CostFunction(bool process_units)=0;
     44                virtual double SurfaceAbsVelMisfit(bool process_units)=0;
     45                virtual double SurfaceRelVelMisfit(bool process_units)=0;
     46                virtual double SurfaceLogVelMisfit(bool process_units)=0;
     47                virtual double SurfaceLogVxVyMisfit(bool process_units)=0;
     48                virtual double SurfaceAverageVelMisfit(bool process_units)=0;
     49                virtual double RegularizeInversion(void)=0;
    4650                virtual double SurfaceArea(void)=0;
    4751                virtual void   InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum)=0;
  • issm/trunk/src/c/objects/Elements/Penta.cpp

    r5263 r5281  
    666666}
    667667/*}}}*/
    668 /*FUNCTION Penta::CostFunction {{{1*/
    669 double Penta::CostFunction(bool process_units){
     668/*FUNCTION Penta::RegularizeInversion {{{1*/
     669double Penta::RegularizeInversion(void){
    670670
    671671        double J;
    … …  
    696696
    697697                /*This element should be collapsed into a tria element at its base. Create this tria element,
    698                  * and compute CostFunction*/
     698                 * and compute RegularizeInversion*/
    699699
    700700                /*Depth Average B*/
    … …  
    702702
    703703                tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
    704                 J=tria->CostFunction(process_units);
     704                J=tria->RegularizeInversion();
    705705                delete tria->matice; delete tria;
    706706
    … …  
    720720
    721721                tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
    722                 J=tria->CostFunction(process_units);
     722                J=tria->RegularizeInversion();
    723723                delete tria->matice; delete tria;
    724724
    … …  
    15971597}
    15981598/*}}}*/
    1599 /*FUNCTION Penta::Misfit {{{1*/
    1600 double Penta::Misfit(bool process_units){
     1599/*FUNCTION Penta::SurfaceAbsVelMisfit {{{1*/
     1600double Penta::SurfaceAbsVelMisfit(bool process_units){
    16011601
    16021602        double J;
    … …  
    16271627
    16281628                /*This element should be collapsed into a tria element at its base. Create this tria element,
    1629                  * and compute Misfit*/
     1629                 * and compute SurfaceAbsVelMisfit*/
    16301630                tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
    1631                 J=tria->Misfit(process_units);
     1631                J=tria->SurfaceAbsVelMisfit(process_units);
    16321632                delete tria->matice; delete tria;
    16331633                return J;
    … …  
    16361636
    16371637                tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
    1638                 J=tria->Misfit(process_units);
     1638                J=tria->SurfaceAbsVelMisfit(process_units);
     1639                delete tria->matice; delete tria;
     1640                return J;
     1641        }
     1642}
     1643/*}}}*/
     1644/*FUNCTION Penta::SurfaceRelVelMisfit {{{1*/
     1645double Penta::SurfaceRelVelMisfit(bool process_units){
     1646
     1647        double J;
     1648        Tria* tria=NULL;
     1649
     1650        /*inputs: */
     1651        bool onwater;
     1652        bool onsurface;
     1653        bool onbed;
     1654        int  approximation;
     1655
     1656        /*retrieve inputs :*/
     1657        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     1658        inputs->GetParameterValue(&onbed,ElementOnBedEnum);
     1659        inputs->GetParameterValue(&onsurface,ElementOnSurfaceEnum);
     1660        inputs->GetParameterValue(&approximation,ApproximationEnum);
     1661
     1662        /*If on water, return 0: */
     1663        if(onwater)return 0;
     1664
     1665        /*Bail out if this element if:
     1666         * -> Non MacAyeal and not on the surface
     1667         * -> MacAyeal (2d model) and not on bed) */
     1668        if ((approximation!=MacAyealApproximationEnum && !onsurface) || (MacAyealApproximationEnum && !onbed)){
     1669                return 0;
     1670        }
     1671        else if (MacAyealApproximationEnum){
     1672
     1673                /*This element should be collapsed into a tria element at its base. Create this tria element,
     1674                 * and compute SurfaceRelVelMisfit*/
     1675                tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
     1676                J=tria->SurfaceRelVelMisfit(process_units);
     1677                delete tria->matice; delete tria;
     1678                return J;
     1679        }
     1680        else{
     1681
     1682                tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
     1683                J=tria->SurfaceRelVelMisfit(process_units);
     1684                delete tria->matice; delete tria;
     1685                return J;
     1686        }
     1687}
     1688/*}}}*/
     1689/*FUNCTION Penta::SurfaceLogVelMisfit {{{1*/
     1690double Penta::SurfaceLogVelMisfit(bool process_units){
     1691
     1692        double J;
     1693        Tria* tria=NULL;
     1694
     1695        /*inputs: */
     1696        bool onwater;
     1697        bool onsurface;
     1698        bool onbed;
     1699        int  approximation;
     1700
     1701        /*retrieve inputs :*/
     1702        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     1703        inputs->GetParameterValue(&onbed,ElementOnBedEnum);
     1704        inputs->GetParameterValue(&onsurface,ElementOnSurfaceEnum);
     1705        inputs->GetParameterValue(&approximation,ApproximationEnum);
     1706
     1707        /*If on water, return 0: */
     1708        if(onwater)return 0;
     1709
     1710        /*Bail out if this element if:
     1711         * -> Non MacAyeal and not on the surface
     1712         * -> MacAyeal (2d model) and not on bed) */
     1713        if ((approximation!=MacAyealApproximationEnum && !onsurface) || (MacAyealApproximationEnum && !onbed)){
     1714                return 0;
     1715        }
     1716        else if (MacAyealApproximationEnum){
     1717
     1718                /*This element should be collapsed into a tria element at its base. Create this tria element,
     1719                 * and compute SurfaceLogVelMisfit*/
     1720                tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
     1721                J=tria->SurfaceLogVelMisfit(process_units);
     1722                delete tria->matice; delete tria;
     1723                return J;
     1724        }
     1725        else{
     1726
     1727                tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
     1728                J=tria->SurfaceLogVelMisfit(process_units);
     1729                delete tria->matice; delete tria;
     1730                return J;
     1731        }
     1732}
     1733/*}}}*/
     1734/*FUNCTION Penta::SurfaceLogVxVyMisfit {{{1*/
     1735double Penta::SurfaceLogVxVyMisfit(bool process_units){
     1736
     1737        double J;
     1738        Tria* tria=NULL;
     1739
     1740        /*inputs: */
     1741        bool onwater;
     1742        bool onsurface;
     1743        bool onbed;
     1744        int  approximation;
     1745
     1746        /*retrieve inputs :*/
     1747        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     1748        inputs->GetParameterValue(&onbed,ElementOnBedEnum);
     1749        inputs->GetParameterValue(&onsurface,ElementOnSurfaceEnum);
     1750        inputs->GetParameterValue(&approximation,ApproximationEnum);
     1751
     1752        /*If on water, return 0: */
     1753        if(onwater)return 0;
     1754
     1755        /*Bail out if this element if:
     1756         * -> Non MacAyeal and not on the surface
     1757         * -> MacAyeal (2d model) and not on bed) */
     1758        if ((approximation!=MacAyealApproximationEnum && !onsurface) || (MacAyealApproximationEnum && !onbed)){
     1759                return 0;
     1760        }
     1761        else if (MacAyealApproximationEnum){
     1762
     1763                /*This element should be collapsed into a tria element at its base. Create this tria element,
     1764                 * and compute SurfaceLogVxVyMisfit*/
     1765                tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
     1766                J=tria->SurfaceLogVxVyMisfit(process_units);
     1767                delete tria->matice; delete tria;
     1768                return J;
     1769        }
     1770        else{
     1771
     1772                tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
     1773                J=tria->SurfaceLogVxVyMisfit(process_units);
     1774                delete tria->matice; delete tria;
     1775                return J;
     1776        }
     1777}
     1778/*}}}*/
     1779/*FUNCTION Penta::SurfaceAverageVelMisfit {{{1*/
     1780double Penta::SurfaceAverageVelMisfit(bool process_units){
     1781
     1782        double J;
     1783        Tria* tria=NULL;
     1784
     1785        /*inputs: */
     1786        bool onwater;
     1787        bool onsurface;
     1788        bool onbed;
     1789        int  approximation;
     1790
     1791        /*retrieve inputs :*/
     1792        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     1793        inputs->GetParameterValue(&onbed,ElementOnBedEnum);
     1794        inputs->GetParameterValue(&onsurface,ElementOnSurfaceEnum);
     1795        inputs->GetParameterValue(&approximation,ApproximationEnum);
     1796
     1797        /*If on water, return 0: */
     1798        if(onwater)return 0;
     1799
     1800        /*Bail out if this element if:
     1801         * -> Non MacAyeal and not on the surface
     1802         * -> MacAyeal (2d model) and not on bed) */
     1803        if ((approximation!=MacAyealApproximationEnum && !onsurface) || (MacAyealApproximationEnum && !onbed)){
     1804                return 0;
     1805        }
     1806        else if (MacAyealApproximationEnum){
     1807
     1808                /*This element should be collapsed into a tria element at its base. Create this tria element,
     1809                 * and compute SurfaceAverageVelMisfit*/
     1810                tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
     1811                J=tria->SurfaceAverageVelMisfit(process_units);
     1812                delete tria->matice; delete tria;
     1813                return J;
     1814        }
     1815        else{
     1816
     1817                tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
     1818                J=tria->SurfaceAverageVelMisfit(process_units);
    16391819                delete tria->matice; delete tria;
    16401820                return J;
    … …  
    59006080                                name==TemperatureEnum ||
    59016081                                name==ControlParameterEnum ||
    5902                                 name==FitEnum ||
     6082                                name==CmResponseEnum ||
    59036083                                name==DragCoefficientEnum ||
    59046084                                name==GradientEnum ||
  • issm/trunk/src/c/objects/Elements/Penta.h

    r5258 r5281  
    7171                void   Configure(Elements* elements,Loads* loads,DataSet* nodes,Materials* materials,Parameters* parameters);
    7272                void   SetCurrentConfiguration(Elements* elements,Loads* loads,DataSet* nodes,Materials* materials,Parameters* parameters);
    73                 double CostFunction(bool process_units);
     73                double RegularizeInversion(void);
    7474                void   CreateKMatrix(Mat Kgg);
    7575                void   CreatePVector(Vec pg);
    … …  
    104104                void   MinVy(double* pminvy, bool process_units);
    105105                void   MinVz(double* pminvz, bool process_units);
    106                 double Misfit(bool process_units);
     106                double SurfaceAbsVelMisfit(bool process_units);
     107                double SurfaceRelVelMisfit(bool process_units);
     108                double SurfaceLogVelMisfit(bool process_units);
     109                double SurfaceLogVxVyMisfit(bool process_units);
     110                double SurfaceAverageVelMisfit(bool process_units);
    107111                void   PatchFill(int* pcount, Patch* patch);
    108112                void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
  • issm/trunk/src/c/objects/Elements/Tria.cpp

    r5263 r5281  
    548548}
    549549/*}}}*/
    550 /*FUNCTION Tria::CostFunction {{{1*/
    551 double Tria::CostFunction(bool process_units){
     550/*FUNCTION Tria::RegularizeInversion {{{1*/
     551double Tria::RegularizeInversion(){
    552552
    553553        int i;
    554554
    555555        /* output: */
    556         double Jelem;
     556        double Jelem=0;
    557557
    558558        /* node data: */
    … …  
    602602        /* Get node coordinates and dof list: */
    603603        GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
    604 
    605         /*First, get Misfit*/
    606         Jelem=Misfit(process_units);
    607604
    608605        /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
    … …  
    18601857}
    18611858/*}}}*/
    1862 /*FUNCTION Tria::Misfit {{{1*/
    1863 double Tria::Misfit(bool process_units){
     1859/*FUNCTION Tria::SurfaceAbsVelMisfit {{{1*/
     1860double Tria::SurfaceAbsVelMisfit(bool process_units){
    18641861
    18651862        int i;
    … …  
    19001897        double Jdet;
    19011898
    1902         /*relative and logarithmic control method :*/
    1903         double scalex=1;
    1904         double scaley=1;
    1905         double S=0;
    1906         int    fit=-1;
    1907 
    19081899        /*inputs: */
    19091900        bool onwater;
    … …  
    19211912
    19221913        /* Recover input data: */
    1923         inputs->GetParameterValue(&fit,FitEnum);
    1924         if(fit==3){
    1925                 inputs->GetParameterValue(&S,SurfaceAreaEnum);
    1926         }
    19271914        inputs->GetParameterValues(&obs_vx_list[0],&gaussgrids[0][0],3,VxObsEnum);
    19281915        inputs->GetParameterValues(&obs_vy_list[0],&gaussgrids[0][0],3,VyObsEnum);
    … …  
    19351922        this->parameters->FindParam(&epsvel,EpsVelEnum);
    19361923       
    1937         /* Compute Misfit at the 3 nodes
     1924        /* Compute SurfaceAbsVelMisfit at the 3 nodes
    19381925         * Here we integrate linearized functions:
    19391926         *               
    … …  
    19441931         *       the vertex i
    19451932         */
    1946         if(fit==0){
    1947                 /*We are using an absolute misfit:
    1948                  *
    1949                  *      1  [           2              2 ]
    1950                  * J = --- | (u - u   )  +  (v - v   )  |
    1951                  *      2  [       obs            obs   ]
    1952                  *
    1953                  */
    1954                 for (i=0;i<numgrids;i++){
    1955                         misfit_list[i]=0.5*(pow((vx_list[i]-obs_vx_list[i]),(double)2)+pow((vy_list[i]-obs_vy_list[i]),(double)2));
    1956                 }
    1957                 /*Process units: */
    1958                 if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,MisfitEnum,this->parameters);
    1959 
    1960         }
    1961         else if(fit==1){
    1962                 /*We are using a relative misfit:
    1963                  *                       
    1964                  *      1  [     \bar{v}^2             2   \bar{v}^2              2 ]
    1965                  * J = --- | -------------  (u - u   ) + -------------  (v - v   )  |
    1966                  *      2  [  (u   + eps)^2       obs    (v   + eps)^2       obs    ]
    1967                  *              obs                        obs                     
    1968                  */
    1969                 for (i=0;i<numgrids;i++){
    1970                         scalex=pow(meanvel/(obs_vx_list[i]+epsvel),(double)2);
    1971                         scaley=pow(meanvel/(obs_vy_list[i]+epsvel),(double)2);
    1972                         if(obs_vx_list[i]==0)scalex=0;
    1973                         if(obs_vy_list[i]==0)scaley=0;
    1974                         misfit_list[i]=0.5*(scalex*pow((vx_list[i]-obs_vx_list[i]),2)+scaley*pow((vy_list[i]-obs_vy_list[i]),2));
    1975                 }
    1976 
    1977                 /*Process units: */
    1978                 if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,MisfitEnum,this->parameters);
    1979 
    1980         }
    1981         else if(fit==2){
    1982                 /*We are using a logarithmic misfit:
    1983                 *                       
    1984                 *                 [        vel + eps     ] 2
    1985                 * J = 4 \bar{v}^2 | log ( -----------  ) | 
    1986                 *                 [       vel   + eps    ]
    1987                 *                            obs
    1988                 */
    1989                 for (i=0;i<numgrids;i++){
    1990                         velocity_mag=sqrt(pow(vx_list[i],(double)2)+pow(vy_list[i],(double)2))+epsvel; //epsvel to avoid velocity being nil.
    1991                         obs_velocity_mag=sqrt(pow(obs_vx_list[i],(double)2)+pow(obs_vy_list[i],(double)2))+epsvel; //epsvel to avoid observed velocity being nil.
    1992                         misfit_list[i]=4*pow(meanvel,(double)2)*pow(log(velocity_mag/obs_velocity_mag),(double)2);
    1993                 }
    1994                
    1995                 /*Process units: */
    1996                 if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,MisfitEnum,this->parameters);
    1997 
    1998         }
    1999         else if(fit==3){
    2000                 /*We are using a spacially average absolute misfit:
    2001                  *
    2002                  *      1                    2              2
    2003                  * J = ---  sqrt(  (u - u   )  +  (v - v   )  )
    2004                  *      S                obs            obs
    2005                  */
    2006                 for (i=0;i<numgrids;i++) misfit_square_list[i]=pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2);
    2007                
    2008                 /*Process units: */
    2009                 if(process_units)NodalValuesUnitConversion(&misfit_square_list[0],numgrids,MisfitEnum,this->parameters);
    2010        
    2011                 /*Take the square root, and scale by surface: */
    2012                 for (i=0;i<numgrids;i++)misfit_list[i]=pow(misfit_square_list[i],2)/S;
    2013         }
    2014         else if(fit==4){
    2015                 /*We are using an logarithmic 2 misfit:
    2016                  *
    2017                  *      1            [        |u| + eps     2          |v| + eps     2  ]
    2018                  * J = --- \bar{v}^2 | log ( -----------  )   +  log ( -----------  )   | 
    2019                  *      2            [       |u    |+ eps              |v    |+ eps     ]
    2020                  *                              obs                       obs
    2021                  */
    2022                 for (i=0;i<numgrids;i++){
    2023                         misfit_list[i]=0.5*pow(meanvel,(double)2)*(
    2024                           pow(log((fabs(vx_list[i])+epsvel)/(fabs(obs_vx_list[i])+epsvel)),(double)2) +
    2025                           pow(log((fabs(vy_list[i])+epsvel)/(fabs(obs_vy_list[i])+epsvel)),(double)2) );
    2026                 }
    2027                
    2028                 /*Process units: */
    2029                 if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,MisfitEnum,this->parameters);
    2030 
    2031         }
    2032         else{
    2033                 /*Not supported yet! : */
    2034                 ISSMERROR("%s%g","unsupported type of fit: ",fit);
    2035         }
     1933
     1934        /*We are using an absolute misfit:
     1935         *
     1936         *      1  [           2              2 ]
     1937         * J = --- | (u - u   )  +  (v - v   )  |
     1938         *      2  [       obs            obs   ]
     1939         *
     1940         */
     1941        for (i=0;i<numgrids;i++){
     1942                misfit_list[i]=0.5*(pow((vx_list[i]-obs_vx_list[i]),(double)2)+pow((vy_list[i]-obs_vy_list[i]),(double)2));
     1943        }
     1944        /*Process units: */
     1945        if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceAbsVelMisfitEnum,this->parameters);
    20361946
    20371947        /*Apply weights to misfits*/
    … …  
    20571967                TriaRef::GetParameterValue(&misfit, &misfit_list[0],gauss_l1l2l3);
    20581968
    2059                 /*compute Misfit*/
     1969                /*compute SurfaceAbsVelMisfit*/
    20601970                Jelem+=misfit*Jdet*gauss_weight;
    20611971        }
    … …  
    20661976        xfree((void**)&gauss_weights);
    20671977               
     1978        /*Return: */
     1979        return Jelem;
     1980}
     1981/*}}}*/
     1982/*FUNCTION Tria::SurfaceRelVelMisfit {{{1*/
     1983double Tria::SurfaceRelVelMisfit(bool process_units){
     1984
     1985        int i;
     1986
     1987        /* output: */
     1988        double Jelem=0;
     1989
     1990        /* node data: */
     1991        const int    numgrids=3;
     1992        const int    numdof=2*numgrids;
     1993        const int    NDOF2=2;
     1994        double       xyz_list[numgrids][3];
     1995
     1996        /* grid data: */
     1997        double vx_list[numgrids];
     1998        double vy_list[numgrids];
     1999        double obs_vx_list[numgrids];
     2000        double obs_vy_list[numgrids];
     2001        double misfit_square_list[numgrids];
     2002        double misfit_list[numgrids];
     2003        double weights_list[numgrids];
     2004
     2005        /* gaussian points: */
     2006        int     num_gauss,ig;
     2007        double* first_gauss_area_coord  =  NULL;
     2008        double* second_gauss_area_coord =  NULL;
     2009        double* third_gauss_area_coord  =  NULL;
     2010        double* gauss_weights           =  NULL;
     2011        double  gauss_weight;
     2012        double  gauss_l1l2l3[3];
     2013        double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
     2014
     2015        /* parameters: */
     2016        double  velocity_mag,obs_velocity_mag;
     2017        double  misfit;
     2018
     2019        /* Jacobian: */
     2020        double Jdet;
     2021
     2022        /*relative and logarithmic control method :*/
     2023        double scalex=1;
     2024        double scaley=1;
     2025
     2026        /*inputs: */
     2027        bool onwater;
     2028
     2029        double  meanvel, epsvel;
     2030
     2031        /*retrieve inputs :*/
     2032        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     2033
     2034        /*If on water, return 0: */
     2035        if(onwater)return 0;
     2036
     2037        /* Get node coordinates and dof list: */
     2038        GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
     2039
     2040        /* Recover input data: */
     2041        inputs->GetParameterValues(&obs_vx_list[0],&gaussgrids[0][0],3,VxObsEnum);
     2042        inputs->GetParameterValues(&obs_vy_list[0],&gaussgrids[0][0],3,VyObsEnum);
     2043        inputs->GetParameterValues(&vx_list[0],&gaussgrids[0][0],3,VxEnum);
     2044        inputs->GetParameterValues(&vy_list[0],&gaussgrids[0][0],3,VyEnum);
     2045        inputs->GetParameterValues(&weights_list[0],&gaussgrids[0][0],3,WeightsEnum);
     2046
     2047        /*retrieve some parameters: */
     2048        this->parameters->FindParam(&meanvel,MeanVelEnum);
     2049        this->parameters->FindParam(&epsvel,EpsVelEnum);
     2050
     2051        /* Compute SurfaceRelVelMisfit at the 3 nodes
     2052         * Here we integrate linearized functions:
     2053         *               
     2054         * J(E) = int_E   sum_{i=1}^3  J_i Phi_i
     2055         *
     2056         * where J_i are the misfits at the 3 nodes of the triangle
     2057         *       Phi_i is the nodal function (P1) with respect to
     2058         *       the vertex i
     2059         */
     2060
     2061        /*We are using a relative misfit:
     2062         *                       
     2063         *      1  [     \bar{v}^2             2   \bar{v}^2              2 ]
     2064         * J = --- | -------------  (u - u   ) + -------------  (v - v   )  |
     2065         *      2  [  (u   + eps)^2       obs    (v   + eps)^2       obs    ]
     2066         *              obs                        obs                     
     2067         */
     2068        for (i=0;i<numgrids;i++){
     2069                scalex=pow(meanvel/(obs_vx_list[i]+epsvel),(double)2);
     2070                scaley=pow(meanvel/(obs_vy_list[i]+epsvel),(double)2);
     2071                if(obs_vx_list[i]==0)scalex=0;
     2072                if(obs_vy_list[i]==0)scaley=0;
     2073                misfit_list[i]=0.5*(scalex*pow((vx_list[i]-obs_vx_list[i]),2)+scaley*pow((vy_list[i]-obs_vy_list[i]),2));
     2074        }
     2075
     2076        /*Process units: */
     2077        if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceRelVelMisfitEnum,this->parameters);
     2078
     2079        /*Apply weights to misfits*/
     2080        for (i=0;i<numgrids;i++){
     2081                misfit_list[i]=weights_list[i]*misfit_list[i];
     2082        }
     2083
     2084        /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
     2085        GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2);
     2086
     2087        /* Start  looping on the number of gaussian points: */
     2088        for (ig=0; ig<num_gauss; ig++){
     2089                /*Pick up the gaussian point: */
     2090                gauss_weight=*(gauss_weights+ig);
     2091                gauss_l1l2l3[0]=*(first_gauss_area_coord+ig);
     2092                gauss_l1l2l3[1]=*(second_gauss_area_coord+ig);
     2093                gauss_l1l2l3[2]=*(third_gauss_area_coord+ig);
     2094
     2095                /* Get Jacobian determinant: */
     2096                GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3);
     2097
     2098                /*Compute misfit at gaussian point: */
     2099                TriaRef::GetParameterValue(&misfit, &misfit_list[0],gauss_l1l2l3);
     2100
     2101                /*compute SurfaceRelVelMisfit*/
     2102                Jelem+=misfit*Jdet*gauss_weight;
     2103        }
     2104
     2105        xfree((void**)&first_gauss_area_coord);
     2106        xfree((void**)&second_gauss_area_coord);
     2107        xfree((void**)&third_gauss_area_coord);
     2108        xfree((void**)&gauss_weights);
     2109
     2110        /*Return: */
     2111        return Jelem;
     2112}
     2113/*}}}*/
     2114/*FUNCTION Tria::SurfaceLogVelMisfit {{{1*/
     2115double Tria::SurfaceLogVelMisfit(bool process_units){
     2116
     2117        int i;
     2118
     2119        /* output: */
     2120        double Jelem=0;
     2121
     2122        /* node data: */
     2123        const int    numgrids=3;
     2124        const int    numdof=2*numgrids;
     2125        const int    NDOF2=2;
     2126        double       xyz_list[numgrids][3];
     2127
     2128        /* grid data: */
     2129        double vx_list[numgrids];
     2130        double vy_list[numgrids];
     2131        double obs_vx_list[numgrids];
     2132        double obs_vy_list[numgrids];
     2133        double misfit_square_list[numgrids];
     2134        double misfit_list[numgrids];
     2135        double weights_list[numgrids];
     2136
     2137        /* gaussian points: */
     2138        int     num_gauss,ig;
     2139        double* first_gauss_area_coord  =  NULL;
     2140        double* second_gauss_area_coord =  NULL;
     2141        double* third_gauss_area_coord  =  NULL;
     2142        double* gauss_weights           =  NULL;
     2143        double  gauss_weight;
     2144        double  gauss_l1l2l3[3];
     2145        double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
     2146
     2147        /* parameters: */
     2148        double  velocity_mag,obs_velocity_mag;
     2149        double  misfit;
     2150
     2151        /* Jacobian: */
     2152        double Jdet;
     2153
     2154        /*relative and logarithmic control method :*/
     2155        double scalex=1;
     2156        double scaley=1;
     2157
     2158        /*inputs: */
     2159        bool onwater;
     2160       
     2161        double  meanvel, epsvel;
     2162
     2163        /*retrieve inputs :*/
     2164        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     2165
     2166        /*If on water, return 0: */
     2167        if(onwater)return 0;
     2168
     2169        /* Get node coordinates and dof list: */
     2170        GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
     2171
     2172        /* Recover input data: */
     2173        inputs->GetParameterValues(&obs_vx_list[0],&gaussgrids[0][0],3,VxObsEnum);
     2174        inputs->GetParameterValues(&obs_vy_list[0],&gaussgrids[0][0],3,VyObsEnum);
     2175        inputs->GetParameterValues(&vx_list[0],&gaussgrids[0][0],3,VxEnum);
     2176        inputs->GetParameterValues(&vy_list[0],&gaussgrids[0][0],3,VyEnum);
     2177        inputs->GetParameterValues(&weights_list[0],&gaussgrids[0][0],3,WeightsEnum);
     2178
     2179        /*retrieve some parameters: */
     2180        this->parameters->FindParam(&meanvel,MeanVelEnum);
     2181        this->parameters->FindParam(&epsvel,EpsVelEnum);
     2182       
     2183        /* Compute SurfaceLogVelMisfit at the 3 nodes
     2184         * Here we integrate linearized functions:
     2185         *               
     2186         * J(E) = int_E   sum_{i=1}^3  J_i Phi_i
     2187         *
     2188         * where J_i are the misfits at the 3 nodes of the triangle
     2189         *       Phi_i is the nodal function (P1) with respect to
     2190         *       the vertex i
     2191         */
     2192
     2193        /*We are using a logarithmic misfit:
     2194         *                       
     2195         *                 [        vel + eps     ] 2
     2196         * J = 4 \bar{v}^2 | log ( -----------  ) | 
     2197         *                 [       vel   + eps    ]
     2198         *                            obs
     2199         */
     2200        for (i=0;i<numgrids;i++){
     2201                velocity_mag=sqrt(pow(vx_list[i],(double)2)+pow(vy_list[i],(double)2))+epsvel; //epsvel to avoid velocity being nil.
     2202                obs_velocity_mag=sqrt(pow(obs_vx_list[i],(double)2)+pow(obs_vy_list[i],(double)2))+epsvel; //epsvel to avoid observed velocity being nil.
     2203                misfit_list[i]=4*pow(meanvel,(double)2)*pow(log(velocity_mag/obs_velocity_mag),(double)2);
     2204        }
     2205
     2206        /*Process units: */
     2207        if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceLogVelMisfitEnum,this->parameters);
     2208
     2209        /*Apply weights to misfits*/
     2210        for (i=0;i<numgrids;i++){
     2211                misfit_list[i]=weights_list[i]*misfit_list[i];
     2212        }
     2213
     2214        /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
     2215        GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2);
     2216
     2217        /* Start  looping on the number of gaussian points: */
     2218        for (ig=0; ig<num_gauss; ig++){
     2219                /*Pick up the gaussian point: */
     2220                gauss_weight=*(gauss_weights+ig);
     2221                gauss_l1l2l3[0]=*(first_gauss_area_coord+ig);
     2222                gauss_l1l2l3[1]=*(second_gauss_area_coord+ig);
     2223                gauss_l1l2l3[2]=*(third_gauss_area_coord+ig);
     2224
     2225                /* Get Jacobian determinant: */
     2226                GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3);
     2227
     2228                /*Compute misfit at gaussian point: */
     2229                TriaRef::GetParameterValue(&misfit, &misfit_list[0],gauss_l1l2l3);
     2230
     2231                /*compute SurfaceLogVelMisfit*/
     2232                Jelem+=misfit*Jdet*gauss_weight;
     2233        }
     2234
     2235        xfree((void**)&first_gauss_area_coord);
     2236        xfree((void**)&second_gauss_area_coord);
     2237        xfree((void**)&third_gauss_area_coord);
     2238        xfree((void**)&gauss_weights);
     2239               
     2240        /*Return: */
     2241        return Jelem;
     2242}
     2243/*}}}*/
     2244/*FUNCTION Tria::SurfaceLogVxVyMisfit {{{1*/
     2245double Tria::SurfaceLogVxVyMisfit(bool process_units){
     2246
     2247        int i;
     2248
     2249        /* output: */
     2250        double Jelem=0;
     2251
     2252        /* node data: */
     2253        const int    numgrids=3;
     2254        const int    numdof=2*numgrids;
     2255        const int    NDOF2=2;
     2256        double       xyz_list[numgrids][3];
     2257
     2258        /* grid data: */
     2259        double vx_list[numgrids];
     2260        double vy_list[numgrids];
     2261        double obs_vx_list[numgrids];
     2262        double obs_vy_list[numgrids];
     2263        double misfit_square_list[numgrids];
     2264        double misfit_list[numgrids];
     2265        double weights_list[numgrids];
     2266
     2267        /* gaussian points: */
     2268        int     num_gauss,ig;
     2269        double* first_gauss_area_coord  =  NULL;
     2270        double* second_gauss_area_coord =  NULL;
     2271        double* third_gauss_area_coord  =  NULL;
     2272        double* gauss_weights           =  NULL;
     2273        double  gauss_weight;
     2274        double  gauss_l1l2l3[3];
     2275        double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
     2276
     2277        /* parameters: */
     2278        double  velocity_mag,obs_velocity_mag;
     2279        double  misfit;
     2280
     2281        /* Jacobian: */
     2282        double Jdet;
     2283
     2284        /*relative and logarithmic control method :*/
     2285        double scalex=1;
     2286        double scaley=1;
     2287        double S=0;
     2288        int    fit=-1;
     2289
     2290        /*inputs: */
     2291        bool onwater;
     2292       
     2293        double  meanvel, epsvel;
     2294
     2295        /*retrieve inputs :*/
     2296        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     2297
     2298        /*If on water, return 0: */
     2299        if(onwater)return 0;
     2300
     2301        /* Get node coordinates and dof list: */
     2302        GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
     2303
     2304        /* Recover input data: */
     2305        inputs->GetParameterValues(&obs_vx_list[0],&gaussgrids[0][0],3,VxObsEnum);
     2306        inputs->GetParameterValues(&obs_vy_list[0],&gaussgrids[0][0],3,VyObsEnum);
     2307        inputs->GetParameterValues(&vx_list[0],&gaussgrids[0][0],3,VxEnum);
     2308        inputs->GetParameterValues(&vy_list[0],&gaussgrids[0][0],3,VyEnum);
     2309        inputs->GetParameterValues(&weights_list[0],&gaussgrids[0][0],3,WeightsEnum);
     2310
     2311        /*retrieve some parameters: */
     2312        this->parameters->FindParam(&meanvel,MeanVelEnum);
     2313        this->parameters->FindParam(&epsvel,EpsVelEnum);
     2314       
     2315        /* Compute SurfaceLogVxVyMisfit at the 3 nodes
     2316         * Here we integrate linearized functions:
     2317         *               
     2318         * J(E) = int_E   sum_{i=1}^3  J_i Phi_i
     2319         *
     2320         * where J_i are the misfits at the 3 nodes of the triangle
     2321         *       Phi_i is the nodal function (P1) with respect to
     2322         *       the vertex i
     2323         */
     2324
     2325        /*We are using an logarithmic 2 misfit:
     2326         *
     2327         *      1            [        |u| + eps     2          |v| + eps     2  ]
     2328         * J = --- \bar{v}^2 | log ( -----------  )   +  log ( -----------  )   | 
     2329         *      2            [       |u    |+ eps              |v    |+ eps     ]
     2330         *                              obs                       obs
     2331         */
     2332        for (i=0;i<numgrids;i++){
     2333                misfit_list[i]=0.5*pow(meanvel,(double)2)*(
     2334                                        pow(log((fabs(vx_list[i])+epsvel)/(fabs(obs_vx_list[i])+epsvel)),(double)2) +
     2335                                        pow(log((fabs(vy_list[i])+epsvel)/(fabs(obs_vy_list[i])+epsvel)),(double)2) );
     2336        }
     2337
     2338        /*Process units: */
     2339        if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceLogVxVyMisfitEnum,this->parameters);
     2340
     2341        /*Apply weights to misfits*/
     2342        for (i=0;i<numgrids;i++){
     2343                misfit_list[i]=weights_list[i]*misfit_list[i];
     2344        }
     2345
     2346        /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
     2347        GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2);
     2348
     2349        /* Start  looping on the number of gaussian points: */
     2350        for (ig=0; ig<num_gauss; ig++){
     2351                /*Pick up the gaussian point: */
     2352                gauss_weight=*(gauss_weights+ig);
     2353                gauss_l1l2l3[0]=*(first_gauss_area_coord+ig);
     2354                gauss_l1l2l3[1]=*(second_gauss_area_coord+ig);
     2355                gauss_l1l2l3[2]=*(third_gauss_area_coord+ig);
     2356
     2357                /* Get Jacobian determinant: */
     2358                GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3);
     2359
     2360                /*Compute misfit at gaussian point: */
     2361                TriaRef::GetParameterValue(&misfit, &misfit_list[0],gauss_l1l2l3);
     2362
     2363                /*compute SurfaceLogVxVyMisfit*/
     2364                Jelem+=misfit*Jdet*gauss_weight;
     2365        }
     2366
     2367        xfree((void**)&first_gauss_area_coord);
     2368        xfree((void**)&second_gauss_area_coord);
     2369        xfree((void**)&third_gauss_area_coord);
     2370        xfree((void**)&gauss_weights);
     2371               
     2372        /*Return: */
     2373        return Jelem;
     2374}
     2375/*}}}*/
     2376/*FUNCTION Tria::SurfaceAverageVelMisfit {{{1*/
     2377double Tria::SurfaceAverageVelMisfit(bool process_units){
     2378
     2379        int i;
     2380
     2381        /* output: */
     2382        double Jelem=0;
     2383
     2384        /* node data: */
     2385        const int    numgrids=3;
     2386        const int    numdof=2*numgrids;
     2387        const int    NDOF2=2;
     2388        double       xyz_list[numgrids][3];
     2389
     2390        /* grid data: */
     2391        double vx_list[numgrids];
     2392        double vy_list[numgrids];
     2393        double obs_vx_list[numgrids];
     2394        double obs_vy_list[numgrids];
     2395        double misfit_square_list[numgrids];
     2396        double misfit_list[numgrids];
     2397        double weights_list[numgrids];
     2398
     2399        /* gaussian points: */
     2400        int     num_gauss,ig;
     2401        double* first_gauss_area_coord  =  NULL;
     2402        double* second_gauss_area_coord =  NULL;
     2403        double* third_gauss_area_coord  =  NULL;
     2404        double* gauss_weights           =  NULL;
     2405        double  gauss_weight;
     2406        double  gauss_l1l2l3[3];
     2407        double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
     2408
     2409        /* parameters: */
     2410        double  velocity_mag,obs_velocity_mag;
     2411        double  misfit;
     2412
     2413        /* Jacobian: */
     2414        double Jdet;
     2415
     2416        /*relative and logarithmic control method :*/
     2417        double scalex=1;
     2418        double scaley=1;
     2419        double S=0;
     2420        int    fit=-1;
     2421
     2422        /*inputs: */
     2423        bool onwater;
     2424
     2425        double  meanvel, epsvel;
     2426
     2427        /*retrieve inputs :*/
     2428        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
     2429
     2430        /*If on water, return 0: */
     2431        if(onwater)return 0;
     2432
     2433        /* Get node coordinates and dof list: */
     2434        GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
     2435
     2436        /* Recover input data: */
     2437        inputs->GetParameterValue(&S,SurfaceAreaEnum);
     2438        inputs->GetParameterValues(&obs_vx_list[0],&gaussgrids[0][0],3,VxObsEnum);
     2439        inputs->GetParameterValues(&obs_vy_list[0],&gaussgrids[0][0],3,VyObsEnum);
     2440        inputs->GetParameterValues(&vx_list[0],&gaussgrids[0][0],3,VxEnum);
     2441        inputs->GetParameterValues(&vy_list[0],&gaussgrids[0][0],3,VyEnum);
     2442        inputs->GetParameterValues(&weights_list[0],&gaussgrids[0][0],3,WeightsEnum);
     2443
     2444        /*retrieve some parameters: */
     2445        this->parameters->FindParam(&meanvel,MeanVelEnum);
     2446        this->parameters->FindParam(&epsvel,EpsVelEnum);
     2447
     2448        /* Compute SurfaceAverageVelMisfit at the 3 nodes
     2449         * Here we integrate linearized functions:
     2450         *               
     2451         * J(E) = int_E   sum_{i=1}^3  J_i Phi_i
     2452         *
     2453         * where J_i are the misfits at the 3 nodes of the triangle
     2454         *       Phi_i is the nodal function (P1) with respect to
     2455         *       the vertex i
     2456         */
     2457
     2458        /*We are using a spacially average absolute misfit:
     2459         *
     2460         *      1                    2              2
     2461         * J = ---  sqrt(  (u - u   )  +  (v - v   )  )
     2462         *      S                obs            obs
     2463         */
     2464        for (i=0;i<numgrids;i++) misfit_square_list[i]=pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2);
     2465
     2466        /*Process units: */
     2467        if(process_units)NodalValuesUnitConversion(&misfit_square_list[0],numgrids,SurfaceAverageVelMisfitEnum,this->parameters);
     2468
     2469        /*Take the square root, and scale by surface: */
     2470        for (i=0;i<numgrids;i++)misfit_list[i]=pow(misfit_square_list[i],2)/S;
     2471
     2472        /*Apply weights to misfits*/
     2473        for (i=0;i<numgrids;i++){
     2474                misfit_list[i]=weights_list[i]*misfit_list[i];
     2475        }
     2476
     2477        /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
     2478        GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2);
     2479
     2480        /* Start  looping on the number of gaussian points: */
     2481        for (ig=0; ig<num_gauss; ig++){
     2482                /*Pick up the gaussian point: */
     2483                gauss_weight=*(gauss_weights+ig);
     2484                gauss_l1l2l3[0]=*(first_gauss_area_coord+ig);
     2485                gauss_l1l2l3[1]=*(second_gauss_area_coord+ig);
     2486                gauss_l1l2l3[2]=*(third_gauss_area_coord+ig);
     2487
     2488                /* Get Jacobian determinant: */
     2489                GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3);
     2490
     2491                /*Compute misfit at gaussian point: */
     2492                TriaRef::GetParameterValue(&misfit, &misfit_list[0],gauss_l1l2l3);
     2493
     2494                /*compute SurfaceAverageVelMisfit*/
     2495                Jelem+=misfit*Jdet*gauss_weight;
     2496        }
     2497
     2498        xfree((void**)&first_gauss_area_coord);
     2499        xfree((void**)&second_gauss_area_coord);
     2500        xfree((void**)&third_gauss_area_coord);
     2501        xfree((void**)&gauss_weights);
     2502
    20682503        /*Return: */
    20692504        return Jelem;
    … …  
    21562591        /*inputs: */
    21572592        bool onwater;
    2158         int fit;
    21592593
    21602594        /*retrieve inputs :*/
    2161         inputs->GetParameterValue(&fit,FitEnum);
    21622595        inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
    2163 
    2164         /*If fit!=3, do not compute surface: */
    2165         if(fit!=3)return 0;
    21662596
    21672597        /*If on water, return 0: */
    … …  
    44714901        double scale=0;
    44724902        double S=0;
    4473         int    fit=-1;
     4903        int    response;
    44744904
    44754905        /*retrieve some parameters: */
    … …  
    44904920        inputs->GetParameterValues(&weights_list[0],&gaussgrids[0][0],3,WeightsEnum);
    44914921
    4492         inputs->GetParameterValue(&fit,FitEnum);
    4493         if(fit==3){
     4922        inputs->GetParameterValue(&response,CmResponseEnum);
     4923        if(response==SurfaceAverageVelMisfitEnum){
    44944924                inputs->GetParameterValue(&S,SurfaceAreaEnum);
    44954925        }
    … …  
    45084938         *       the vertex i
    45094939         */
    4510         if(fit==0){
     4940        if(response==SurfaceAbsVelMisfitEnum){
    45114941                /*We are using an absolute misfit:
    45124942                 *
    … …  
    45244954                }
    45254955        }
    4526         else if(fit==1){
     4956        else if(response==SurfaceRelVelMisfitEnum){
    45274957                /*We are using a relative misfit:
    45284958                 *                       
    … …  
    45464976                }
    45474977        }
    4548         else if(fit==2){
     4978        else if(response==SurfaceLogVelMisfitEnum){
    45494979                /*We are using a logarithmic misfit:
    45504980                 *                       
    … …  
    45674997                }
    45684998        }
    4569         else if(fit==3){
     4999        else if(response==SurfaceAverageVelMisfitEnum){
    45705000                /*We are using an spacially average absolute misfit:
    45715001                 *
    … …  
    45845014                }
    45855015        }
    4586         else if(fit==4){
     5016        else if(response==SurfaceLogVxVyMisfitEnum){
    45875017                /*We are using an logarithmic 2 misfit:
    45885018                 *
    … …  
    46045034        else{
    46055035                /*Not supported yet! : */
    4606                 ISSMERROR("%s%g","unsupported type of fit: ",fit);
     5036                ISSMERROR("response %s not supported yet",EnumToString(response));
    46075037        }
    46085038
    … …  
    47105140        double S=0;
    47115141        int    fit=-1;
     5142        int    response;
    47125143
    47135144        /*retrieve some parameters: */
    … …  
    47285159        inputs->GetParameterValues(&weights_list[0],&gaussgrids[0][0],3,WeightsEnum);
    47295160
    4730         inputs->GetParameterValue(&fit,FitEnum);
    4731         if(fit==3){
     5161        inputs->GetParameterValue(&response,CmResponseEnum);
     5162        if(response==SurfaceAverageVelMisfitEnum){
    47325163                inputs->GetParameterValue(&S,SurfaceAreaEnum);
    47335164        }
    … …  
    47465177         *       the vertex i
    47475178         */
    4748         if(fit==0){
     5179        if(response==SurfaceAbsVelMisfitEnum){
    47495180                /*We are using an absolute misfit:
    47505181                 *
    … …  
    47625193                }
    47635194        }
    4764         else if(fit==1){
     5195        else if(response==SurfaceRelVelMisfitEnum){
    47655196                /*We are using a relative misfit:
    47665197                 *                       
    … …  
    47845215                }
    47855216        }
    4786         else if(fit==2){
     5217        else if(response==SurfaceLogVelMisfitEnum){
    47875218                /*We are using a logarithmic misfit:
    47885219                 *                       
    … …  
    48055236                }
    48065237        }
    4807         else if(fit==3){
     5238        else if(response==SurfaceAverageVelMisfitEnum){
    48085239                /*We are using an spacially average absolute misfit:
    48095240                 *
    … …  
    48225253                }
    48235254        }
    4824         else if(fit==4){
     5255        else if(response==SurfaceLogVxVyMisfitEnum){
    48255256                /*We are using an logarithmic 2 misfit:
    48265257                 *
    … …  
    48425273        else{
    48435274                /*Not supported yet! : */
    4844                 ISSMERROR("%s%g","unsupported type of fit: ",fit);
     5275                ISSMERROR("response %s not supported yet",EnumToString(response));
    48455276        }
    48465277
    … …  
    62986729                                name==VxObsEnum ||
    62996730                                name==VyObsEnum ||
    6300                                 name==FitEnum ||
     6731                                name==CmResponseEnum ||
    63016732                                name==DragCoefficientEnum ||
    63026733                                name==GradientEnum ||
  • issm/trunk/src/c/objects/Elements/Tria.h

    r5258 r5281  
    6868                void   Configure(Elements* elements,Loads* loads,DataSet* nodes,Materials* materials,Parameters* parameters);
    6969                void   SetCurrentConfiguration(Elements* elements,Loads* loads,DataSet* nodes,Materials* materials,Parameters* parameters);
    70                 double CostFunction(bool process_units);
     70                double RegularizeInversion(void);
    7171                void   CreateKMatrix(Mat Kgg);
    7272                void   CreatePVector(Vec pg);
    … …  
    103103                void   MinVy(double* pminvy, bool process_units);
    104104                void   MinVz(double* pminvz, bool process_units);
    105                 double Misfit(bool process_units);
     105                double SurfaceAbsVelMisfit(bool process_units);
     106                double SurfaceRelVelMisfit(bool process_units);
     107                double SurfaceLogVelMisfit(bool process_units);
     108                double SurfaceLogVxVyMisfit(bool process_units);
     109                double SurfaceAverageVelMisfit(bool process_units);
    106110                void   PatchFill(int* pcount, Patch* patch);
    107111                void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
  • issm/trunk/src/c/objects/IoModel.cpp

    r5251 r5281  
    8686        xfree((void**)&this->rheology_B);
    8787        xfree((void**)&this->rheology_n);
    88         xfree((void**)&this->fit);
     88        xfree((void**)&this->cm_responses);
    8989        xfree((void**)&this->weights);
    9090        xfree((void**)&this->cm_jump);
    … …  
    302302
    303303        /*!solution parameters: */
    304         this->fit=NULL;
     304        this->cm_responses=NULL;
    305305        this->weights=NULL;
    306306        this->cm_jump=NULL;
  • issm/trunk/src/c/objects/IoModel.h

    r5251 r5281  
    129129
    130130                /*solution parameters: */
    131                 double* fit;
     131                double* cm_responses;
    132132                double* weights;
    133133                double* cm_jump;
  • issm/trunk/src/c/solutions/control_core.cpp

    r5247 r5281  
    2626        int     solution_type;
    2727
    28         double* fit=NULL;
     28        double* responses=NULL;
    2929        double* optscal=NULL;
    3030        double* maxiter=NULL;
    … …  
    4646        femmodel->parameters->FindParam(&nsteps,NStepsEnum);
    4747        femmodel->parameters->FindParam(&control_type,ControlTypeEnum);
    48         femmodel->parameters->FindParam(&fit,NULL,FitEnum);
     48        femmodel->parameters->FindParam(&responses,NULL,CmResponsesEnum);
    4949        femmodel->parameters->FindParam(&optscal,NULL,OptScalEnum);
    5050        femmodel->parameters->FindParam(&maxiter,NULL,MaxIterEnum);
    … …  
    6565        }
    6666
    67         /*Initialize misfit: */
     67        /*Initialize responses: */
    6868        J=(double*)xmalloc(nsteps*sizeof(double));
    6969               
    … …  
    7575        for(n=0;n<nsteps;n++){
    7676
     77                /*Display info*/
    7778                _printf_("\n%s%i%s%i\n","   control method step ",n+1,"/",nsteps);
    78                 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,(int)fit[n],FitEnum);
     79                InputUpdateFromConstantx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,(int)responses[n],CmResponseEnum);
    7980               
    8081                /*In case we are running a steady state control method, compute new temperature field using new parameter distribution: */
    … …  
    9798                InputControlUpdatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,search_scalar*optscal[n],true);
    9899               
    99                 if(controlconvergence(J,fit,eps_cm,n)) break;
     100                if(controlconvergence(J,responses,eps_cm,n)) break;
    100101
    101102                /*Temporary saving every 5 control steps: */
    … …  
    117118        cleanup_and_return:
    118119        /*Free ressources: */
    119         xfree((void**)&fit);
     120        xfree((void**)&responses);
    120121        xfree((void**)&optscal);
    121122        xfree((void**)&maxiter);
  • issm/trunk/src/c/solutions/controlconvergence.cpp

    r4778 r5281  
    1818
    1919
    20 bool controlconvergence(double* J, double* fit, double eps_cm, int n){
     20bool controlconvergence(double* J,double* responses, double eps_cm, int n){
    2121
    2222        int i;
    … …  
    2929                //go through the previous misfits(starting from n-2)
    3030                while(i>=0){
    31                         if (fit[i]==fit[n]){
     31                        if (responses[i]==responses[n]){
    3232                                //convergence test only if we have the same misfits
    3333                                if ((J[i]-J[n])/J[n] <= eps_cm){
  • issm/trunk/src/c/solutions/objectivefunctionC.cpp

    r5251 r5281  
    2828       
    2929        /*parameters: */
    30         FemModel *femmodel       = NULL;
    31         int       n;
    32         double   *optscal        = NULL;
    33         double   *fit            = NULL;
    34         int       control_type;
    35         int       solution_type;
    36         int       analysis_type;
    37         bool      isstokes       = false;
    38         bool      conserve_loads = true;
    39         bool      process_units  = false;
    40        
     30        FemModel  *femmodel       = NULL;
     31        int        n;
     32        double    *optscal        = NULL;
     33        double    *responses      =NULL;
     34        int        control_type;
     35        int        solution_type;
     36        int        analysis_type;
     37        bool       isstokes       = false;
     38        bool       conserve_loads = true;
     39
    4140        /*Recover finite element model: */
    4241        femmodel=optargs->femmodel;
    … …  
    4645
    4746        femmodel->parameters->FindParam(&optscal,NULL,OptScalEnum);
    48         femmodel->parameters->FindParam(&fit,NULL,FitEnum);
     47        femmodel->parameters->FindParam(&responses,NULL,CmResponsesEnum);
    4948        femmodel->parameters->FindParam(&isstokes,IsStokesEnum);
    5049        femmodel->parameters->FindParam(&control_type,ControlTypeEnum);
    … …  
    8281
    8382        /*Compute misfit for this velocity field.*/
    84         InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,(int)fit[n],FitEnum);
    85         CostFunctionx( &J, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters,process_units);
     83        CostFunctionx( &J, femmodel->elements,femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters,(int)responses[n]);
    8684
    8785        /*Free ressources:*/
    88         xfree((void**)&fit);
     86        xfree((void**)&responses);
    8987        xfree((void**)&optscal);
    9088        return J;
  • issm/trunk/src/c/solutions/solutions.h

    r5247 r5281  
    3232//convergence:
    3333void convergence(int* pconverged, Mat K_ff,Vec p_f,Vec u_f,Vec u_f_old,Parameters* parameters);
    34 bool controlconvergence(double* J, double* fit, double eps_cm, int n);
     34bool controlconvergence(double* J, double* response, double eps_cm, int n);
    3535bool steadystateconvergence(FemModel* femmodel);
    3636
Note: See TracChangeset for help on using the changeset viewer.