Changeset 3180


Ignore:
Timestamp:
03/04/10 09:31:08 (15 years ago)
Author:
Mathieu Morlighem
Message:

Added Misfit 3

Location:
issm/trunk/src/c
Files:
3 added
20 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/CostFunctionx/CostFunctionx.cpp

    r3169 r3180  
    1212#include "../toolkits/toolkits.h"
    1313#include "../EnumDefinitions/EnumDefinitions.h"
     14#include "../SurfaceAreax/SurfaceAreax.h"
    1415
    1516void CostFunctionx( double* pJ, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials,DataSet* parameters,
    1617                        ParameterInputs* inputs,int analysis_type,int sub_analysis_type){
    17        
     18
     19        /*Intermediary*/
     20        double fit;
     21        double S;
     22
    1823        /*output: */
    1924        double J;
     
    2328        elements->Configure(elements,loads, nodes, materials,parameters);
    2429        parameters->Configure(elements,loads, nodes, materials,parameters);
     30
     31        /*If fit=3, compute Surface Area*/
     32        if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter");
     33        if (fit==3 && !inputs->IsPresent("surfacearea")){
     34
     35                SurfaceAreax(&S,elements,nodes,loads,materials,parameters,inputs,analysis_type,sub_analysis_type);
     36                inputs->Add("surfacearea",S);
     37        }
    2538
    2639        /*Compute gradients: */
  • issm/trunk/src/c/DataSet/DataSet.cpp

    r3169 r3180  
    15301530}
    15311531
     1532void  DataSet::SurfaceArea(double* pS,void* inputs,int analysis_type,int sub_analysis_type){
     1533
     1534        double S=0;;
     1535
     1536        vector<Object*>::iterator object;
     1537        Element* element=NULL;
     1538
     1539        for ( object=objects.begin() ; object < objects.end(); object++ ){
     1540
     1541                if(EnumIsElement((*object)->Enum())){
     1542
     1543                        element=(Element*)(*object);
     1544                        S+=element->SurfaceArea(inputs,analysis_type,sub_analysis_type);
     1545
     1546                }
     1547        }
     1548
     1549        /*Assign output pointers:*/
     1550        *pS=S;
     1551
     1552}
     1553
    15321554void  DataSet::FieldExtrude(Vec field,double* field_serial,char* field_name, int collapse){
    15331555
  • issm/trunk/src/c/DataSet/DataSet.h

    r3169 r3180  
    8383                void  Misfit(double* pJ, void* inputs,int analysis_type,int sub_analysis_type);
    8484                void  CostFunction(double* pJ, void* inputs,int analysis_type,int sub_analysis_type);
     85                void  SurfaceArea(double* pS, void* inputs,int analysis_type,int sub_analysis_type);
    8586                void  FieldDepthAverageAtBase(Vec field,double* field_serial,char* fieldname);
    8687                int   DeleteObject(Object* object);
  • issm/trunk/src/c/Dux/Dux.cpp

    r2333 r3180  
    1212#include "../toolkits/toolkits.h"
    1313#include "../EnumDefinitions/EnumDefinitions.h"
     14#include "../SurfaceAreax/SurfaceAreax.h"
    1415
    1516void Dux( Vec* pdu_g, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, DataSet* parameters,
    1617                        ParameterInputs* inputs,int analysis_type,int sub_analysis_type){
    1718
     19        /*Intermediary*/
    1820        int i;
    1921        int gsize;
    2022        int found;
     23        double fit=-1;
     24        double S;
    2125
    2226        /*output: */
     
    2630        elements->Configure(elements,loads, nodes, materials,parameters);
    2731        parameters->Configure(elements,loads, nodes, materials,parameters);
     32
     33        /*If fit=3, compute Surface Area*/
     34        if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter");
     35        if (fit==3 && !inputs->IsPresent("surfacearea")){
     36
     37                SurfaceAreax(&S,elements,nodes,loads,materials,parameters,inputs,analysis_type,sub_analysis_type);
     38                inputs->Add("surfacearea",S);
     39        }
    2840
    2941        /*Get size of matrix: */
  • issm/trunk/src/c/Makefile.am

    r3169 r3180  
    233233                                        ./ControlConstrainx/ControlConstrainx.h\
    234234                                        ./ControlConstrainx/ControlConstrainx.cpp\
     235                                        ./SurfaceAreax/SurfaceAreax.h\
     236                                        ./SurfaceAreax/SurfaceAreax.cpp\
    235237                                        ./Misfitx/Misfitx.h\
    236238                                        ./Misfitx/Misfitx.cpp\
     
    561563                                        ./ControlConstrainx/ControlConstrainx.h\
    562564                                        ./ControlConstrainx/ControlConstrainx.cpp\
     565                                        ./SurfaceAreax/SurfaceAreax.h\
     566                                        ./SurfaceAreax/SurfaceAreax.cpp\
    563567                                        ./Misfitx/Misfitx.h\
    564568                                        ./Misfitx/Misfitx.cpp\
  • issm/trunk/src/c/Misfitx/Misfitx.cpp

    r3169 r3180  
    1212#include "../toolkits/toolkits.h"
    1313#include "../EnumDefinitions/EnumDefinitions.h"
     14#include "../SurfaceAreax/SurfaceAreax.h"
    1415
    1516void Misfitx( double* pJ, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials,DataSet* parameters,
    1617                        ParameterInputs* inputs,int analysis_type,int sub_analysis_type){
    1718       
     19        /*Intermediary*/
     20        int fit;
     21        double S;
     22
    1823        /*output: */
    1924        double J;
     
    2429        parameters->Configure(elements,loads, nodes, materials,parameters);
    2530
    26         /*Compute gradients: */
     31        /*If fit=3, compute Surface Area*/
     32        if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter");
     33        if (fit==3 && !inputs->IsPresent("surfacearea")){
     34
     35                SurfaceAreax(&S,elements,nodes,loads,materials,parameters,inputs,analysis_type,sub_analysis_type);
     36                inputs->Add("surfacearea",S);
     37        }
     38
     39        /*Compute Misfit: */
    2740        elements->Misfit(&J,inputs,analysis_type,sub_analysis_type);
    2841
  • issm/trunk/src/c/issm.h

    r3169 r3180  
    5353#include "./Orthx/Orthx.h"
    5454#include "./Misfitx/Misfitx.h"
     55#include "./SurfaceAreax/SurfaceAreax.h"
    5556#include "./CostFunctionx/CostFunctionx.h"
    5657#include "./ControlConstrainx/ControlConstrainx.h"
  • issm/trunk/src/c/objects/Beam.cpp

    r3169 r3180  
    697697}
    698698/*}}}*/
     699/*FUNCTION Beam SurfaceArea{{{1*/
     700#undef __FUNCT__
     701#define __FUNCT__ "Beam::SurfaceArea"
     702double Beam::SurfaceArea(void*,int,int){
     703        throw ErrorException(__FUNCT__," not supported yet!");
     704}
     705/*}}}*/
    699706/*FUNCTION Beam UpdateFromInputs{{{1*/
    700707#undef __FUNCT__
  • issm/trunk/src/c/objects/Beam.h

    r3169 r3180  
    8888                void  GradjB(_p_Vec*, void*, int,int );
    8989                double Misfit(void*,int,int);
     90                double SurfaceArea(void*,int,int);
    9091                double CostFunction(void*,int,int);
    9192                void  GetNodalFunctions(double* l1l2, double gauss_coord);
  • issm/trunk/src/c/objects/Element.h

    r3169 r3180  
    1515
    1616        public:
    17                 virtual       ~Element(){};
    18                 virtual void  Echo()=0;
    19                 virtual void  DeepEcho()=0;
    20                 virtual int   GetId()=0;
    21                 virtual int   MyRank()=0;
    22                 virtual void  Marshall(char** pmarshalled_dataset)=0;
    23                 virtual int   MarshallSize()=0;
    24                 virtual char* GetName()=0;
    25                 virtual void  Demarshall(char** pmarshalled_dataset)=0;
    26                 virtual void  Configure(void* loads,void* nodes,void* materials,void* parameters)=0;
    27                 virtual void  CreateKMatrix(Mat Kgg,void* inputs,int analysis_type,int sub_analysis_type)=0;
    28                 virtual void  CreatePVector(Vec pg, void* inputs, int analysis_type,int sub_analysis_type)=0;
    29                 virtual void  UpdateFromInputs(void* inputs)=0;
    30                 virtual void  GetNodes(void** nodes)=0;
    31                 virtual void* GetMatPar()=0;
    32                 virtual int   GetShelf()=0;
    33                 virtual int   GetOnBed()=0;
    34                 virtual void  GetThicknessList(double* thickness_list)=0;
    35                 virtual void  GetBedList(double* bed_list)=0;
    36                 virtual void  Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
    37                 virtual void  Gradj(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type)=0;
    38                 virtual void  GradjDrag(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
    39                 virtual void  GradjB(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
     17                virtual        ~Element(){};
     18                virtual void   Echo()=0;
     19                virtual void   DeepEcho()=0;
     20                virtual int    GetId()=0;
     21                virtual int    MyRank()=0;
     22                virtual void   Marshall(char** pmarshalled_dataset)=0;
     23                virtual int    MarshallSize()=0;
     24                virtual char*  GetName()=0;
     25                virtual void   Demarshall(char** pmarshalled_dataset)=0;
     26                virtual void   Configure(void* loads,void* nodes,void* materials,void* parameters)=0;
     27                virtual void   CreateKMatrix(Mat Kgg,void* inputs,int analysis_type,int sub_analysis_type)=0;
     28                virtual void   CreatePVector(Vec pg, void* inputs, int analysis_type,int sub_analysis_type)=0;
     29                virtual void   UpdateFromInputs(void* inputs)=0;
     30                virtual void   GetNodes(void** nodes)=0;
     31                virtual void*  GetMatPar()=0;
     32                virtual int    GetShelf()=0;
     33                virtual int    GetOnBed()=0;
     34                virtual void   GetThicknessList(double* thickness_list)=0;
     35                virtual void   GetBedList(double* bed_list)=0;
     36                virtual void   Du(Vec du_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
     37                virtual void   Gradj(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type,char* control_type)=0;
     38                virtual void   GradjDrag(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
     39                virtual void   GradjB(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type)=0;
    4040                virtual double Misfit(void* inputs,int analysis_type,int sub_analysis_type)=0;
    4141                virtual double CostFunction(void* inputs,int analysis_type,int sub_analysis_type)=0;
    42                 virtual void  ComputePressure(Vec p_g)=0;
     42                virtual double SurfaceArea(void* inputs,int analysis_type,int sub_analysis_type)=0;
     43                virtual void   ComputePressure(Vec p_g)=0;
    4344                virtual double MassFlux(double* segment,double* ug)=0;
    4445
    45                 int           Enum();
     46                int            Enum();
    4647               
    4748};
  • issm/trunk/src/c/objects/Input.cpp

    r2911 r3180  
    225225}
    226226/*}}}*/
     227/*FUNCTION Input::IsPresent {{{1*/
     228int   Input::IsPresent(char* input_name){
     229        if (strcmp(input_name,name)==0) return 1;
     230        else return 0;
     231}
     232/*}}}*/
    227233/*FUNCTION Input::IsSameName {{{1*/
    228234int   Input::IsSameName(char* input_name){
  • issm/trunk/src/c/objects/Input.h

    r803 r3180  
    5353                /*Input specific routines: */
    5454                int   IsSameName(char* input_name);
     55                int   IsPresent(char* input_name);
    5556                void  Recover(double* values, int ndof, int* dofs,int numnodes,void** nodes);
    5657                void  Recover(int* pinteger);
  • issm/trunk/src/c/objects/ParameterInputs.cpp

    r3053 r3180  
    183183
    184184        return ug;
     185}
     186/*}}}*/
     187/*FUNCTION ParameterInputs::IsPresent(char* name,char* string) {{{1*/
     188int ParameterInputs::IsPresent(char* name){
     189
     190        /*Intermediary*/
     191        int i;
     192        Input* input=NULL;
     193
     194        /*Go through dataset, and figure out if the input is present*/
     195        for(i=0;i<dataset->Size();i++){
     196                input=(Input*)dataset->GetObjectByOffset(i);
     197                if (input->IsPresent(name)) return 1;
     198        }
     199
     200        /*Input not found... return 0*/
     201        return 0;
    185202}
    186203/*}}}*/
  • issm/trunk/src/c/objects/ParameterInputs.h

    r803 r3180  
    3535
    3636                Vec  Get(char* field_name,int* dofs, int numdofs);
     37                int  IsPresent(char* name);
    3738
    3839                /*declaration found in io: */
  • issm/trunk/src/c/objects/Penta.cpp

    r3169 r3180  
    42094209}
    42104210/*}}}*/
     4211/*FUNCTION SurfaceArea {{{1*/
     4212#undef __FUNCT__
     4213#define __FUNCT__ "Penta::SurfaceArea"
     4214double Penta::SurfaceArea(void* inputs,int analysis_type,int sub_analysis_type){
     4215
     4216        double S;
     4217        Tria* tria=NULL;
     4218
     4219        /*If on water, return 0: */
     4220        if(onwater)return 0;
     4221
     4222        /*Bail out if this element if:
     4223         * -> Non collapsed and not on the surface
     4224         * -> collapsed (2d model) and not on bed) */
     4225        if ((!collapse && !onsurface) || (collapse && !onbed)){
     4226                return 0;
     4227        }
     4228        else if (collapse){
     4229
     4230                /*This element should be collapsed into a tria element at its base. Create this tria element,
     4231                 * and compute SurfaceArea*/
     4232                tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria (lower face).
     4233                S=tria->SurfaceArea(inputs,analysis_type,sub_analysis_type);
     4234                delete tria;
     4235                return S;
     4236        }
     4237        else{
     4238
     4239                tria=(Tria*)SpawnTria(3,4,5); //grids 3, 4 and 5 make the new tria (upper face).
     4240                S=tria->SurfaceArea(inputs,analysis_type,sub_analysis_type);
     4241                delete tria;
     4242                return S;
     4243        }
     4244}
     4245/*}}}*/
    42114246/*FUNCTION SurfaceNormal {{{1*/
    42124247#undef __FUNCT__
  • issm/trunk/src/c/objects/Penta.h

    r3169 r3180  
    8989                void  GradjB(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type);
    9090                double Misfit(void* inputs,int analysis_type,int sub_analysis_type);
     91                double SurfaceArea(void* inputs,int analysis_type,int sub_analysis_type);
    9192                double CostFunction(void* inputs,int analysis_type,int sub_analysis_type);
    9293               
  • issm/trunk/src/c/objects/Sing.cpp

    r3169 r3180  
    532532}
    533533/*}}}*/
     534/*FUNCTION Sing::SurfaceArea {{{1*/
     535#undef __FUNCT__
     536#define __FUNCT__ "Sing::SurfaceArea"
     537double Sing::SurfaceArea(void*, int,int){
     538        throw ErrorException(__FUNCT__," not supported yet!");
     539}
     540/*}}}*/
    534541/*FUNCTION Sing::UpdateFromInputs {{{1*/
    535542#undef __FUNCT__
  • issm/trunk/src/c/objects/Sing.h

    r3169 r3180  
    8383                void  GradjB(_p_Vec*, void*, int,int);
    8484                double Misfit(void*,int,int);
     85                double SurfaceArea(void*,int,int);
    8586                double CostFunction(void*,int,int);
    8687                double MassFlux(double* segment,double* ug);
  • issm/trunk/src/c/objects/Tria.cpp

    r3169 r3180  
    28662866        double obs_vx_list[numgrids];
    28672867        double obs_vy_list[numgrids];
    2868         double absolutex_list[numgrids];
    2869         double absolutey_list[numgrids];
    2870         double relativex_list[numgrids];
    2871         double relativey_list[numgrids];
    2872         double logarithmicx_list[numgrids];
    2873         double logarithmicy_list[numgrids];
     2868        double dux_list[numgrids];
     2869        double duy_list[numgrids];
    28742870
    28752871        /* gaussian points: */
     
    28842880        /* parameters: */
    28852881        double  obs_velocity_mag,velocity_mag;
    2886         double  absolutex,absolutey,relativex,relativey,logarithmicx,logarithmicy;
     2882        double  dux,duy;
    28872883
    28882884        /*element vector : */
     
    29002896        double scaley=0;
    29012897        double scale=0;
    2902         double  fit=-1;
     2898        double S=0;
     2899        double fit=-1;
    29032900
    29042901        ParameterInputs* inputs=NULL;
     
    29182915        if(!inputs->Recover("velocity_obs",&obs_vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
    29192916                throw ErrorException(__FUNCT__,"missing velocity_obs input parameter");
     2917        }
     2918        if(fit==3 && !inputs->Recover("surfacearea",&S)){
     2919                throw ErrorException(__FUNCT__,"missing surface area input parameter");
    29202920        }
    29212921        if(!inputs->Recover("velocity",&vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
     
    29342934                /*We are using an absolute misfit: */
    29352935                for (i=0;i<numgrids;i++){
    2936                         absolutex_list[i]=obs_vx_list[i]-vx_list[i];
    2937                         absolutey_list[i]=obs_vy_list[i]-vy_list[i];
     2936                        dux_list[i]=obs_vx_list[i]-vx_list[i];
     2937                        duy_list[i]=obs_vy_list[i]-vy_list[i];
    29382938                }
    29392939        }
     
    29452945                        if(obs_vx_list[i]==0)scalex=0;
    29462946                        if(obs_vy_list[i]==0)scaley=0;
    2947                         relativex_list[i]=scalex*(obs_vx_list[i]-vx_list[i]);
    2948                         relativey_list[i]=scaley*(obs_vy_list[i]-vy_list[i]);
     2947                        dux_list[i]=scalex*(obs_vx_list[i]-vx_list[i]);
     2948                        duy_list[i]=scaley*(obs_vy_list[i]-vy_list[i]);
    29492949                }
    29502950        }
     
    29552955                        obs_velocity_mag=sqrt(pow(obs_vx_list[i],2)+pow(obs_vy_list[i],2))+numpar->epsvel; //epsvel to avoid observed velocity being nil.
    29562956                        scale=-8*pow(numpar->meanvel,2)/pow(velocity_mag,2)*log(velocity_mag/obs_velocity_mag);
    2957                         logarithmicx_list[i]=scale*vx_list[i];
    2958                         logarithmicy_list[i]=scale*vy_list[i];
     2957                        dux_list[i]=scale*vx_list[i];
     2958                        duy_list[i]=scale*vy_list[i];
     2959                }
     2960        }
     2961        else if(fit==3){
     2962                /*We are using an spacially average absolute misfit: */
     2963                for (i=0;i<numgrids;i++){
     2964                        scale=1.0/(S*sqrt(pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2))+numpar->epsvel);
     2965                        dux_list[i]=scale*(obs_vx_list[i]-vx_list[i]);
     2966                        duy_list[i]=scale*(obs_vy_list[i]-vy_list[i]);
    29592967                }
    29602968        }
     
    29943002
    29953003                /*Build due_g_gaussian vector: we have three cases here, according to which type of misfit we are using. */
    2996                 if(fit==0){
    2997                         /*We are using an absolute misfit: */
    2998 
    2999                         /*Compute absolute(x/y) at gaussian point: */
    3000                         GetParameterValue(&absolutex, &absolutex_list[0],gauss_l1l2l3);
    3001                         GetParameterValue(&absolutey, &absolutey_list[0],gauss_l1l2l3);
    3002 
    3003                         /*compute Du*/
    3004                         for (i=0;i<numgrids;i++){
    3005                                 due_g_gaussian[i*NDOF2+0]=absolutex*Jdet*gauss_weight*l1l2l3[i];
    3006                                 due_g_gaussian[i*NDOF2+1]=absolutey*Jdet*gauss_weight*l1l2l3[i];
    3007                         }
    3008                 }
    3009                 else if(fit==1){
    3010                         /*We are using a relative misfit: */
    3011 
    3012                         /*Compute relative(x/y) at gaussian point: */
    3013                         GetParameterValue(&relativex, &relativex_list[0],gauss_l1l2l3);
    3014                         GetParameterValue(&relativey, &relativey_list[0],gauss_l1l2l3);
    3015 
    3016                         /*compute Du*/
    3017                         for (i=0;i<numgrids;i++){
    3018                                 due_g_gaussian[i*NDOF2+0]=relativex*Jdet*gauss_weight*l1l2l3[i];
    3019                                 due_g_gaussian[i*NDOF2+1]=relativey*Jdet*gauss_weight*l1l2l3[i];
    3020                         }
    3021                 }
    3022                 else if(fit==2){
    3023                         /*We are using a logarithmic misfit: */
    3024 
    3025                         /*Compute logarithmic(x/y) at gaussian point: */
    3026                         GetParameterValue(&logarithmicx, &logarithmicx_list[0],gauss_l1l2l3);
    3027                         GetParameterValue(&logarithmicy, &logarithmicy_list[0],gauss_l1l2l3);
    3028 
    3029                         /*compute Du*/
    3030                         for (i=0;i<numgrids;i++){
    3031                                 due_g_gaussian[i*NDOF2+0]=logarithmicx*Jdet*gauss_weight*l1l2l3[i];
    3032                                 due_g_gaussian[i*NDOF2+1]=logarithmicy*Jdet*gauss_weight*l1l2l3[i];
    3033                         }
    3034                 }
    3035                 else{
    3036                         /*Not supported yet! : */
    3037                         throw ErrorException(__FUNCT__,exprintf("%s%g","unsupported type of fit: ",fit));
     3004
     3005                /*Compute absolute(x/y) at gaussian point: */
     3006                GetParameterValue(&dux, &dux_list[0],gauss_l1l2l3);
     3007                GetParameterValue(&duy, &duy_list[0],gauss_l1l2l3);
     3008
     3009                /*compute Du*/
     3010                for (i=0;i<numgrids;i++){
     3011                        due_g_gaussian[i*NDOF2+0]=dux*Jdet*gauss_weight*l1l2l3[i];
     3012                        due_g_gaussian[i*NDOF2+1]=duy*Jdet*gauss_weight*l1l2l3[i];
    30383013                }
    30393014
     
    30473022        VecSetValues(du_g,numdof,doflist,(const double*)due_g,ADD_VALUES);
    30483023
    3049 cleanup_and_return:
    30503024        xfree((void**)&first_gauss_area_coord);
    30513025        xfree((void**)&second_gauss_area_coord);
     
    44464420        double obs_vx_list[numgrids];
    44474421        double obs_vy_list[numgrids];
    4448         double absolute_list[numgrids];
    4449         double relative_list[numgrids];
    4450         double logarithmic_list[numgrids];
     4422        double misfit_list[numgrids];
    44514423
    44524424        /* gaussian points: */
     
    44614433        /* parameters: */
    44624434        double  velocity_mag,obs_velocity_mag;
    4463         double  absolute,relative,logarithmic;
     4435        double  misfit;
    44644436
    44654437        /* Jacobian: */
     
    44694441        double scalex=1;
    44704442        double scaley=1;
    4471         double  fit=-1;
     4443        double S=0;
     4444        double fit=-1;
    44724445
    44734446        ParameterInputs* inputs=NULL;
     
    44844457        /* Recover input data: */
    44854458        if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter");
     4459        if(fit==3 && !inputs->Recover("surfacearea",&S)){
     4460                throw ErrorException(__FUNCT__,"missing surface area input parameter");
     4461        }
    44864462        if(!inputs->Recover("velocity_obs",&obs_vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){
    44874463                throw ErrorException(__FUNCT__,"missing velocity_obs input parameter");
     
    45034479                /*We are using an absolute misfit: */
    45044480                for (i=0;i<numgrids;i++){
    4505                         absolute_list[i]=0.5*(pow((vx_list[i]-obs_vx_list[i]),(double)2)+pow((vy_list[i]-obs_vy_list[i]),(double)2));
     4481                        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));
    45064482                }
    45074483        }
     
    45134489                        if(obs_vx_list[i]==0)scalex=0;
    45144490                        if(obs_vy_list[i]==0)scaley=0;
    4515                         relative_list[i]=0.5*(scalex*pow((vx_list[i]-obs_vx_list[i]),2)+scaley*pow((vy_list[i]-obs_vy_list[i]),2));
     4491                        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));
    45164492                }
    45174493        }
     
    45214497                        velocity_mag=sqrt(pow(vx_list[i],(double)2)+pow(vy_list[i],(double)2))+numpar->epsvel; //epsvel to avoid velocity being nil.
    45224498                        obs_velocity_mag=sqrt(pow(obs_vx_list[i],(double)2)+pow(obs_vy_list[i],(double)2))+numpar->epsvel; //epsvel to avoid observed velocity being nil.
    4523                         logarithmic_list[i]=4*pow(numpar->meanvel,(double)2)*pow(log(velocity_mag/obs_velocity_mag),(double)2);
     4499                        misfit_list[i]=4*pow(numpar->meanvel,(double)2)*pow(log(velocity_mag/obs_velocity_mag),(double)2);
     4500                }
     4501        }
     4502        else if(fit==3){
     4503                /*We are using an spacially average absolute misfit: */
     4504                for (i=0;i<numgrids;i++){
     4505                        misfit_list[i]=sqrt(pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2))/S;
    45244506                }
    45254507        }
     
    45434525                GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3);
    45444526
    4545                 /*Differents misfits are allowed: */
    4546                 if(fit==0){
    4547                         /*Compute absolute misfit at gaussian point: */
    4548                         GetParameterValue(&absolute, &absolute_list[0],gauss_l1l2l3);
    4549 
    4550                         /*compute Misfit*/
    4551                         Jelem+=absolute*Jdet*gauss_weight;
    4552                 }
    4553                 else if(fit==1){
    4554                         /*Compute relative misfit at gaussian point: */
    4555                         GetParameterValue(&relative, &relative_list[0],gauss_l1l2l3);
    4556 
    4557                         /*compute Misfit*/
    4558                         Jelem+=relative*Jdet*gauss_weight;
    4559                 }       
    4560                 else if(fit==2){
    4561                         /*Compute logarithmic misfit at gaussian point: */
    4562                         GetParameterValue(&logarithmic, &logarithmic_list[0],gauss_l1l2l3);
    4563 
    4564                         /*compute Misfit*/
    4565                         Jelem+=logarithmic*Jdet*gauss_weight;
    4566                 }
    4567                 else throw ErrorException(__FUNCT__,exprintf("%s%i%s","fit type",fit," not supported yet!"));
    4568 
     4527                /*Compute misfit at gaussian point: */
     4528                GetParameterValue(&misfit, &misfit_list[0],gauss_l1l2l3);
     4529
     4530                /*compute Misfit*/
     4531                Jelem+=misfit*Jdet*gauss_weight;
    45694532        }
    45704533
     
    46354598        *(surface_normal+2)=normal[2]/normal_norm;
    46364599
     4600}
     4601/*}}}*/
     4602/*FUNCTION SurfaceArea {{{1*/
     4603#undef __FUNCT__
     4604#define __FUNCT__ "Tria::SurfaceArea"
     4605double Tria::SurfaceArea(void* vinputs,int analysis_type,int sub_analysis_type){
     4606
     4607        int i;
     4608
     4609        /* output: */
     4610        double S;
     4611
     4612        /* node data: */
     4613        int numgrids=3;
     4614        double xyz_list[numgrids][3];
     4615        double v13[3];
     4616        double v23[3];
     4617        double normal[3];
     4618
     4619        /*If on water, return 0: */
     4620        if(onwater)return 0;
     4621
     4622        /* Get node coordinates and dof list: */
     4623        GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
     4624
     4625        for (i=0;i<3;i++){
     4626                v13[i]=xyz_list[0][i]-xyz_list[2][i];
     4627                v23[i]=xyz_list[1][i]-xyz_list[2][i];
     4628        }
     4629
     4630        normal[0]=v13[1]*v23[2]-v13[2]*v23[1];
     4631        normal[1]=v13[2]*v23[0]-v13[0]*v23[2];
     4632        normal[2]=v13[0]*v23[1]-v13[1]*v23[0];
     4633
     4634        S = 0.5 * sqrt(pow(normal[0],(double)2)+pow(normal[1],(double)2)+pow(normal[2],(double)2));
     4635
     4636        /*Return: */
     4637        return S;
    46374638}
    46384639/*}}}*/
  • issm/trunk/src/c/objects/Tria.h

    r3169 r3180  
    100100                void  GradjB(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type);
    101101                double Misfit(void* inputs,int analysis_type,int sub_analysis_type);
     102                double SurfaceArea(void* inputs,int analysis_type,int sub_analysis_type);
    102103                double CostFunction(void* inputs,int analysis_type,int sub_analysis_type);
    103104
Note: See TracChangeset for help on using the changeset viewer.