Changeset 3180
- Timestamp:
- 03/04/10 09:31:08 (15 years ago)
- Location:
- issm/trunk/src/c
- Files:
-
- 3 added
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/CostFunctionx/CostFunctionx.cpp
r3169 r3180 12 12 #include "../toolkits/toolkits.h" 13 13 #include "../EnumDefinitions/EnumDefinitions.h" 14 #include "../SurfaceAreax/SurfaceAreax.h" 14 15 15 16 void CostFunctionx( double* pJ, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials,DataSet* parameters, 16 17 ParameterInputs* inputs,int analysis_type,int sub_analysis_type){ 17 18 19 /*Intermediary*/ 20 double fit; 21 double S; 22 18 23 /*output: */ 19 24 double J; … … 23 28 elements->Configure(elements,loads, nodes, materials,parameters); 24 29 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 } 25 38 26 39 /*Compute gradients: */ -
issm/trunk/src/c/DataSet/DataSet.cpp
r3169 r3180 1530 1530 } 1531 1531 1532 void 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 1532 1554 void DataSet::FieldExtrude(Vec field,double* field_serial,char* field_name, int collapse){ 1533 1555 -
issm/trunk/src/c/DataSet/DataSet.h
r3169 r3180 83 83 void Misfit(double* pJ, void* inputs,int analysis_type,int sub_analysis_type); 84 84 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); 85 86 void FieldDepthAverageAtBase(Vec field,double* field_serial,char* fieldname); 86 87 int DeleteObject(Object* object); -
issm/trunk/src/c/Dux/Dux.cpp
r2333 r3180 12 12 #include "../toolkits/toolkits.h" 13 13 #include "../EnumDefinitions/EnumDefinitions.h" 14 #include "../SurfaceAreax/SurfaceAreax.h" 14 15 15 16 void Dux( Vec* pdu_g, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials, DataSet* parameters, 16 17 ParameterInputs* inputs,int analysis_type,int sub_analysis_type){ 17 18 19 /*Intermediary*/ 18 20 int i; 19 21 int gsize; 20 22 int found; 23 double fit=-1; 24 double S; 21 25 22 26 /*output: */ … … 26 30 elements->Configure(elements,loads, nodes, materials,parameters); 27 31 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 } 28 40 29 41 /*Get size of matrix: */ -
issm/trunk/src/c/Makefile.am
r3169 r3180 233 233 ./ControlConstrainx/ControlConstrainx.h\ 234 234 ./ControlConstrainx/ControlConstrainx.cpp\ 235 ./SurfaceAreax/SurfaceAreax.h\ 236 ./SurfaceAreax/SurfaceAreax.cpp\ 235 237 ./Misfitx/Misfitx.h\ 236 238 ./Misfitx/Misfitx.cpp\ … … 561 563 ./ControlConstrainx/ControlConstrainx.h\ 562 564 ./ControlConstrainx/ControlConstrainx.cpp\ 565 ./SurfaceAreax/SurfaceAreax.h\ 566 ./SurfaceAreax/SurfaceAreax.cpp\ 563 567 ./Misfitx/Misfitx.h\ 564 568 ./Misfitx/Misfitx.cpp\ -
issm/trunk/src/c/Misfitx/Misfitx.cpp
r3169 r3180 12 12 #include "../toolkits/toolkits.h" 13 13 #include "../EnumDefinitions/EnumDefinitions.h" 14 #include "../SurfaceAreax/SurfaceAreax.h" 14 15 15 16 void Misfitx( double* pJ, DataSet* elements,DataSet* nodes, DataSet* loads, DataSet* materials,DataSet* parameters, 16 17 ParameterInputs* inputs,int analysis_type,int sub_analysis_type){ 17 18 19 /*Intermediary*/ 20 int fit; 21 double S; 22 18 23 /*output: */ 19 24 double J; … … 24 29 parameters->Configure(elements,loads, nodes, materials,parameters); 25 30 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: */ 27 40 elements->Misfit(&J,inputs,analysis_type,sub_analysis_type); 28 41 -
issm/trunk/src/c/issm.h
r3169 r3180 53 53 #include "./Orthx/Orthx.h" 54 54 #include "./Misfitx/Misfitx.h" 55 #include "./SurfaceAreax/SurfaceAreax.h" 55 56 #include "./CostFunctionx/CostFunctionx.h" 56 57 #include "./ControlConstrainx/ControlConstrainx.h" -
issm/trunk/src/c/objects/Beam.cpp
r3169 r3180 697 697 } 698 698 /*}}}*/ 699 /*FUNCTION Beam SurfaceArea{{{1*/ 700 #undef __FUNCT__ 701 #define __FUNCT__ "Beam::SurfaceArea" 702 double Beam::SurfaceArea(void*,int,int){ 703 throw ErrorException(__FUNCT__," not supported yet!"); 704 } 705 /*}}}*/ 699 706 /*FUNCTION Beam UpdateFromInputs{{{1*/ 700 707 #undef __FUNCT__ -
issm/trunk/src/c/objects/Beam.h
r3169 r3180 88 88 void GradjB(_p_Vec*, void*, int,int ); 89 89 double Misfit(void*,int,int); 90 double SurfaceArea(void*,int,int); 90 91 double CostFunction(void*,int,int); 91 92 void GetNodalFunctions(double* l1l2, double gauss_coord); -
issm/trunk/src/c/objects/Element.h
r3169 r3180 15 15 16 16 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; 40 40 virtual double Misfit(void* inputs,int analysis_type,int sub_analysis_type)=0; 41 41 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; 43 44 virtual double MassFlux(double* segment,double* ug)=0; 44 45 45 int Enum();46 int Enum(); 46 47 47 48 }; -
issm/trunk/src/c/objects/Input.cpp
r2911 r3180 225 225 } 226 226 /*}}}*/ 227 /*FUNCTION Input::IsPresent {{{1*/ 228 int Input::IsPresent(char* input_name){ 229 if (strcmp(input_name,name)==0) return 1; 230 else return 0; 231 } 232 /*}}}*/ 227 233 /*FUNCTION Input::IsSameName {{{1*/ 228 234 int Input::IsSameName(char* input_name){ -
issm/trunk/src/c/objects/Input.h
r803 r3180 53 53 /*Input specific routines: */ 54 54 int IsSameName(char* input_name); 55 int IsPresent(char* input_name); 55 56 void Recover(double* values, int ndof, int* dofs,int numnodes,void** nodes); 56 57 void Recover(int* pinteger); -
issm/trunk/src/c/objects/ParameterInputs.cpp
r3053 r3180 183 183 184 184 return ug; 185 } 186 /*}}}*/ 187 /*FUNCTION ParameterInputs::IsPresent(char* name,char* string) {{{1*/ 188 int 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; 185 202 } 186 203 /*}}}*/ -
issm/trunk/src/c/objects/ParameterInputs.h
r803 r3180 35 35 36 36 Vec Get(char* field_name,int* dofs, int numdofs); 37 int IsPresent(char* name); 37 38 38 39 /*declaration found in io: */ -
issm/trunk/src/c/objects/Penta.cpp
r3169 r3180 4209 4209 } 4210 4210 /*}}}*/ 4211 /*FUNCTION SurfaceArea {{{1*/ 4212 #undef __FUNCT__ 4213 #define __FUNCT__ "Penta::SurfaceArea" 4214 double 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 /*}}}*/ 4211 4246 /*FUNCTION SurfaceNormal {{{1*/ 4212 4247 #undef __FUNCT__ -
issm/trunk/src/c/objects/Penta.h
r3169 r3180 89 89 void GradjB(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type); 90 90 double Misfit(void* inputs,int analysis_type,int sub_analysis_type); 91 double SurfaceArea(void* inputs,int analysis_type,int sub_analysis_type); 91 92 double CostFunction(void* inputs,int analysis_type,int sub_analysis_type); 92 93 -
issm/trunk/src/c/objects/Sing.cpp
r3169 r3180 532 532 } 533 533 /*}}}*/ 534 /*FUNCTION Sing::SurfaceArea {{{1*/ 535 #undef __FUNCT__ 536 #define __FUNCT__ "Sing::SurfaceArea" 537 double Sing::SurfaceArea(void*, int,int){ 538 throw ErrorException(__FUNCT__," not supported yet!"); 539 } 540 /*}}}*/ 534 541 /*FUNCTION Sing::UpdateFromInputs {{{1*/ 535 542 #undef __FUNCT__ -
issm/trunk/src/c/objects/Sing.h
r3169 r3180 83 83 void GradjB(_p_Vec*, void*, int,int); 84 84 double Misfit(void*,int,int); 85 double SurfaceArea(void*,int,int); 85 86 double CostFunction(void*,int,int); 86 87 double MassFlux(double* segment,double* ug); -
issm/trunk/src/c/objects/Tria.cpp
r3169 r3180 2866 2866 double obs_vx_list[numgrids]; 2867 2867 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]; 2874 2870 2875 2871 /* gaussian points: */ … … 2884 2880 /* parameters: */ 2885 2881 double obs_velocity_mag,velocity_mag; 2886 double absolutex,absolutey,relativex,relativey,logarithmicx,logarithmicy;2882 double dux,duy; 2887 2883 2888 2884 /*element vector : */ … … 2900 2896 double scaley=0; 2901 2897 double scale=0; 2902 double fit=-1; 2898 double S=0; 2899 double fit=-1; 2903 2900 2904 2901 ParameterInputs* inputs=NULL; … … 2918 2915 if(!inputs->Recover("velocity_obs",&obs_vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){ 2919 2916 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"); 2920 2920 } 2921 2921 if(!inputs->Recover("velocity",&vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){ … … 2934 2934 /*We are using an absolute misfit: */ 2935 2935 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]; 2938 2938 } 2939 2939 } … … 2945 2945 if(obs_vx_list[i]==0)scalex=0; 2946 2946 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]); 2949 2949 } 2950 2950 } … … 2955 2955 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. 2956 2956 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]); 2959 2967 } 2960 2968 } … … 2994 3002 2995 3003 /*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]; 3038 3013 } 3039 3014 … … 3047 3022 VecSetValues(du_g,numdof,doflist,(const double*)due_g,ADD_VALUES); 3048 3023 3049 cleanup_and_return:3050 3024 xfree((void**)&first_gauss_area_coord); 3051 3025 xfree((void**)&second_gauss_area_coord); … … 4446 4420 double obs_vx_list[numgrids]; 4447 4421 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]; 4451 4423 4452 4424 /* gaussian points: */ … … 4461 4433 /* parameters: */ 4462 4434 double velocity_mag,obs_velocity_mag; 4463 double absolute,relative,logarithmic;4435 double misfit; 4464 4436 4465 4437 /* Jacobian: */ … … 4469 4441 double scalex=1; 4470 4442 double scaley=1; 4471 double fit=-1; 4443 double S=0; 4444 double fit=-1; 4472 4445 4473 4446 ParameterInputs* inputs=NULL; … … 4484 4457 /* Recover input data: */ 4485 4458 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 } 4486 4462 if(!inputs->Recover("velocity_obs",&obs_vxvy_list[0][0],2,dofs2,numgrids,(void**)nodes)){ 4487 4463 throw ErrorException(__FUNCT__,"missing velocity_obs input parameter"); … … 4503 4479 /*We are using an absolute misfit: */ 4504 4480 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)); 4506 4482 } 4507 4483 } … … 4513 4489 if(obs_vx_list[i]==0)scalex=0; 4514 4490 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)); 4516 4492 } 4517 4493 } … … 4521 4497 velocity_mag=sqrt(pow(vx_list[i],(double)2)+pow(vy_list[i],(double)2))+numpar->epsvel; //epsvel to avoid velocity being nil. 4522 4498 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; 4524 4506 } 4525 4507 } … … 4543 4525 GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3); 4544 4526 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; 4569 4532 } 4570 4533 … … 4635 4598 *(surface_normal+2)=normal[2]/normal_norm; 4636 4599 4600 } 4601 /*}}}*/ 4602 /*FUNCTION SurfaceArea {{{1*/ 4603 #undef __FUNCT__ 4604 #define __FUNCT__ "Tria::SurfaceArea" 4605 double 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; 4637 4638 } 4638 4639 /*}}}*/ -
issm/trunk/src/c/objects/Tria.h
r3169 r3180 100 100 void GradjB(Vec grad_g,void* inputs,int analysis_type,int sub_analysis_type); 101 101 double Misfit(void* inputs,int analysis_type,int sub_analysis_type); 102 double SurfaceArea(void* inputs,int analysis_type,int sub_analysis_type); 102 103 double CostFunction(void* inputs,int analysis_type,int sub_analysis_type); 103 104
Note:
See TracChangeset
for help on using the changeset viewer.