Changeset 246
- Timestamp:
- 05/05/09 14:11:46 (16 years ago)
- Location:
- issm/trunk/src
- Files:
-
- 12 added
- 45 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/DataSet/DataSet.cpp
r202 r246 881 881 #undef __FUNCT__ 882 882 #define __FUNCT__ "DataSet::CreateKMatrix" 883 void DataSet::CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type){883 void DataSet::CreateKMatrix(Mat Kgg,void* inputs,int analysis_type){ 884 884 885 885 vector<Object*>::iterator object; … … 905 905 #undef __FUNCT__ 906 906 #define __FUNCT__ "DataSet::CreatePVector" 907 void DataSet::CreatePVector(Vec pg, ParameterInputs* inputs,int analysis_type){907 void DataSet::CreatePVector(Vec pg,void* inputs,int analysis_type){ 908 908 909 909 vector<Object*>::iterator object; … … 929 929 #undef __FUNCT__ 930 930 #define __FUNCT__ "UpdateFromInputs" 931 void DataSet::UpdateFromInputs( ParameterInputs* inputs){931 void DataSet::UpdateFromInputs(void* inputs){ 932 932 933 933 vector<Object*>::iterator object; … … 965 965 #undef __FUNCT__ 966 966 #define __FUNCT__ "DataSet::PenaltyCreateKMatrix" 967 void DataSet::PenaltyCreateKMatrix(Mat Kgg, ParameterInputs* inputs,double kmax,int analysis_type){967 void DataSet::PenaltyCreateKMatrix(Mat Kgg,void* inputs,double kmax,int analysis_type){ 968 968 969 969 vector<Object*>::iterator object; … … 983 983 #undef __FUNCT__ 984 984 #define __FUNCT__ "DataSet::PenaltyCreatePVector" 985 void DataSet::PenaltyCreatePVector(Vec pg, ParameterInputs* inputs,double kmax,int analysis_type){985 void DataSet::PenaltyCreatePVector(Vec pg,void* inputs,double kmax,int analysis_type){ 986 986 987 987 vector<Object*>::iterator object; … … 1009 1009 #undef __FUNCT__ 1010 1010 #define __FUNCT__ "RiftConstraints" 1011 void DataSet::RiftConstraints(int* pnum_unstable_constraints, ParameterInputs* inputs,int analysis_type){1011 void DataSet::RiftConstraints(int* pnum_unstable_constraints,void* inputs,int analysis_type){ 1012 1012 1013 1013 throw ErrorException(__FUNCT__," not implemented yet!"); … … 1026 1026 #undef __FUNCT__ 1027 1027 #define __FUNCT__ "MeltingConstraints" 1028 void DataSet::MeltingConstraints(int* pnum_unstable_constraints, ParameterInputs* inputs,int analysis_type){1028 void DataSet::MeltingConstraints(int* pnum_unstable_constraints,void* inputs,int analysis_type){ 1029 1029 1030 1030 throw ErrorException(__FUNCT__," not implemented yet!"); … … 1065 1065 1066 1066 1067 void DataSet::Du(Vec du_g,double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type){1067 void DataSet::Du(Vec du_g,double* u_g,double* u_g_obs,void* inputs,int analysis_type){ 1068 1068 1069 1069 … … 1083 1083 } 1084 1084 1085 void DataSet::Gradj(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type,char* control_type){1085 void DataSet::Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,char* control_type){ 1086 1086 1087 1087 … … 1101 1101 } 1102 1102 1103 void DataSet::Misfit(double* pJ, double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type){1103 void DataSet::Misfit(double* pJ, double* u_g,double* u_g_obs,void* inputs,int analysis_type){ 1104 1104 1105 1105 double J=0;; -
issm/trunk/src/c/DataSet/DataSet.h
r202 r246 10 10 #define DATASET_H_ 11 11 12 #include "../objects/Object.h"13 #include "../objects/ParameterInputs.h"14 12 #include <vector> 15 13 #include "../toolkits/toolkits.h" 14 #include "../objects/objects.h" 16 15 17 using namespace std; 18 19 class DataSet { 16 class DataSet{ 20 17 21 18 private: 19 22 20 /*internals: */ 23 vector<Object*> objects;21 std::vector<Object*> objects; 24 22 25 23 /*type of dataset: */ … … 63 61 void SetSorting(int* in_sorted_ids,int* in_id_offsets); 64 62 void Sort(); 65 void CreateKMatrix(Mat Kgg, ParameterInputs* inputs, int analysis_type);66 void CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type);67 void UpdateFromInputs( ParameterInputs* inputs);68 void PenaltyCreateKMatrix(Mat Kgg, ParameterInputs* inputs,double kmax,int analysis_type);69 void PenaltyCreatePVector(Vec pg, ParameterInputs* inputs,double kmax,int analysis_type);63 void CreateKMatrix(Mat Kgg,void* inputs, int analysis_type); 64 void CreatePVector(Vec pg,void* inputs, int analysis_type); 65 void UpdateFromInputs(void* inputs); 66 void PenaltyCreateKMatrix(Mat Kgg,void* inputs,double kmax,int analysis_type); 67 void PenaltyCreatePVector(Vec pg,void* inputs,double kmax,int analysis_type); 70 68 int RiftIsPresent(); 71 void RiftConstraints(int* pnum_unstable_constraints, ParameterInputs* inputs,int analysis_type);69 void RiftConstraints(int* pnum_unstable_constraints,void* inputs,int analysis_type); 72 70 int MeltingIsPresent(); 73 void MeltingConstraints(int* pnum_unstable_constraints, ParameterInputs* inputs,int analysis_type);71 void MeltingConstraints(int* pnum_unstable_constraints,void* inputs,int analysis_type); 74 72 DataSet* Copy(void); 75 void Du(Vec du_g,double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type);76 void Gradj(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type,char* control_type);77 void Misfit(double* pJ, double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type);73 void Du(Vec du_g,double* u_g,double* u_g_obs,void* inputs,int analysis_type); 74 void Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,char* control_type); 75 void Misfit(double* pJ, double* u_g,double* u_g_obs,void* inputs,int analysis_type); 78 76 void VelocityExtrude(Vec ug,double* ug_serial); 79 77 int DeleteObject(Object* object); 80 78 81 82 83 79 }; 84 85 80 86 81 /*This routine cannot be object oriented, but need for demarshalling: */ -
issm/trunk/src/c/EnumDefinitions/EnumDefinitions.cpp
r128 r246 57 57 int StokesEnum(void){ return 4; } 58 58 59 /*inputs: */ 60 int InputEnum(void){ return 310; } 61 62 59 63 60 64 /*functions on enums: */ -
issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
r128 r246 21 21 int LoadEnum(void); 22 22 int RgbEnum(void); 23 int InputEnum(void); 23 24 24 25 /*formulations: */ -
issm/trunk/src/c/Makefile.am
r132 r246 42 42 ./objects/Matpar.h\ 43 43 ./objects/Matpar.cpp\ 44 ./objects/Input.h\ 45 ./objects/Input.cpp\ 44 46 ./objects/ParameterInputs.h\ 45 47 ./objects/ParameterInputs.cpp\ … … 262 264 ./objects/Matpar.h\ 263 265 ./objects/Matpar.cpp\ 266 ./objects/Input.h\ 267 ./objects/Input.cpp\ 264 268 ./objects/ParameterInputs.h\ 265 269 ./objects/ParameterInputs.cpp\ -
issm/trunk/src/c/UpdateFromInputsx/UpdateFromInputsx.cpp
r137 r246 26 26 loads->Configure(elements, loads, nodes, materials); 27 27 nodes->Configure(elements, loads, nodes, materials); 28 28 29 29 /*Update elements, nodes, loads and materials from inputs: */ 30 30 elements->UpdateFromInputs(inputs); -
issm/trunk/src/c/io/ParameterInputsInit.cpp
r1 r246 9 9 #endif 10 10 11 #ifdef _SERIAL_12 11 13 12 #include "../objects/objects.h" … … 18 17 #undef __FUNCT__ 19 18 #define __FUNCT__ "ParameterInputsInit" 20 void ParameterInputsInit(ParameterInputs** pinputs, const mxArray* inputhandle){ 21 22 int dummy; 19 20 #ifdef _SERIAL_ 21 void ParameterInputs::Init( void* vinput_handle){ 22 23 23 int i; 24 24 int nelems; 25 int field_name_length; 25 mxArray* input=NULL; 26 const char* field_name=NULL; 27 ConstDataHandle input_handle=NULL; 28 int type; 29 30 char* string=NULL; 31 char* name=NULL; 32 double scalar; 33 int integer; 34 int ndof; 35 int numberofnodes; 36 double* vector=NULL; 37 38 input_handle=(ConstDataHandle)vinput_handle; 26 39 27 /* output: */28 ParameterInputs* inputs=NULL;40 /*number of inputs: */ 41 nelems=mxGetNumberOfElements(input_handle); 29 42 30 /* First allocate ParameterInputs: */31 inputs=NewParameterInputs();43 /*Go through ParameterInputs matlab structure, and recover each input object. Use it for fill 44 * the ParameterInputs* "C" class object: */ 32 45 33 /*Now populate the structure: */46 for(i=0;i<nelems;i++){ 34 47 35 /*How many fields? :*/ 36 inputs->nfields = mxGetNumberOfFields(inputhandle); //tells us how many parameters we have 37 38 /*Check that we don't have a multi-dimensional structure array: */ 39 nelems = mxGetNumberOfElements(inputhandle); 40 41 if(nelems!=1){ 42 _printf_("%s%s\n",__FUNCT__," error message: input parameter structure must be of size 1!"); 43 mexErrMsgTxt(" "); 44 } 45 46 /*Allocate fields and field names: */ 47 inputs->fields=(double**)xmalloc(inputs->nfields*sizeof(double*)); 48 inputs->field_names=(char**)xmalloc(inputs->nfields*sizeof(char*)); 49 inputs->fields_length=(int*)xmalloc(inputs->nfields*sizeof(int)); 48 /*Get i'th matlab input: */ 49 input=mxGetField(input_handle,i,"input"); 50 50 51 /*Initialize, we never know: */ 52 for(i=0;i<inputs->nfields;i++){ 53 inputs->fields[i]=NULL; 54 inputs->field_names[i]=NULL; 55 inputs->fields_length[i]=0; 51 /*This input has the following fields: name, type, string, integer, double, and vector. Plus ndof and numberofnodes: */ 52 //first get type 53 type=(int)*mxGetPr(mxGetField(input,0,"type")); 54 55 /*Get name: */ 56 name=mxArrayToString(mxGetField(input,0,"name")); 57 58 if (strcmp(name,"")==0)continue; //this input has no name! can't register it. keep going. 59 60 //string 61 switch(type){ 62 case 0: 63 //we have a string, recover it. 64 string=mxArrayToString(mxGetField(input,0,"string")); 65 //add to inputs. 66 this->Add(name,string); 67 xfree((void**)&string); 68 break; 69 case 1: 70 //integer 71 integer=(int)*(mxGetPr(mxGetField(input,0,"integer"))); 72 this->Add(name,integer); 73 break; 74 case 2: 75 //double 76 scalar=(double)*(mxGetPr(mxGetField(input,0,"double"))); 77 this->Add(name,scalar); 78 break; 79 case 3: 80 //double vector 81 vector=mxGetPr(mxGetField(input,0,"vector")); 82 ndof=(int)*(mxGetPr(mxGetField(input,0,"ndof"))); 83 numberofnodes=(int)*(mxGetPr(mxGetField(input,0,"numberofnodes"))); 84 this->Add(name,vector,ndof,numberofnodes); 85 break; 86 default: 87 throw ErrorException(__FUNCT__,exprintf("%s%i"," unknow parameter input type ",type)); 88 } 89 56 90 } 57 91 58 92 59 /*Go through input structure fields and populate our ParameterInputs object:*/60 for (i=0;i<inputs->nfields;i++){61 62 /*Recover field value: */63 FetchData((void**)&inputs->fields[i],&inputs->fields_length[i],&dummy,mxGetFieldByNumber( inputhandle,0,i),"Matrix","Mat");64 65 /*Recover field name: */66 const char* field_name=mxGetFieldNameByNumber(inputhandle,i);67 field_name_length=strlen(field_name)+1;68 inputs->field_names[i]=(char*)xmalloc(field_name_length*sizeof(char));69 strcpy(inputs->field_names[i],field_name);70 }71 72 /*Assign output poiters:*/73 *pinputs=inputs;74 75 93 } 94 #else 95 void ParameterInputs::Init( void* vinput_handle){ 96 } 76 97 #endif //#ifdef _SERIAL- -
issm/trunk/src/c/objects/Element.cpp
r1 r246 5 5 6 6 7 #include "./Object.h"8 7 #include "./Element.h" 9 8 #include "../EnumDefinitions/EnumDefinitions.h" 10 #include "stdio.h"11 #include "../DataSet/DataSet.h"12 9 13 10 int Element::Enum(void){ -
issm/trunk/src/c/objects/Element.h
r1 r246 10 10 11 11 #include "./Object.h" 12 #include "./ParameterInputs.h"13 12 #include "../toolkits/toolkits.h" 14 #include "./Node.h"15 #include "./Matpar.h"16 13 17 14 class Element: public Object{ … … 27 24 virtual void Demarshall(char** pmarshalled_dataset)=0; 28 25 virtual void Configure(void* loads,void* nodes,void* materials)=0; 29 virtual void CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type)=0;30 virtual void CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type)=0;31 virtual void UpdateFromInputs( ParameterInputs* inputs)=0;32 virtual void GetNodes( Node** nodes)=0;33 virtual Matpar* GetMatPar()=0;26 virtual void CreateKMatrix(Mat Kgg,void* inputs,int analysis_type)=0; 27 virtual void CreatePVector(Vec pg, void* inputs, int analysis_type)=0; 28 virtual void UpdateFromInputs(void* inputs)=0; 29 virtual void GetNodes(void** nodes)=0; 30 virtual void* GetMatPar()=0; 34 31 virtual int GetShelf()=0; 35 32 virtual int GetOnBed()=0; 36 virtual void 37 virtual void 38 virtual void Du(Vec du_g,double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type)=0;39 virtual void Gradj(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type,char* control_type)=0;40 virtual void GradjDrag(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type)=0;41 virtual void GradjB(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type)=0;42 virtual double Misfit(double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type)=0;33 virtual void GetThicknessList(double* thickness_list)=0; 34 virtual void GetBedList(double* bed_list)=0; 35 virtual void Du(Vec du_g,double* u_g,double* u_g_obs,void* inputs,int analysis_type)=0; 36 virtual void Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,char* control_type)=0; 37 virtual void GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type)=0; 38 virtual void GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type)=0; 39 virtual double Misfit(double* u_g,double* u_g_obs,void* inputs,int analysis_type)=0; 43 40 44 41 int Enum(); -
issm/trunk/src/c/objects/FemModel.h
r1 r246 9 9 #include "../DataSet/DataSet.h" 10 10 11 struct FemModel { 12 11 class DataSet; 12 13 struct FemModel{ 14 13 15 DataSet* elements; 14 16 DataSet* nodes; -
issm/trunk/src/c/objects/Icefront.cpp
r181 r246 240 240 #define __FUNCT__ "Icefront::CreateKMatrix" 241 241 242 void Icefront::CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type){242 void Icefront::CreateKMatrix(Mat Kgg,void* inputs,int analysis_type){ 243 243 244 244 /*No stiffness loads applied, do nothing: */ … … 250 250 #undef __FUNCT__ 251 251 #define __FUNCT__ "Icefront::CreatePVector" 252 void Icefront::CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type){252 void Icefront::CreatePVector(Vec pg, void* inputs, int analysis_type){ 253 253 254 254 /*Just branch to the correct element icefront vector generator, according to the type of analysis we are carrying out: */ … … 264 264 #undef __FUNCT__ 265 265 #define __FUNCT__ "Icefront::CreatePVectorDiagnosticHoriz" 266 void Icefront::CreatePVectorDiagnosticHoriz( Vec pg, ParameterInputs* inputs, int analysis_type){266 void Icefront::CreatePVectorDiagnosticHoriz( Vec pg, void* inputs, int analysis_type){ 267 267 268 268 /*Branck on the type of icefront: */ … … 278 278 #define __FUNCT__ "Icefront::CreatePVectorDiagnosticHorizSegment" 279 279 280 void Icefront::CreatePVectorDiagnosticHorizSegment( Vec pg, ParameterInputs*inputs, int analysis_type){280 void Icefront::CreatePVectorDiagnosticHorizSegment( Vec pg,void* vinputs, int analysis_type){ 281 281 282 282 int i,j; … … 306 306 Matpar* matpar=NULL; 307 307 Node** element_nodes=NULL; 308 ParameterInputs* inputs=NULL; 309 310 inputs=(ParameterInputs*)vinputs; 308 311 309 312 /*Recover material and fill parameters: */ 310 matpar= element->GetMatPar();313 matpar=(Matpar*)element->GetMatPar(); 311 314 fill=element->GetShelf(); 312 315 … … 323 326 if(element_type==TriaEnum())element_nodes=(Node**)xmalloc(3*sizeof(Node*)); 324 327 if(element_type==PentaEnum())element_nodes=(Node**)xmalloc(6*sizeof(Node*)); 325 element->GetNodes( element_nodes);328 element->GetNodes((void**)element_nodes); 326 329 327 330 /*go through first 3 grids (all grids for tria, bed grids for penta) and identify 1st and 2nd grid: */ … … 389 392 #undef __FUNCT__ 390 393 #define __FUNCT__ "Icefont::CreatePVectorDiagnosticHorizQuad" 391 void Icefront::CreatePVectorDiagnosticHorizQuad( Vec pg, ParameterInputs*inputs, int analysis_type){394 void Icefront::CreatePVectorDiagnosticHorizQuad( Vec pg,void* vinputs, int analysis_type){ 392 395 393 396 int i,j; … … 413 416 Matpar* matpar=NULL; 414 417 Node** element_nodes=NULL; 418 ParameterInputs* inputs=NULL; 415 419 416 420 /*quad grids: */ … … 427 431 double v35[3]; 428 432 double v45[3]; 429 433 434 inputs=(ParameterInputs*)vinputs; 430 435 431 436 /*check icefront is associated to a pentaelem: */ … … 434 439 } 435 440 /*Recover material and fill parameters: */ 436 matpar= element->GetMatPar();441 matpar=(Matpar*)element->GetMatPar(); 437 442 fill=element->GetShelf(); 438 443 … … 446 451 //Identify which grids are comprised in the quad: 447 452 if(element_type==PentaEnum())element_nodes=(Node**)xmalloc(6*sizeof(Node*)); 448 element->GetNodes( element_nodes);453 element->GetNodes((void**)element_nodes); 449 454 450 455 grid1=-1; grid2=-1; grid3=-1; grid4=-1; … … 549 554 #undef __FUNCT__ 550 555 #define __FUNCT__ "Icefront::UpdateFromInputs" 551 void Icefront::UpdateFromInputs( ParameterInputs*inputs){556 void Icefront::UpdateFromInputs(void* vinputs){ 552 557 553 558 int i; … … 561 566 double* h_param=NULL; 562 567 double* b_param=NULL; 563 564 /*Get dof list: */ 565 nodes[0]->GetDofList(&doflist0[0],&numberofdofspernode); 566 nodes[1]->GetDofList(&doflist1[0],&numberofdofspernode); 568 int dofs[1]={0}; 569 570 ParameterInputs* inputs=NULL; 571 572 inputs=(ParameterInputs*)vinputs; 573 567 574 if(strcmp(type,"quad")==0){ 568 nodes[2]->GetDofList(&doflist2[0],&numberofdofspernode); 569 nodes[3]->GetDofList(&doflist3[0],&numberofdofspernode); 570 } 571 572 /*Update internal data if inputs holds new values: */ 573 h_param=ParameterInputsRecover(inputs,"thickness"); 574 b_param=ParameterInputsRecover(inputs,"bed"); 575 576 if(h_param){ 577 h[0]=h_param[doflist0[0]]; 578 h[1]=h_param[doflist1[0]]; 579 if(strcmp(type,"quad")==0){ 580 h[2]=h_param[doflist2[0]]; 581 h[3]=h_param[doflist3[0]]; 582 } 583 } 584 585 if(b_param){ 586 b[0]=b_param[doflist0[0]]; 587 b[1]=b_param[doflist1[0]]; 588 if(strcmp(type,"quad")==0){ 589 b[2]=b_param[doflist2[0]]; 590 b[3]=b_param[doflist3[0]]; 591 } 592 } 575 inputs->Recover("thickness",&h[0],1,dofs,4,(void**)nodes); 576 inputs->Recover("bed",&b[0],1,dofs,4,(void**)nodes); 577 } 578 else{ 579 inputs->Recover("thickness",&h[0],1,dofs,2,(void**)nodes); 580 inputs->Recover("bed",&h[0],1,dofs,2,(void**)nodes); 581 } 582 593 583 594 584 } … … 699 689 #undef __FUNCT__ 700 690 #define __FUNCT__ "Icefront::PenaltyCreateKMatrix" 701 void Icefront::PenaltyCreateKMatrix(Mat Kgg, ParameterInputs* inputs,double kmax,int analysis_type){691 void Icefront::PenaltyCreateKMatrix(Mat Kgg,void* inputs,double kmax,int analysis_type){ 702 692 /*do nothing: */ 703 693 } … … 705 695 #undef __FUNCT__ 706 696 #define __FUNCT__ "Icefront::PenaltyCreatePVector" 707 void Icefront::PenaltyCreatePVector(Vec pg, ParameterInputs* inputs,double kmax,int analysis_type){697 void Icefront::PenaltyCreatePVector(Vec pg,void* inputs,double kmax,int analysis_type){ 708 698 /*do nothing: */ 709 699 } -
issm/trunk/src/c/objects/Icefront.h
r94 r246 14 14 #define ICEFRONTSTRING 20 //max string length 15 15 16 class Element; 16 17 class Icefront: public Load { 17 18 … … 56 57 void DistributeNumDofs(int* numdofspernode,int analysis_type); 57 58 void Configure(void* elements,void* nodes,void* materials); 58 void CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type);59 void UpdateFromInputs( ParameterInputs* inputs);59 void CreateKMatrix(Mat Kgg,void* inputs,int analysis_type); 60 void UpdateFromInputs(void* inputs); 60 61 61 void CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type);62 void CreatePVectorDiagnosticHoriz( Vec pg, ParameterInputs* inputs, int analysis_type);63 void CreatePVectorDiagnosticHorizSegment( Vec pg, ParameterInputs* inputs, int analysis_type);64 void CreatePVectorDiagnosticHorizQuad( Vec pg, ParameterInputs* inputs, int analysis_type);62 void CreatePVector(Vec pg, void* inputs, int analysis_type); 63 void CreatePVectorDiagnosticHoriz( Vec pg, void* inputs, int analysis_type); 64 void CreatePVectorDiagnosticHorizSegment( Vec pg,void* inputs, int analysis_type); 65 void CreatePVectorDiagnosticHorizQuad( Vec pg,void* inputs, int analysis_type); 65 66 void GetDofList(int* doflist,int* pnumberofdofs); 66 67 void SegmentPressureLoad(double* pe_g,double rho_water,double rho_ice,double gravity, double* thickness_list, double* bed_list, double* normal,double length,int fill); 67 68 void QuadPressureLoad(double* pe_g,double rho_water,double rho_ice,double gravity, double* thickness_list, double* bed_list, 68 69 double* normal1,double* normal2,double* normal3,double* normal4,double* xyz_list, int fill); 69 void PenaltyCreateKMatrix(Mat Kgg, ParameterInputs* inputs,double kmax,int analysis_type);70 void PenaltyCreatePVector(Vec pg, ParameterInputs* inputs,double kmax,int analysis_type);70 void PenaltyCreateKMatrix(Mat Kgg,void* inputs,double kmax,int analysis_type); 71 void PenaltyCreatePVector(Vec pg,void* inputs,double kmax,int analysis_type); 71 72 Object* copy(); 72 73 }; -
issm/trunk/src/c/objects/Load.cpp
r1 r246 5 5 6 6 7 #include "./Object.h"8 7 #include "./Load.h" 9 8 #include "../EnumDefinitions/EnumDefinitions.h" 10 #include "stdio.h"11 #include "../DataSet/DataSet.h"12 9 13 10 int Load::Enum(void){ -
issm/trunk/src/c/objects/Load.h
r1 r246 10 10 11 11 #include "./Object.h" 12 #include "./ParameterInputs.h"13 12 #include "../toolkits/toolkits.h" 14 13 … … 25 24 virtual void Demarshall(char** pmarshalled_dataset)=0; 26 25 virtual void Configure(void* elements,void* nodes,void* materials)=0; 27 virtual void CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type)=0;28 virtual void CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type)=0;29 virtual void UpdateFromInputs( ParameterInputs* inputs)=0;30 virtual void PenaltyCreateKMatrix(Mat Kgg, ParameterInputs* inputs,double kmax,int analysis_type)=0;31 virtual void PenaltyCreatePVector(Vec pg, ParameterInputs* inputs,double kmax,int analysis_type)=0;26 virtual void CreateKMatrix(Mat Kgg,void* inputs,int analysis_type)=0; 27 virtual void CreatePVector(Vec pg, void* inputs, int analysis_type)=0; 28 virtual void UpdateFromInputs(void* inputs)=0; 29 virtual void PenaltyCreateKMatrix(Mat Kgg,void* inputs,double kmax,int analysis_type)=0; 30 virtual void PenaltyCreatePVector(Vec pg,void* inputs,double kmax,int analysis_type)=0; 32 31 33 32 int Enum(); -
issm/trunk/src/c/objects/Material.cpp
r1 r246 5 5 6 6 7 #include "./Object.h"8 7 #include "./Material.h" 9 8 #include "../EnumDefinitions/EnumDefinitions.h" 10 #include "stdio.h"11 #include "../DataSet/DataSet.h"12 9 13 10 int Material::Enum(void){ -
issm/trunk/src/c/objects/Material.h
r1 r246 8 8 9 9 #include "./Object.h" 10 #include "./ParameterInputs.h"11 10 #include "../toolkits/toolkits.h" 12 11 … … 22 21 virtual char* GetName()=0; 23 22 virtual void Demarshall(char** pmarshalled_dataset)=0; 24 virtual void UpdateFromInputs( ParameterInputs* inputs)=0;23 virtual void UpdateFromInputs(void* inputs)=0; 25 24 int Enum(); 26 25 -
issm/trunk/src/c/objects/Matice.cpp
r89 r246 107 107 #undef __FUNCT__ 108 108 #define __FUNCT__ "Matice::UpdateFromInputs" 109 void Matice::UpdateFromInputs( ParameterInputs* inputs){109 void Matice::UpdateFromInputs(void* inputs){ 110 110 111 111 //throw ErrorException(__FUNCT__," not supported yet!"); -
issm/trunk/src/c/objects/Matice.h
r90 r246 30 30 int MyRank(); 31 31 void DistributeNumDofs(int* numdofspernode,int analysis_type); 32 void UpdateFromInputs( ParameterInputs* inputs);32 void UpdateFromInputs(void* inputs); 33 33 void SetB(double B_param); 34 34 void GetViscosity2d(double* pviscosity, double* pepsilon); -
issm/trunk/src/c/objects/Matpar.cpp
r111 r246 153 153 #undef __FUNCT__ 154 154 #define __FUNCT__ "Matpar::UpdateFromInputs" 155 void Matpar::UpdateFromInputs( ParameterInputs* inputs){155 void Matpar::UpdateFromInputs(void* inputs){ 156 156 157 157 //throw ErrorException(__FUNCT__," not supported yet!"); -
issm/trunk/src/c/objects/Matpar.h
r111 r246 40 40 int MyRank(); 41 41 void DistributeNumDofs(int* numdofspernode,int analysis_type); 42 void UpdateFromInputs( ParameterInputs* inputs);42 void UpdateFromInputs(void* inputs); 43 43 double GetG(); 44 44 double GetRhoIce(); -
issm/trunk/src/c/objects/Node.cpp
r202 r246 437 437 #undef __FUNCT__ 438 438 #define __FUNCT__ "Node::UpdateFromInputs" 439 void Node::UpdateFromInputs(ParameterInputs* inputs){ 440 441 int doflist[MAXDOFSPERNODE*3]; 442 int numberofdofspernode; 443 444 /*element: */ 445 double* x_param=NULL; 446 double* y_param=NULL; 447 double* z_param=NULL; 448 449 /*Get dof list: */ 450 GetDofList(&doflist[0],&numberofdofspernode); 439 void Node::UpdateFromInputs(void* vinputs){ 440 441 ParameterInputs* inputs=NULL; 442 Node* node=this; 443 int* dof={0}; 444 445 /*Recover parameter inputs: */ 446 inputs=(ParameterInputs*)vinputs; 451 447 452 448 /*Update internal data if inputs holds new values: */ 453 x_param=ParameterInputsRecover(inputs,"x"); 454 y_param=ParameterInputsRecover(inputs,"y"); 455 z_param=ParameterInputsRecover(inputs,"z"); 456 457 if(x_param)x[0]=x_param[doflist[0]]; 458 if(y_param)x[1]=y_param[doflist[0]]; 459 if(y_param)x[2]=z_param[doflist[0]]; 460 449 inputs->Recover("x",&x[0],1,dof,1,(void**)&node); 450 inputs->Recover("y",&x[1],1,dof,1,(void**)&node); 451 inputs->Recover("z",&x[2],1,dof,1,(void**)&node); 452 453 461 454 } 462 455 … … 494 487 495 488 } 489 490 int Node::GetDoflist1(void){ 491 return doflist1[0]; 492 } -
issm/trunk/src/c/objects/Node.h
r202 r246 8 8 #include "./Object.h" 9 9 #include "../toolkits/toolkits.h" 10 #include "./ParameterInputs.h"11 10 12 11 #define MAXDOFSPERNODE 4 … … 67 66 void CreateVecSets(Vec pv_g,Vec pv_m,Vec pv_n,Vec pv_f,Vec pv_s); 68 67 void GetDofList(int* outdoflist,int* pnumberofdofspernode); 68 int GetDoflist1(void); 69 69 double GetX(); 70 70 double GetY(); 71 71 double GetZ(); 72 72 Object* copy(); 73 void UpdateFromInputs( ParameterInputs* inputs);73 void UpdateFromInputs(void* inputs); 74 74 void Configure(void* pnodes); 75 75 Node* GetUpperNode(); -
issm/trunk/src/c/objects/OptArgs.h
r46 r246 24 24 #include "./FemModel.h" 25 25 #include "./ParameterInputs.h" 26 class ParameterInputs; 26 27 27 28 struct OptArgs{ -
issm/trunk/src/c/objects/ParameterInputs.cpp
r1 r246 1 /*!\file: ParameterInputs.cpp 2 * \brief routines for loading from matlab the parameter inputs to our non-linear iterations. 3 */ 4 5 6 #include "./ParameterInputs.h" 1 /*!\file ParameterInputs.c 2 * \brief: implementation of the ParameterInputs object 3 */ 4 5 6 #ifdef HAVE_CONFIG_H 7 #include "config.h" 8 #else 9 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!" 10 #endif 11 12 #include "stdio.h" 13 #include <string.h> 14 #include "../EnumDefinitions/EnumDefinitions.h" 7 15 #include "../shared/shared.h" 16 #include "../include/typedefs.h" 8 17 #include "../include/macros.h" 9 10 /*-------------------------------------------------- 11 NewParameterInputs 12 --------------------------------------------------*/ 13 14 ParameterInputs* NewParameterInputs(void) { 15 16 ParameterInputs* inputs=NULL; 17 18 inputs=(ParameterInputs*)xmalloc(sizeof(ParameterInputs)); 19 20 inputs->nfields=0; 21 inputs->fields=NULL; 22 inputs->field_names=NULL; 23 inputs->fields_length=NULL; 24 25 return inputs; 26 } 27 28 29 /*-------------------------------------------------- 30 ParameterInputsEcho 31 --------------------------------------------------*/ 32 int ParameterInputsEcho(ParameterInputs* inputs,int longecho){ 33 34 int noerr=1; 35 int i,j; 36 37 /*short echo: */ 38 if(!longecho){ 39 _printf_("field names, field pointers: \n"); 40 for (i=0;i<inputs->nfields;i++){ 41 _printf_("%s: %p\n",inputs->field_names[i],inputs->fields[i]); 42 } 43 } 44 /*long echo: */ 45 else{ 46 for (i=0;i<inputs->nfields;i++){ 47 double* values=inputs->fields[i]; 48 _printf_("field names: %s\n",inputs->field_names[i]); 49 _printf_("field values: \n"); 50 for(j=0;j<inputs->fields_length[i];j++){ 51 printf(" %g\n",values[j]); 52 } 53 } 54 } 55 return noerr; 56 } 57 58 /*-------------------------------------------------- 59 ParameterInputsRecover 60 --------------------------------------------------*/ 61 double* ParameterInputsRecover(ParameterInputs* inputs,char* field_name){ 62 63 double* param=NULL; 64 int i; 65 66 /*Find field_name input field, and return the value: */ 67 for(i=0;i<inputs->nfields;i++){ 68 if (strcmp(inputs->field_names[i],field_name)==0){ 69 param=inputs->fields[i]; 70 } 71 } 72 return param; 73 } 74 75 /*-------------------------------------------------- 76 DeleteParameterInputs 77 --------------------------------------------------*/ 78 void DeleteParameterInputs(ParameterInputs** pinputs){ 79 80 ParameterInputs* inputs=NULL; 81 int i; 82 char* field_name=NULL; 83 double* field=NULL; 84 85 #ifdef _PARALLEL_ //inputs operation is only done on the cluster, on the serial side, we leave the matlab memory manager handle inputs. 86 inputs=*pinputs; 87 88 if(inputs){ 89 90 for(i=0;i<inputs->nfields;i++){ 91 field_name=inputs->field_names[i]; 92 xfree((void**)&field_name); 93 94 /*In parallel, erase: */ 95 field=inputs->fields[i]; 96 xfree((void**)&field); 97 } 98 99 xfree((void**)&inputs->field_names); 100 xfree((void**)&inputs->fields); 101 xfree((void**)&inputs->fields_length); 102 } 103 xfree((void**)pinputs); 104 #else 105 #endif 106 return; 107 } 108 109 /*-------------------------------------------------- 110 ParameterInputsAddFromVec 111 --------------------------------------------------*/ 112 int ParameterInputsAddFromVec(ParameterInputs* inputs,Vec vector,char* pfield_name){ 113 114 int noerr=1; 115 double* double_vector=NULL; 116 double* double_vector2=NULL; 117 int vector_size; 118 char* field_name; 119 char** field_names; 120 int field_name_size; 121 double** fields=NULL; 122 int* fields_length; 123 int i; 124 125 /*Take vector, serialize it, and plug it into inputs with field name "field_name": */ 126 if (vector){ 127 VecGetSize(vector,&vector_size); 128 VecToMPISerial(&double_vector,vector); 18 #include "./objects.h" 19 20 ParameterInputs::ParameterInputs(){ 21 22 dataset=new DataSet(); 23 24 } 129 25 130 if(inputs->nfields==0){ 131 /*Ok, we need to allocate fields, field_names and fields_length: */ 132 inputs->nfields=1; 133 134 inputs->field_names=(char**)xmalloc(sizeof(char*)); 135 field_name_size=strlen(pfield_name)+1; 136 field_name=(char*)xmalloc(field_name_size*sizeof(char)); 137 strcpy(field_name,pfield_name); 138 inputs->field_names[0]=field_name; 139 140 inputs->fields=(double**)xmalloc(sizeof(double*)); 141 inputs->fields[0]=double_vector; 142 143 inputs->fields_length=(int*)xmalloc(sizeof(int)); 144 inputs->fields_length[0]=vector_size; 145 } 146 else{ 147 /*First, figure out if there is already an existing field with name pfield_name: */ 148 for(i=0;i<inputs->nfields;i++){ 149 if (strcmp(inputs->field_names[i],pfield_name)==0){ 150 /*Erase old field and plug new field: */ 151 double_vector2=inputs->fields[i]; 152 xfree((void**)&double_vector2); //no leak! 153 inputs->fields[i]=double_vector; 154 inputs->fields_length[i]=vector_size; 155 return noerr; 156 } 157 } 158 159 /*Ok, if we are here, the field did not already exist, we need to add it. First reallocate 160 * the inputs: */ 161 field_names=inputs->field_names; //save field_names pointer. 162 inputs->field_names=(char**)xmalloc((inputs->nfields+1)*sizeof(char*)); 163 for(i=0;i<inputs->nfields;i++){ 164 inputs->field_names[i]=field_names[i]; 165 } 166 xfree((void**)&field_names); 167 168 field_name_size=strlen(pfield_name)+1; 169 field_name=(char*)xmalloc(field_name_size*sizeof(char)); 170 strcpy(field_name,pfield_name); 171 inputs->field_names[inputs->nfields]=field_name; 172 173 174 175 fields=inputs->fields; //save fields pointer 176 inputs->fields=(double**)xmalloc((inputs->nfields+1)*sizeof(double*)); 177 for(i=0;i<inputs->nfields;i++){ 178 inputs->fields[i]=fields[i]; 179 } 180 xfree((void**)&fields); 181 inputs->fields[inputs->nfields]=double_vector; 182 183 fields_length=inputs->fields_length; 184 inputs->fields_length=(int*)xmalloc((inputs->nfields+1)*sizeof(int)); 185 for(i=0;i<inputs->nfields;i++){ 186 inputs->fields_length[i]=fields_length[i]; 187 } 188 inputs->fields_length[inputs->nfields]=vector_size; 189 xfree((void**)&fields_length); 190 191 inputs->nfields++; 192 } 193 } 194 else{ 195 /*Do nothing, there is no input to add!: */ 196 ; 197 } 198 return noerr; 199 } 200 201 /*-------------------------------------------------- 202 ParameterInputsAddFromDouble 203 --------------------------------------------------*/ 204 int ParameterInputsAddFromDouble(ParameterInputs* inputs,double scalar, char* pfield_name){ 205 206 int noerr=1; 207 double* double_vector2=NULL; 208 double* double_vector=NULL; 209 int vector_size; 210 char* field_name; 211 char** field_names; 212 int field_name_size; 213 double** fields=NULL; 214 int* fields_length; 215 int i; 216 217 /*Create double_vector pointing to scalar: */ 218 vector_size=1; 219 double_vector=(double*)xmalloc(sizeof(double)); 220 double_vector[0]=scalar; 221 222 223 if(inputs->nfields==0){ 224 /*Ok, we need to allocate fields, field_names and fields_length: */ 225 inputs->nfields=1; 26 ParameterInputs::~ParameterInputs(){ 27 28 delete dataset; 29 30 } 31 32 void ParameterInputs::Echo(){ 33 34 printf("ParameterInputs echo: \n"); 35 dataset->Echo(); 36 37 } 38 39 void ParameterInputs::purge(char* name){ 40 41 int i; 42 Input* input=NULL; 43 44 /*Go through dataset, and figure out if an Input 45 * already has the name "name". If so, delete it : */ 46 47 for(i=0;i<dataset->Size();i++){ 48 input=(Input*)dataset->GetObjectByOffset(i); 49 50 if (input->IsSameName(name)){ 51 /*delete object: */ 52 dataset->DeleteObject(input); 53 } 54 } 55 } 226 56 227 inputs->field_names=(char**)xmalloc(sizeof(char*)); 228 field_name_size=strlen(pfield_name)+1; 229 field_name=(char*)xmalloc(field_name_size*sizeof(char)); 230 strcpy(field_name,pfield_name); 231 inputs->field_names[0]=field_name; 232 233 inputs->fields=(double**)xmalloc(sizeof(double*)); 234 inputs->fields[0]=double_vector; 235 236 inputs->fields_length=(int*)xmalloc(sizeof(int)); 237 inputs->fields_length[0]=vector_size; 238 } 239 else{ 240 /*First, figure out if there is already an existing field with name pfield_name: */ 241 for(i=0;i<inputs->nfields;i++){ 242 if (strcmp(inputs->field_names[i],pfield_name)==0){ 243 /*Erase old field and plug new field: */ 244 double_vector2=inputs->fields[i]; 245 xfree((void**)&double_vector2); //no leak! 246 inputs->fields[i]=double_vector; 247 inputs->fields_length[i]=vector_size; 248 return noerr; 249 } 250 } 251 252 /*Ok, if we are here, the field did not already exist, we need to add it. First reallocate 253 * the inputs: */ 254 field_names=inputs->field_names; //save field_names pointer. 255 inputs->field_names=(char**)xmalloc((inputs->nfields+1)*sizeof(char*)); 256 for(i=0;i<inputs->nfields;i++){ 257 inputs->field_names[i]=field_names[i]; 258 } 259 xfree((void**)&field_names); 260 261 field_name_size=strlen(pfield_name)+1; 262 field_name=(char*)xmalloc(field_name_size*sizeof(char)); 263 strcpy(field_name,pfield_name); 264 inputs->field_names[inputs->nfields]=field_name; 265 266 267 268 fields=inputs->fields; //save fields pointer 269 inputs->fields=(double**)xmalloc((inputs->nfields+1)*sizeof(double*)); 270 for(i=0;i<inputs->nfields;i++){ 271 inputs->fields[i]=fields[i]; 272 } 273 xfree((void**)&fields); 274 inputs->fields[inputs->nfields]=double_vector; 275 276 fields_length=inputs->fields_length; 277 inputs->fields_length=(int*)xmalloc((inputs->nfields+1)*sizeof(int)); 278 for(i=0;i<inputs->nfields;i++){ 279 inputs->fields_length[i]=fields_length[i]; 280 } 281 inputs->fields_length[inputs->nfields]=vector_size; 282 xfree((void**)&fields_length); 283 284 inputs->nfields++; 285 } 286 return noerr; 287 } 288 289 /*-------------------------------------------------- 290 ParameterInputsAddFromMat 291 --------------------------------------------------*/ 292 int ParameterInputsAddFromMat(ParameterInputs* inputs,double* vector,int vector_size,char* pfield_name){ 293 294 int noerr=1; 295 char* field_name; 296 char** field_names; 297 int field_name_size; 298 double** fields=NULL; 299 int* fields_length; 300 double* double_vector=NULL; 301 double* double_vector2=NULL; 302 int i; 303 304 /*Make a copy of input vector, so as to not create any leaks: */ 305 double_vector=(double*)xmalloc(vector_size*sizeof(double)); 306 memcpy(double_vector,vector,vector_size*sizeof(double)); 307 308 /*Take vector, serialize it, and plug it into inputs with field name "field_name": */ 309 if (vector){ 310 311 if(inputs->nfields==0){ 312 /*Ok, we need to allocate fields, field_names and fields_length: */ 313 inputs->nfields=1; 314 315 inputs->field_names=(char**)xmalloc(sizeof(char*)); 316 field_name_size=strlen(pfield_name)+1; 317 field_name=(char*)xmalloc(field_name_size*sizeof(char)); 318 strcpy(field_name,pfield_name); 319 inputs->field_names[0]=field_name; 320 321 inputs->fields=(double**)xmalloc(sizeof(double*)); 322 inputs->fields[0]=double_vector; 323 324 inputs->fields_length=(int*)xmalloc(sizeof(int)); 325 inputs->fields_length[0]=vector_size; 326 } 327 else{ 328 329 /*First, figure out if there is already an existing field with name pfield_name: */ 330 for(i=0;i<inputs->nfields;i++){ 331 if (strcmp(inputs->field_names[i],pfield_name)==0){ 332 /*Just xfree old field and plug new field: */ 333 double_vector2=inputs->fields[i]; 334 xfree((void**)&double_vector2); 335 inputs->fields[i]=double_vector; 336 inputs->fields_length[i]=vector_size; 337 return noerr; 338 } 339 } 340 341 /*Ok, if we are here, the field did not already exist, we need to add it. First reallocate 342 * the inputs: */ 343 field_names=inputs->field_names; //save field_names pointer. 344 inputs->field_names=(char**)xmalloc((inputs->nfields+1)*sizeof(char*)); 345 for(i=0;i<inputs->nfields;i++){ 346 inputs->field_names[i]=field_names[i]; 347 } 348 xfree((void**)&field_names); 349 350 field_name_size=strlen(pfield_name)+1; 351 field_name=(char*)xmalloc(field_name_size*sizeof(char)); 352 strcpy(field_name,pfield_name); 353 inputs->field_names[inputs->nfields]=field_name; 354 355 356 fields=inputs->fields; //save fields pointer 357 inputs->fields=(double**)xmalloc((inputs->nfields+1)*sizeof(double*)); 358 for(i=0;i<inputs->nfields;i++){ 359 inputs->fields[i]=fields[i]; 360 } 361 xfree((void**)&fields); 362 inputs->fields[inputs->nfields]=double_vector; 363 364 fields_length=inputs->fields_length; 365 inputs->fields_length=(int*)xmalloc((inputs->nfields+1)*sizeof(int)); 366 for(i=0;i<inputs->nfields;i++){ 367 inputs->fields_length[i]=fields_length[i]; 368 } 369 inputs->fields_length[inputs->nfields]=vector_size; 370 xfree((void**)&fields_length); 371 372 inputs->nfields++; 373 } 374 } 375 else{ 376 /*Do nothing, there is no input to add!: */ 377 ; 378 } 379 return noerr; 380 } 57 58 void ParameterInputs::Add(char* name,char* string){ 59 60 Input* input=NULL; 61 62 /*First, purge object with same name: */ 63 this->purge(name); 64 65 /*We are sure an input of the same name does not exist. Create new 66 * input: */ 67 input=new Input(name,string); 68 69 /*Add input to dataset: */ 70 dataset->AddObject(input); 71 72 } 73 74 void ParameterInputs::Add(char* name,int integer){ 75 76 Input* input=NULL; 77 78 /*First, purge object with same name: */ 79 this->purge(name); 80 81 /*We are sure an input of the same name does not exist. Create new 82 * input: */ 83 input=new Input(name,integer); 84 85 /*Add input to dataset: */ 86 dataset->AddObject(input); 87 } 88 89 90 void ParameterInputs::Add(char* name,double scalar){ 91 92 Input* input=NULL; 93 94 /*First, purge object with same name: */ 95 this->purge(name); 96 97 /*We are sure an input of the same name does not exist. Create new 98 * input: */ 99 input=new Input(name,scalar); 100 101 /*Add input to dataset: */ 102 dataset->AddObject(input); 103 104 } 105 106 void ParameterInputs::Add(char* name,double* vector,int ndof,int numberofnodes){ 107 108 Input* input=NULL; 109 110 /*First, purge object with same name: */ 111 this->purge(name); 112 113 /*We are sure an input of the same name does not exist. Create new 114 * input: */ 115 input=new Input(name,vector,ndof,numberofnodes); 116 117 /*Add input to dataset: */ 118 dataset->AddObject(input); 119 120 } 121 122 void ParameterInputs::Add(char* name,Vec petscvector,int ndof, int numberofnodes){ 123 124 Input* input=NULL; 125 126 /*First, purge object with same name: */ 127 this->purge(name); 128 129 /*We are sure an input of the same name does not exist. Create new 130 * input: */ 131 input=new Input(name,petscvector,ndof,numberofnodes); 132 133 /*Add input to dataset: */ 134 dataset->AddObject(input); 135 136 } 137 int ParameterInputs::Recover(char* name, char** pstring){ 138 139 int found=0; 140 int i; 141 Input* input=NULL; 142 char* string=NULL; 143 144 /*Go through dataset, and figure out if an Input 145 * has the name "name": */ 146 for(i=0;i<dataset->Size();i++){ 147 input=(Input*)dataset->GetObjectByOffset(i); 148 149 if (input->IsSameName(name)){ 150 151 /*Get string out of this input: */ 152 input->Recover(&string); 153 found=1;break; 154 } 155 } 156 /*Assign output pointers:*/ 157 *pstring=string; 158 return found; 159 160 } 161 int ParameterInputs::Recover(char* name, int* pinteger){ 162 163 int found=0; 164 int i; 165 Input* input=NULL; 166 int integer; 167 168 /*Go through dataset, and figure out if an Input 169 * has the name "name": */ 170 for(i=0;i<dataset->Size();i++){ 171 input=(Input*)dataset->GetObjectByOffset(i); 172 173 if (input->IsSameName(name)){ 174 175 /*Get string out of this input: */ 176 input->Recover(&integer); 177 found=1; break; 178 179 } 180 } 181 /*Assign output pointers:*/ 182 *pinteger=integer; 183 184 return found; 185 } 186 int ParameterInputs::Recover(char* name, double* pscalar){ 187 188 int found=0; 189 int i; 190 Input* input=NULL; 191 double scalar; 192 193 /*Go through dataset, and figure out if an Input 194 * has the name "name": */ 195 for(i=0;i<dataset->Size();i++){ 196 input=(Input*)dataset->GetObjectByOffset(i); 197 198 if (input->IsSameName(name)){ 199 200 /*Get string out of this input: */ 201 input->Recover(&scalar); 202 found=1; break; 203 204 } 205 } 206 /*Assign output pointers:*/ 207 *pscalar=scalar; 208 209 return found; 210 211 } 212 213 #undef __FUNCT__ 214 #define __FUNCT__ "ParameterInputs::Recover" 215 int ParameterInputs::Recover(char* name,double* values, int ndof, int* dofs,int numnodes,void** pnodes){ 216 217 int i; 218 Node** nodes=NULL; 219 Input* input=NULL; 220 int found=0; 221 222 /*First recover nodes pointer :*/ 223 nodes=(Node**)pnodes; 224 225 /*Go through dataset, and figure out if an Input 226 * has the name "name": */ 227 for(i=0;i<dataset->Size();i++){ 228 input=(Input*)dataset->GetObjectByOffset(i); 229 230 if (input->IsSameName(name)){ 231 found=1; 232 break; 233 } 234 } 235 236 if(found==0)return 0; 237 238 /*call submethod: */ 239 input->Recover(values,ndof,dofs,numnodes,(void**)nodes); 240 return 1; 241 } -
issm/trunk/src/c/objects/ParameterInputs.h
r1 r246 1 1 /*!\file: ParameterInputs.h 2 * \brief prototype for parameter inputs, from matlab workspace. 2 * \brief dataset filled with input objects. Used by CreateKMatrix and CreatePVector to hold 3 * parameters coming from the workspace. 3 4 */ 4 #ifndef PARAMETER_INPUTS_H_ 5 #define PARAMETER_INPUTS_H_ 5 6 #ifndef _PARAMETERINPUTS_H_ 7 #define _PARAMETERINPUTS_H_ 6 8 7 9 #include "../toolkits/toolkits.h" 10 #include "../DataSet/DataSet.h" 8 11 9 struct ParameterInputs{ 12 class DataSet; 10 13 11 int nfields; //number of inputs 12 char** field_names; //characterization of each field. 13 double** fields; //value of each field. 14 int* fields_length; //length of each values field 14 class ParameterInputs{ 15 15 16 private: 17 DataSet* dataset; //cannot declare DataSet* dataset, to avoid circular referencing. 18 19 public: 20 ParameterInputs(); 21 ~ParameterInputs(); 22 void Echo(); 23 24 void Add(char* name,char* string); 25 void Add(char* name,int integer); 26 void Add(char* name,double scalar); 27 void Add(char* name,double* vector,int ndof,int numberofnodes); 28 void Add(char* name,Vec petscvector,int ndof, int numberofnodes); 29 30 int Recover(char* name, char** pstring); 31 int Recover(char* name, int* pinteger); 32 int Recover(char* name, double* pscalar); 33 int Recover(char* name,double* values, int ndof, int* dofs,int numnodes,void** nodes); //void** because otherwise we get a circular dependency with Node 34 35 /*declaration found in io: */ 36 void Init( void* data_handle); 37 void purge(char* name); 16 38 }; 17 39 18 ParameterInputs* NewParameterInputs();19 void DeleteParameterInputs(ParameterInputs** pinputs);20 int ParameterInputsEcho(ParameterInputs* inputs,int longecho);21 double* ParameterInputsRecover(ParameterInputs* inputs,char* field_name);22 23 int ParameterInputsAddFromVec(ParameterInputs* inputs,Vec vector,char* field_name);24 int ParameterInputsAddFromMat(ParameterInputs* inputs,double* vector,int vector_size,char* field_name);25 int ParameterInputsAddFromDouble(ParameterInputs* inputs,double scalar, char* pfield_name);26 27 #ifdef _SERIAL_28 #include "mex.h"29 void ParameterInputsInit(ParameterInputs** pthis, const mxArray* inputhandle);30 40 #endif 31 32 #endif -
issm/trunk/src/c/objects/Penpair.cpp
r234 r246 208 208 #define __FUNCT__ "Penpair::CreateKMatrix" 209 209 210 void Penpair::CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type){210 void Penpair::CreateKMatrix(Mat Kgg,void* inputs,int analysis_type){ 211 211 212 212 /*No loads applied, do nothing: */ … … 217 217 #undef __FUNCT__ 218 218 #define __FUNCT__ "Penpair::CreatePVector" 219 void Penpair::CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type){219 void Penpair::CreatePVector(Vec pg, void* inputs, int analysis_type){ 220 220 221 221 /*No loads applied, do nothing: */ … … 225 225 #undef __FUNCT__ 226 226 #define __FUNCT__ "Penpair::UpdateFromInputs" 227 void Penpair::UpdateFromInputs( ParameterInputs* inputs){227 void Penpair::UpdateFromInputs(void* inputs){ 228 228 229 229 } … … 231 231 #undef __FUNCT__ 232 232 #define __FUNCT__ "Penpair::PenaltyCreateKMatrix" 233 void Penpair::PenaltyCreateKMatrix(Mat Kgg, ParameterInputs* inputs,double kmax,int analysis_type){233 void Penpair::PenaltyCreateKMatrix(Mat Kgg,void* inputs,double kmax,int analysis_type){ 234 234 if(numdofs==1){ 235 235 … … 245 245 #undef __FUNCT__ 246 246 #define __FUNCT__ "Penpair::PenaltyCreatePVector" 247 void Penpair::PenaltyCreatePVector(Vec pg, ParameterInputs* inputs,double kmax,int analysis_type){247 void Penpair::PenaltyCreatePVector(Vec pg,void* inputs,double kmax,int analysis_type){ 248 248 if(numdofs==1){ 249 249 -
issm/trunk/src/c/objects/Penpair.h
r1 r246 9 9 #include "./Element.h" 10 10 11 class Element; 11 12 class Penpair: public Load{ 12 13 … … 52 53 void DistributeNumDofs(int* numdofspernode,int analysis_type); 53 54 void Configure(void* elements,void* nodes,void* materials); 54 void CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type);55 void CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type);56 void UpdateFromInputs( ParameterInputs* inputs);57 void PenaltyCreateKMatrix(Mat Kgg, ParameterInputs* inputs,double kmax,int analysis_type);58 void PenaltyCreatePVector(Vec pg, ParameterInputs* inputs,double kmax,int analysis_type);55 void CreateKMatrix(Mat Kgg,void* inputs,int analysis_type); 56 void CreatePVector(Vec pg, void* inputs, int analysis_type); 57 void UpdateFromInputs(void* inputs); 58 void PenaltyCreateKMatrix(Mat Kgg,void* inputs,double kmax,int analysis_type); 59 void PenaltyCreatePVector(Vec pg,void* inputs,double kmax,int analysis_type); 59 60 Object* copy(); 60 61 }; -
issm/trunk/src/c/objects/Penta.cpp
r241 r246 279 279 #define __FUNCT__ "Penta::CreateKMatrix" 280 280 281 void Penta::CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type){281 void Penta::CreateKMatrix(Mat Kgg,void* inputs,int analysis_type){ 282 282 283 283 /*Just branch to the correct element stiffness matrix generator, according to the type of analysis we are carrying out: */ … … 301 301 #undef __FUNCT__ 302 302 #define __FUNCT__ "Penta:CreateKMatrixDiagnosticHoriz" 303 void Penta::CreateKMatrixDiagnosticHoriz( Mat Kgg, ParameterInputs*inputs, int analysis_type){303 void Penta::CreateKMatrixDiagnosticHoriz( Mat Kgg, void* vinputs, int analysis_type){ 304 304 305 305 … … 368 368 369 369 /*input parameters for structural analysis (diagnostic): */ 370 double* velocity_param=NULL; 371 double vxvy_list[numgrids][2]; 372 double* oldvelocity_param=NULL; 373 double oldvxvy_list[numgrids][2]; 370 double vxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 371 double oldvxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 372 int dofs[2]={0,1}; 374 373 double thickness; 375 374 … … 381 380 double MOUNTAINKEXPONENT=10; 382 381 382 ParameterInputs* inputs=NULL; 383 383 384 /*Collapsed formulation: */ 384 385 Tria* tria=NULL; 386 387 /*recover pointers: */ 388 inputs=(ParameterInputs*)vinputs; 385 389 386 390 /*Figure out if this pentaelem is collapsed. If so, then bailout, except if it is at the … … 397 401 /*This element should be collapsed into a tria element at its base. Create this tria element, 398 402 *and use its CreateKMatrix functionality to fill the global stiffness matrix: */ 399 tria= SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria.403 tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 400 404 tria->CreateKMatrix(Kgg,inputs, analysis_type); 401 405 delete tria; … … 407 411 408 412 /*recover extra inputs from users, at current convergence iteration: */ 409 velocity_param=ParameterInputsRecover(inputs,"velocity");410 oldvelocity_param=ParameterInputsRecover(inputs,"old_velocity");413 inputs->Recover("velocity",&vxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 414 inputs->Recover("old_velocity",&oldvxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 411 415 412 416 /* Get node coordinates and dof list: */ … … 418 422 for(j=0;j<numdofs;j++){ 419 423 Ke_gg[i][j]=0.0; 420 }421 }422 423 /*Initialize vxvy_list: */424 for(i=0;i<numgrids;i++){425 if(velocity_param){426 vxvy_list[i][0]=velocity_param[doflist[i*numberofdofspernode+0]];427 vxvy_list[i][1]=velocity_param[doflist[i*numberofdofspernode+1]];428 }429 else{430 vxvy_list[i][0]=0;431 vxvy_list[i][1]=0;432 }433 }434 435 /*Initialize oldvxvy_list: */436 for(i=0;i<numgrids;i++){437 if(oldvelocity_param){438 oldvxvy_list[i][0]=oldvelocity_param[doflist[i*numberofdofspernode+0]];439 oldvxvy_list[i][1]=oldvelocity_param[doflist[i*numberofdofspernode+1]];440 }441 else{442 oldvxvy_list[i][0]=0;443 oldvxvy_list[i][1]=0;444 424 } 445 425 } … … 552 532 * grids: */ 553 533 554 tria= SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria.534 tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 555 535 tria->CreateKMatrixDiagnosticHorizFriction(Kgg,inputs,analysis_type); 556 536 delete tria; … … 574 554 #undef __FUNCT__ 575 555 #define __FUNCT__ "Penta:CreateKMatrixDiagnosticVert" 576 void Penta::CreateKMatrixDiagnosticVert( Mat Kgg, ParameterInputs*inputs, int analysis_type){556 void Penta::CreateKMatrixDiagnosticVert( Mat Kgg, void* vinputs, int analysis_type){ 577 557 578 558 /* local declarations */ … … 610 590 double Bprime[NDOF1][numgrids]; 611 591 double DL_scalar; 612 592 593 ParameterInputs* inputs=NULL; 594 613 595 /*Collapsed formulation: */ 614 596 Tria* tria=NULL; 597 598 /*recover pointers: */ 599 inputs=(ParameterInputs*)vinputs; 600 615 601 616 602 /*If this element is on the surface, we have a dynamic boundary condition that applies, as a stiffness 617 603 * matrix: */ 618 604 if(onsurface){ 619 tria= SpawnTria(3,4,5); //nodes 3,4 and 5 are on the surface605 tria=(Tria*)SpawnTria(3,4,5); //nodes 3,4 and 5 are on the surface 620 606 tria->CreateKMatrixDiagnosticSurfaceVert(Kgg,inputs, analysis_type); 621 607 delete tria; … … 706 692 #undef __FUNCT__ 707 693 #define __FUNCT__ "Penta::CreatePVector" 708 void Penta::CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type){694 void Penta::CreatePVector(Vec pg, void* inputs, int analysis_type){ 709 695 710 696 /*Just branch to the correct element stiffness matrix generator, according to the type of analysis we are carrying out: */ … … 724 710 #undef __FUNCT__ 725 711 #define __FUNCT__ "Penta::UpdateFromInputs" 726 void Penta::UpdateFromInputs(ParameterInputs* inputs){ 727 728 int i; 729 int doflist[MAXDOFSPERNODE*3]; 730 int numberofdofspernode; 731 732 /*element: */ 733 double* h_param=NULL; 734 double* s_param=NULL; 735 double* b_param=NULL; 736 double* k_param=NULL; 737 double* melting_param=NULL; 738 double* accumulation_param=NULL; 739 740 /*material: */ 741 double* temperature_average_param=NULL; 712 void Penta::UpdateFromInputs(void* vinputs){ 713 714 int dofs[1]={0}; 715 double temperature_list[6]; 742 716 double temperature_average; 743 double * B_param=NULL;717 double B_list[6]; 744 718 double B_average; 745 719 746 747 /*Get dof list: */ 748 GetDofList(&doflist[0],&numberofdofspernode); 720 ParameterInputs* inputs=NULL; 721 722 /*recover pointers: */ 723 inputs=(ParameterInputs*)vinputs; 749 724 750 725 /*Update internal data if inputs holds new values: */ 751 h_param=ParameterInputsRecover(inputs,"thickness"); 752 s_param=ParameterInputsRecover(inputs,"surface"); 753 b_param=ParameterInputsRecover(inputs,"bed"); 754 k_param=ParameterInputsRecover(inputs,"drag"); 755 melting_param=ParameterInputsRecover(inputs,"melting"); 756 accumulation_param=ParameterInputsRecover(inputs,"accumulation"); 757 758 for(i=0;i<6;i++){ 759 if(h_param)h[i]=h_param[doflist[i*numberofdofspernode+0]]; 760 if(s_param)s[i]=s_param[doflist[i*numberofdofspernode+0]]; 761 if(b_param)b[i]=b_param[doflist[i*numberofdofspernode+0]]; 762 if(k_param)k[i]=k_param[doflist[i*numberofdofspernode+0]]; 763 if(melting_param)melting[i]=melting_param[doflist[i*numberofdofspernode+0]]; 764 if(accumulation_param)accumulation[i]=accumulation_param[doflist[i*numberofdofspernode+0]]; 765 } 766 726 inputs->Recover("thickness",&h[0],1,dofs,6,(void**)nodes); 727 inputs->Recover("surface",&s[0],1,dofs,6,(void**)nodes); 728 inputs->Recover("bed",&b[0],1,dofs,6,(void**)nodes); 729 inputs->Recover("drag",&k[0],1,dofs,6,(void**)nodes); 730 inputs->Recover("melting",&melting[0],1,dofs,6,(void**)nodes); 731 inputs->Recover("accumulation_param",&accumulation[0],1,dofs,6,(void**)nodes); 732 767 733 //Update material if necessary 768 temperature_average_param=ParameterInputsRecover(inputs,"temperature_average"); 769 B_param=ParameterInputsRecover(inputs,"B"); 770 if(temperature_average_param){ 771 temperature_average=0; 772 for(i=0;i<6;i++) temperature_average+=temperature_average_param[doflist[i*numberofdofspernode+0]]; 773 temperature_average=temperature_average/6.0; 734 if(inputs->Recover("temperature_average",&temperature_list[0],1,dofs,6,(void**)nodes)){ 735 temperature_average=(temperature_list[0]+temperature_list[1]+temperature_list[2]+temperature_list[3]+temperature_list[4]+temperature_list[5])/6.0; 774 736 B_average=Paterson(temperature_average); 775 737 matice->SetB(B_average); 776 738 } 777 778 if(B_param){ 779 B_average=0; 780 for(i=0;i<6;i++) B_average+=B_param[doflist[i*numberofdofspernode+0]]; 781 B_average=B_average/6.0; 739 740 if(inputs->Recover("B",&B_list[0],1,dofs,6,(void**)nodes)){ 741 B_average=(B_list[0]+B_list[1]+B_list[2]+B_list[3]+B_list[4]+B_list[5])/6.0; 782 742 matice->SetB(B_average); 783 743 } … … 785 745 } 786 746 787 Matpar* Penta::GetMatPar(){747 void* Penta::GetMatPar(){ 788 748 return matpar; 789 749 } … … 794 754 795 755 796 void Penta::GetNodes( Node**pnodes){756 void Penta::GetNodes(void** vpnodes){ 797 757 int i; 758 Node** pnodes=(Node**)vpnodes; 759 798 760 for(i=0;i<6;i++){ 799 761 pnodes[i]=nodes[i]; … … 823 785 #undef __FUNCT__ 824 786 #define __FUNCT__ "Penta::Du" 825 void Penta::Du(Vec du_g,double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type){787 void Penta::Du(Vec du_g,double* u_g,double* u_g_obs,void* inputs,int analysis_type){ 826 788 827 789 int i; … … 834 796 else{ 835 797 836 tria= SpawnTria(3,4,5); //grids 0, 1 and 2 make the new tria.798 tria=(Tria*)SpawnTria(3,4,5); //grids 0, 1 and 2 make the new tria. 837 799 tria->Du(du_g,u_g,u_g_obs,inputs,analysis_type); 838 800 delete tria; … … 843 805 #undef __FUNCT__ 844 806 #define __FUNCT__ "Penta::Gradj" 845 void Penta::Gradj(Vec grad_g,double* velocity,double* adjoint, ParameterInputs* inputs,int analysis_type,char* control_type){807 void Penta::Gradj(Vec grad_g,double* velocity,double* adjoint,void* inputs,int analysis_type,char* control_type){ 846 808 847 809 if (strcmp(control_type,"drag")==0){ … … 856 818 #undef __FUNCT__ 857 819 #define __FUNCT__ "Penta::GradjDrag" 858 void Penta::GradjDrag(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type){820 void Penta::GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type){ 859 821 860 822 … … 867 829 else{ 868 830 869 tria= SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria.831 tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 870 832 tria->GradjDrag( grad_g,u_g,lambda_g,inputs,analysis_type); 871 833 delete tria; … … 876 838 #undef __FUNCT__ 877 839 #define __FUNCT__ "Penta::GradjB" 878 void Penta::GradjB(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type){840 void Penta::GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type){ 879 841 throw ErrorException(__FUNCT__," not supported yet!"); 880 842 } … … 882 844 #undef __FUNCT__ 883 845 #define __FUNCT__ "Penta::Misfit" 884 double Penta::Misfit(double* velocity,double* obs_velocity, ParameterInputs* inputs,int analysis_type){846 double Penta::Misfit(double* velocity,double* obs_velocity,void* inputs,int analysis_type){ 885 847 886 848 double J; … … 894 856 895 857 /*use the Tria::CreateMisfit routine, on a Tria Element which is made of the 3 upper grids at the surface of the ice sheet. : */ 896 tria= SpawnTria(3,4,5);858 tria=(Tria*)SpawnTria(3,4,5); 897 859 J=tria->Misfit( velocity,obs_velocity,inputs,analysis_type); 898 860 delete tria; … … 903 865 #undef __FUNCT__ 904 866 #define __FUNCT__ "Penta::SpawnTria" 905 Tria* Penta::SpawnTria(int g0, int g1, int g2){867 void* Penta::SpawnTria(int g0, int g1, int g2){ 906 868 907 869 /*out of grids g0,g1 and g2 from Penta, build a tria element: */ … … 1345 1307 #undef __FUNCT__ 1346 1308 #define __FUNCT__ "Penta::CreatePVectorDiagnosticHoriz" 1347 void Penta::CreatePVectorDiagnosticHoriz( Vec pg, ParameterInputs*inputs,int analysis_type){1309 void Penta::CreatePVectorDiagnosticHoriz( Vec pg, void* vinputs,int analysis_type){ 1348 1310 1349 1311 int i,j; … … 1388 1350 double pe_g_gaussian[numdofs]; 1389 1351 1352 ParameterInputs* inputs=NULL; 1353 1390 1354 /*Spawning: */ 1391 1355 Tria* tria=NULL; 1356 1357 /*recover pointers: */ 1358 inputs=(ParameterInputs*)vinputs; 1392 1359 1393 1360 … … 1405 1372 /*This element should be collapsed into a tria element at its base. Create this tria element, 1406 1373 *and use its CreatePVector functionality to return an elementary load vector: */ 1407 tria= SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria.1374 tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 1408 1375 tria->CreatePVector(pg,inputs, analysis_type); 1409 1376 delete tria; … … 1644 1611 #undef __FUNCT__ 1645 1612 #define __FUNCT__ "Penta:CreatePVectorDiagnosticVert" 1646 void Penta::CreatePVectorDiagnosticVert( Vec pg, ParameterInputs*inputs,int analysis_type){1613 void Penta::CreatePVectorDiagnosticVert( Vec pg, void* vinputs,int analysis_type){ 1647 1614 1648 1615 int i; … … 1685 1652 1686 1653 /*input parameters for structural analysis (diagnostic): */ 1687 double* velocity_param=NULL; 1688 double vx_list[numgrids]; 1689 double vy_list[numgrids]; 1654 double vx_list[numgrids]={0,0,0}; 1655 double vy_list[numgrids]={0,0,0}; 1690 1656 double du[3]; 1691 1657 double dv[3]; 1692 1658 double dudx,dvdy; 1659 int dofs1[1]={0}; 1660 int dofs2[1]={1}; 1661 1662 ParameterInputs* inputs=NULL; 1663 1664 /*recover pointers: */ 1665 inputs=(ParameterInputs*)vinputs; 1693 1666 1694 1667 /*If we are on the bedrock, spawn a tria on the bedrock, and use it to build the 1695 1668 *diagnostic base vertical stifness: */ 1696 1669 if(onbed){ 1697 tria= SpawnTria(0,1,2); //nodes 0, 1 and 2 are on the bedrock1670 tria=(Tria*)SpawnTria(0,1,2); //nodes 0, 1 and 2 are on the bedrock 1698 1671 tria->CreatePVectorDiagnosticBaseVert(pg,inputs, analysis_type); 1699 1672 delete tria; … … 1709 1682 1710 1683 /* recover input parameters: */ 1711 velocity_param=ParameterInputsRecover(inputs,"velocity"); 1712 1713 if(!velocity_param)throw ErrorException(__FUNCT__," cannot compute vertical velocity without horizontal velocity!"); 1714 1715 /*Initialize vx_list and vy_list: */ 1716 for(i=0;i<numgrids;i++){ 1717 /*doflist is a list of dofs for the node. We have 1 dof per node for the vertical analysis. But the horizontal velocity 1718 *runs with 2 dofs per node! Therefore, we multiply by 2 the dof count, to extract the velocity from the inputs: */ 1719 vx_list[i]=velocity_param[2*doflist[i*numberofdofspernode+0]+0]; 1720 vy_list[i]=velocity_param[2*doflist[i*numberofdofspernode+0]+1]; 1721 } 1684 if(!inputs->Recover("velocity",&vx_list[0],1,dofs1,numgrids,(void**)nodes))throw ErrorException(__FUNCT__," cannot compute vertical velocity without horizontal velocity!"); 1685 inputs->Recover("velocity",&vy_list[0],1,dofs2,numgrids,(void**)nodes); 1722 1686 1723 1687 /*Get gaussian points and weights :*/ -
issm/trunk/src/c/objects/Penta.h
r128 r246 12 12 #include "./Node.h" 13 13 #include "./Tria.h" 14 #include "./ParameterInputs.h" 14 15 15 16 class Penta: public Element{ … … 71 72 int MyRank(); 72 73 void Configure(void* loads,void* nodes,void* materials); 73 void CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type);74 void CreateKMatrixDiagnosticHoriz( Mat Kgg, ParameterInputs* inputs, int analysis_type);75 void CreateKMatrixDiagnosticVert( Mat Kgg, ParameterInputs* inputs, int analysis_type);76 void CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type);77 void UpdateFromInputs( ParameterInputs* inputs);74 void CreateKMatrix(Mat Kgg,void* inputs,int analysis_type); 75 void CreateKMatrixDiagnosticHoriz( Mat Kgg, void* inputs, int analysis_type); 76 void CreateKMatrixDiagnosticVert( Mat Kgg, void* inputs, int analysis_type); 77 void CreatePVector(Vec pg, void* inputs, int analysis_type); 78 void UpdateFromInputs(void* inputs); 78 79 void GetDofList(int* doflist,int* pnumberofdofs); 79 Matpar* GetMatPar();80 void* GetMatPar(); 80 81 int GetShelf(); 81 void GetNodes( Node** nodes);82 void GetNodes(void** nodes); 82 83 int GetOnBed(); 83 void Du(Vec du_g,double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type);84 void Gradj(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type,char* control_type);85 void GradjDrag(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type);86 void GradjB(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type);87 double Misfit(double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type);84 void Du(Vec du_g,double* u_g,double* u_g_obs,void* inputs,int analysis_type); 85 void Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,char* control_type); 86 void GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type); 87 void GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type); 88 double Misfit(double* u_g,double* u_g_obs,void* inputs,int analysis_type); 88 89 89 90 void GetThicknessList(double* thickness_list); 90 91 void GetBedList(double* bed_list); 91 92 Object* copy(); 92 Tria* SpawnTria(int g0, int g1, int g2);93 void* SpawnTria(int g0, int g1, int g2); 93 94 94 95 void GetStrainRate(double* epsilon, double* velocity, double* xyz_list, double* gauss_l1l2l3l4); … … 102 103 void GetNodalFunctionsDerivativesParams(double* dl1dl2dl3dl4dl5dl6,double* gauss_l1l2l3l4); 103 104 void GetJacobianInvert(double* Jinv, double* xyz_list,double* gauss_l1l2l3l4); 104 void CreatePVectorDiagnosticHoriz( Vec pg, ParameterInputs* inputs,int analysis_type);105 void CreatePVectorDiagnosticVert( Vec pg, ParameterInputs* inputs,int analysis_type);105 void CreatePVectorDiagnosticHoriz( Vec pg, void* inputs,int analysis_type); 106 void CreatePVectorDiagnosticVert( Vec pg, void* inputs,int analysis_type); 106 107 void GetParameterValue(double* pvalue, double* v_list,double* gauss_l1l2l3l4); 107 108 void GetParameterDerivativeValue(double* p, double* p_list,double* xyz_list, double* gauss_l1l2l3l4); -
issm/trunk/src/c/objects/Tria.cpp
r241 r246 266 266 #define __FUNCT__ "Tria::CreateKMatrix" 267 267 268 void Tria::CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type){268 void Tria::CreateKMatrix(Mat Kgg,void* inputs,int analysis_type){ 269 269 270 270 /*Just branch to the correct element stiffness matrix generator, according to the type of analysis we are carrying out: */ … … 284 284 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticHoriz" 285 285 286 void Tria::CreateKMatrixDiagnosticHoriz(Mat Kgg, ParameterInputs*inputs,int analysis_type){286 void Tria::CreateKMatrixDiagnosticHoriz(Mat Kgg,void* vinputs,int analysis_type){ 287 287 288 288 … … 328 328 329 329 /*input parameters for structural analysis (diagnostic): */ 330 double* velocity_param=NULL; 331 double* oldvelocity_param=NULL; 332 double vxvy_list[numgrids][2]; 333 double oldvxvy_list[numgrids][2]; 330 double vxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 331 double oldvxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 334 332 double thickness; 333 int dofs[2]={0,1}; 334 335 ParameterInputs* inputs=NULL; 336 337 /*recover pointers: */ 338 inputs=(ParameterInputs*)vinputs; 335 339 336 340 /*recover extra inputs from users, at current convergence iteration: */ 337 velocity_param=ParameterInputsRecover(inputs,"velocity");338 oldvelocity_param=ParameterInputsRecover(inputs,"old_velocity");341 inputs->Recover("velocity",&vxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 342 inputs->Recover("old_velocity",&oldvxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 339 343 340 344 /* Get node coordinates and dof list: */ … … 344 348 /* Set Ke_gg to 0: */ 345 349 for(i=0;i<numdofs;i++) for(j=0;j<numdofs;j++) Ke_gg[i][j]=0.0; 346 347 /*Initialize vxvy_list: */348 for(i=0;i<numgrids;i++){349 if(velocity_param){350 vxvy_list[i][0]=velocity_param[doflist[i*numberofdofspernode+0]];351 vxvy_list[i][1]=velocity_param[doflist[i*numberofdofspernode+1]];352 }353 else{354 vxvy_list[i][0]=0;355 vxvy_list[i][1]=0;356 }357 358 if(oldvelocity_param){359 oldvxvy_list[i][0]=oldvelocity_param[doflist[i*numberofdofspernode+0]];360 oldvxvy_list[i][1]=oldvelocity_param[doflist[i*numberofdofspernode+1]];361 }362 else{363 oldvxvy_list[i][0]=0;364 oldvxvy_list[i][1]=0;365 }366 }367 350 368 351 #ifdef _DEBUGELEMENTS_ … … 516 499 #undef __FUNCT__ 517 500 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticHorizFriction" 518 void Tria::CreateKMatrixDiagnosticHorizFriction(Mat Kgg, ParameterInputs*inputs,int analysis_type){501 void Tria::CreateKMatrixDiagnosticHorizFriction(Mat Kgg,void* vinputs,int analysis_type){ 519 502 520 503 … … 554 537 555 538 /*input parameters for structural analysis (diagnostic): */ 556 double * velocity_param=NULL;557 double vxvy_list[numgrids][2];539 double vxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 540 int dofs[2]={0,1}; 558 541 559 542 /*friction: */ … … 564 547 double MOUNTAINKEXPONENT=10; 565 548 566 /*recover extra inputs from users, at current convergence iteration: */ 567 velocity_param=ParameterInputsRecover(inputs,"velocity"); 568 549 ParameterInputs* inputs=NULL; 550 551 /*recover pointers: */ 552 inputs=(ParameterInputs*)vinputs; 553 569 554 /* Get node coordinates and dof list: */ 570 555 GetElementNodeData( &xyz_list[0][0], nodes, numgrids); … … 581 566 if (friction_type!=2)throw ErrorException(__FUNCT__," non-viscous friction not supported yet!"); 582 567 583 /*Initialize vxvy_list: */ 584 for(i=0;i<numgrids;i++){ 585 if(velocity_param){ 586 vxvy_list[i][0]=velocity_param[doflist[i*numberofdofspernode+0]]; 587 vxvy_list[i][1]=velocity_param[doflist[i*numberofdofspernode+1]]; 588 } 589 else{ 590 vxvy_list[i][0]=0; 591 vxvy_list[i][1]=0; 592 } 593 } 568 /*recover extra inputs from users, at current convergence iteration: */ 569 inputs->Recover("velocity",&vxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 594 570 595 571 /*Build alpha2_list used by drag stiffness matrix*/ … … 691 667 #undef __FUNCT__ 692 668 #define __FUNCT__ "Tria::CreatePVector" 693 void Tria::CreatePVector(Vec pg, ParameterInputs* inputs,int analysis_type){669 void Tria::CreatePVector(Vec pg,void* inputs,int analysis_type){ 694 670 695 671 /*Just branch to the correct load generator, according to the type of analysis we are carrying out: */ … … 708 684 #define __FUNCT__ "Tria::CreatePVectorDiagnosticHoriz" 709 685 710 void Tria::CreatePVectorDiagnosticHoriz( Vec pg, ParameterInputs*inputs, int analysis_type){686 void Tria::CreatePVectorDiagnosticHoriz( Vec pg, void* vinputs, int analysis_type){ 711 687 712 688 int i,j; … … 746 722 /*input parameters for structural analysis (diagnostic): */ 747 723 double thickness; 724 725 ParameterInputs* inputs=NULL; 726 727 /*recover pointers: */ 728 inputs=(ParameterInputs*)vinputs; 748 729 749 730 /* Get node coordinates and dof list: */ … … 871 852 #undef __FUNCT__ 872 853 #define __FUNCT__ "Tria::UpdateFromInputs" 873 void Tria::UpdateFromInputs(ParameterInputs* inputs){ 874 875 int i; 876 int doflist[MAXDOFSPERNODE*3]; 877 int numberofdofspernode; 878 879 /*element: */ 880 double* h_param=NULL; 881 double* s_param=NULL; 882 double* b_param=NULL; 883 double* k_param=NULL; 884 double* melting_param=NULL; 885 double* accumulation_param=NULL; 886 887 /*material: */ 888 double* temperature_average_param=NULL; 854 void Tria::UpdateFromInputs(void* vinputs){ 855 856 int dofs[1]={0}; 857 double temperature_list[3]; 889 858 double temperature_average; 890 double * B_param=NULL;859 double B_list[3]; 891 860 double B_average; 892 861 893 894 /*Get dof list: */ 895 GetDofList(&doflist[0],&numberofdofspernode); 862 ParameterInputs* inputs=NULL; 863 864 /*recover pointers: */ 865 inputs=(ParameterInputs*)vinputs; 896 866 897 867 /*Update internal data if inputs holds new values: */ 898 h_param=ParameterInputsRecover(inputs,"thickness"); 899 s_param=ParameterInputsRecover(inputs,"surface"); 900 b_param=ParameterInputsRecover(inputs,"bed"); 901 k_param=ParameterInputsRecover(inputs,"drag"); 902 melting_param=ParameterInputsRecover(inputs,"melting"); 903 accumulation_param=ParameterInputsRecover(inputs,"accumulation"); 904 905 for(i=0;i<3;i++){ 906 if(h_param)h[i]=h_param[doflist[i*numberofdofspernode+0]]; 907 if(s_param)s[i]=s_param[doflist[i*numberofdofspernode+0]]; 908 if(b_param)b[i]=b_param[doflist[i*numberofdofspernode+0]]; 909 if(k_param)k[i]=k_param[doflist[i*numberofdofspernode+0]]; 910 if(melting_param)melting[i]=melting_param[doflist[i*numberofdofspernode+0]]; 911 if(accumulation_param)accumulation[i]=accumulation_param[doflist[i*numberofdofspernode+0]]; 912 } 913 868 inputs->Recover("thickness",&h[0],1,dofs,3,(void**)nodes); 869 inputs->Recover("surface",&s[0],1,dofs,3,(void**)nodes); 870 inputs->Recover("bed",&b[0],1,dofs,3,(void**)nodes); 871 inputs->Recover("drag",&k[0],1,dofs,3,(void**)nodes); 872 inputs->Recover("melting",&melting[0],1,dofs,3,(void**)nodes); 873 inputs->Recover("accumulation_param",&accumulation[0],1,dofs,3,(void**)nodes); 874 914 875 //Update material if necessary 915 temperature_average_param=ParameterInputsRecover(inputs,"temperature_average"); 916 B_param=ParameterInputsRecover(inputs,"B"); 917 if(temperature_average_param){ 918 temperature_average-0; 919 for(i=0;i<3;i++) temperature_average+=temperature_average_param[doflist[i*numberofdofspernode+0]]; 920 temperature_average=temperature_average/3.0; 876 if(inputs->Recover("temperature_average",&temperature_list[0],1,dofs,3,(void**)nodes)){ 877 temperature_average=(temperature_list[0]+temperature_list[1]+temperature_list[2])/3.0; 921 878 B_average=Paterson(temperature_average); 922 879 matice->SetB(B_average); 923 880 } 924 925 if(B_param){ 926 B_average=0; 927 for(i=0;i<3;i++) B_average+=B_param[doflist[i*numberofdofspernode+0]]; 928 B_average=B_average/3.0; 881 882 if(inputs->Recover("B",&B_list[0],1,dofs,3,(void**)nodes)){ 883 B_average=(B_list[0]+B_list[1]+B_list[2])/3.0; 929 884 matice->SetB(B_average); 930 885 } … … 1311 1266 } 1312 1267 1313 Matpar* Tria::GetMatPar(){1268 void* Tria::GetMatPar(){ 1314 1269 return matpar; 1315 1270 } … … 1320 1275 1321 1276 1322 void Tria::GetNodes( Node**pnodes){1277 void Tria::GetNodes(void** vpnodes){ 1323 1278 int i; 1279 Node** pnodes=(Node**)vpnodes; 1280 1324 1281 for(i=0;i<3;i++){ 1325 1282 pnodes[i]=nodes[i]; … … 1346 1303 1347 1304 Object* Tria::copy() { 1305 1348 1306 return new Tria(*this); 1307 1349 1308 } 1350 1309 … … 1352 1311 #undef __FUNCT__ 1353 1312 #define __FUNCT__ "Tria::Du" 1354 void Tria::Du(Vec du_g,double* velocity,double* obs_velocity, ParameterInputs*inputs,int analysis_type){1313 void Tria::Du(Vec du_g,double* velocity,double* obs_velocity,void* vinputs,int analysis_type){ 1355 1314 1356 1315 int i; … … 1404 1363 double scaley=0; 1405 1364 double scale=0; 1406 double* fit_param=NULL;1407 1365 double fit=-1; 1366 1367 ParameterInputs* inputs=NULL; 1368 1369 /*recover pointers: */ 1370 inputs=(ParameterInputs*)vinputs; 1408 1371 1409 1372 /* Get node coordinates and dof list: */ … … 1415 1378 1416 1379 /* Recover input data: */ 1417 fit_param=ParameterInputsRecover(inputs,"fit"); 1418 if(fit_param){ 1419 fit=*fit_param; 1420 } 1421 else throw ErrorException(__FUNCT__," missing fit input parameter"); 1380 if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter"); 1422 1381 1423 1382 /*Initialize velocities: */ … … 1570 1529 #undef __FUNCT__ 1571 1530 #define __FUNCT__ "Tria::Gradj" 1572 void Tria::Gradj(Vec grad_g,double* velocity,double* adjoint, ParameterInputs* inputs,int analysis_type,char* control_type){1531 void Tria::Gradj(Vec grad_g,double* velocity,double* adjoint,void* inputs,int analysis_type,char* control_type){ 1573 1532 1574 1533 if (strcmp(control_type,"drag")==0){ … … 1583 1542 #undef __FUNCT__ 1584 1543 #define __FUNCT__ "Tria::GradjDrag" 1585 void Tria::GradjDrag(Vec grad_g,double* velocity,double* adjoint, ParameterInputs*inputs,int analysis_type){1544 void Tria::GradjDrag(Vec grad_g,double* velocity,double* adjoint,void* vinputs,int analysis_type){ 1586 1545 1587 1546 … … 1603 1562 double adjy_list[numgrids]; 1604 1563 1605 double* basal_drag_param=NULL;1606 double K_list[numgrids];1607 1564 double drag; 1608 1609 double* bed_param=NULL; 1610 double bed_list[numgrids]; 1611 double* thickness_param=NULL; 1612 double thickness_list[numgrids]; 1565 int dofs[1]={0}; 1613 1566 1614 1567 /* gaussian points: */ … … 1650 1603 double epsilon[3]; /* epsilon=[exx,eyy,exy];*/ 1651 1604 1605 ParameterInputs* inputs=NULL; 1606 1607 /*recover pointers: */ 1608 inputs=(ParameterInputs*)vinputs; 1609 1652 1610 /* Get node coordinates and dof list: */ 1653 1611 GetElementNodeData( &xyz_list[0][0], nodes, numgrids); … … 1658 1616 1659 1617 /* recover input parameters: */ 1660 basal_drag_param=ParameterInputsRecover(inputs,"drag");1661 bed_param=ParameterInputsRecover(inputs,"bed");1662 thickness_param=ParameterInputsRecover(inputs,"thickness");1618 inputs->Recover("drag",&k[0],1,dofs,numgrids,(void**)nodes); 1619 inputs->Recover("bed",&b[0],1,dofs,numgrids,(void**)nodes); 1620 inputs->Recover("thickness",&h[0],1,dofs,numgrids,(void**)nodes); 1663 1621 1664 1622 /*Initialize parameter lists: */ … … 1670 1628 adjx_list[i]=adjoint[doflist[i*numberofdofspernode+0]]; 1671 1629 adjy_list[i]=adjoint[doflist[i*numberofdofspernode+1]]; 1672 if(basal_drag_param){1673 K_list[i]=basal_drag_param[doflist[i*numberofdofspernode+0]];1674 }1675 else{1676 K_list[i]=k[i];1677 }1678 if(bed_param){1679 bed_list[i]=bed_param[doflist[i*numberofdofspernode+0]];1680 }1681 else{1682 bed_list[i]=b[i];1683 }1684 if(thickness_param){1685 thickness_list[i]=thickness_param[doflist[i*numberofdofspernode+0]];1686 }1687 else{1688 thickness_list[i]=h[i];1689 }1690 1630 } 1691 1631 … … 1723 1663 friction->rho_ice=matpar->GetRhoIce(); 1724 1664 friction->rho_water=matpar->GetRhoWater(); 1725 friction->K=& K_list[0];1726 friction->bed=&b ed_list[0];1727 friction->thickness=& thickness_list[0];1665 friction->K=&k[0]; 1666 friction->bed=&b[0]; 1667 friction->thickness=&h[0]; 1728 1668 friction->velocities=&vxvy_list[0][0]; 1729 1669 friction->p=p; … … 1746 1686 /*Recover alpha_complement and k: */ 1747 1687 GetParameterValue(&alpha_complement, &alpha_complement_list[0],gauss_l1l2l3); 1748 GetParameterValue(&drag, & K_list[0],gauss_l1l2l3);1688 GetParameterValue(&drag, &k[0],gauss_l1l2l3); 1749 1689 #ifdef _DEBUG_ 1750 1690 printf("Drag complement: %20.20lf Drag: %20.20lf\n",alpha_complement,drag); … … 1796 1736 #undef __FUNCT__ 1797 1737 #define __FUNCT__ "Tria::GradjB" 1798 void Tria::GradjB(Vec grad_g,double* velocity,double* adjoint, ParameterInputs*inputs,int analysis_type){1738 void Tria::GradjB(Vec grad_g,double* velocity,double* adjoint,void* vinputs,int analysis_type){ 1799 1739 1800 1740 int i; … … 1802 1742 /* node data: */ 1803 1743 const int numgrids=3; 1804 const int numdofs=2*numgrids; 1805 const int NDOF2=2; 1744 const int NDOF1=1; 1745 const int NDOF2=1; 1746 const int numdofs=NDOF1*numgrids; 1806 1747 double xyz_list[numgrids][3]; 1807 1748 int doflist[numdofs]; … … 1814 1755 double adjx_list[numgrids]; 1815 1756 double adjy_list[numgrids]; 1816 1817 double* thickness_param=NULL;1818 double thickness_list[numgrids];1819 1757 1820 1758 /* gaussian points: */ … … 1850 1788 double lambda,mu; 1851 1789 double thickness; 1852 1790 int dofs[1]={0}; 1791 1792 ParameterInputs* inputs=NULL; 1793 1794 /*recover pointers: */ 1795 inputs=(ParameterInputs*)vinputs; 1853 1796 1854 1797 /* Get node coordinates and dof list: */ … … 1860 1803 1861 1804 /* recover input parameters: */ 1862 thickness_param=ParameterInputsRecover(inputs,"thickness");1805 inputs->Recover("thickness",&h[0],1,dofs,numgrids,(void**)nodes); 1863 1806 1864 1807 /*Initialize parameter lists: */ … … 1870 1813 adjx_list[i]=adjoint[doflist[i*numberofdofspernode+0]]; 1871 1814 adjy_list[i]=adjoint[doflist[i*numberofdofspernode+1]]; 1872 if(thickness_param){1873 thickness_list[i]=thickness_param[doflist[i*numberofdofspernode+0]];1874 }1875 else{1876 thickness_list[i]=h[i];1877 }1878 1815 } 1879 1816 … … 1940 1877 #undef __FUNCT__ 1941 1878 #define __FUNCT__ "Tria::Misfit" 1942 double Tria::Misfit(double* velocity,double* obs_velocity, ParameterInputs*inputs,int analysis_type){1879 double Tria::Misfit(double* velocity,double* obs_velocity,void* vinputs,int analysis_type){ 1943 1880 int i; 1944 1881 … … 1979 1916 double scalex=1; 1980 1917 double scaley=1; 1981 double* fit_param=NULL;1982 1918 double fit=-1; 1919 1920 ParameterInputs* inputs=NULL; 1921 1922 /*recover pointers: */ 1923 inputs=(ParameterInputs*)vinputs; 1983 1924 1984 1925 /* Get node coordinates and dof list: */ … … 1987 1928 1988 1929 /* Recover input data: */ 1989 fit_param=ParameterInputsRecover(inputs,"fit"); 1990 if(fit_param){ 1991 fit=*fit_param; 1992 } 1993 else ErrorException(__FUNCT__," missing fit input parameter"); 1930 if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter"); 1994 1931 1995 1932 /*Initialize velocities: */ … … 2102 2039 2103 2040 2041 2042 #undef __FUNCT__ 2043 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticBaseVert" 2044 void Tria::CreateKMatrixDiagnosticBaseVert(Mat Kgg,void* vinputs,int analysis_type){ 2045 2046 int i,j; 2047 2048 /* node data: */ 2049 const int numgrids=3; 2050 const int NDOF1=1; 2051 const int numdofs=NDOF1*numgrids; 2052 double xyz_list[numgrids][3]; 2053 int doflist[numdofs]; 2054 int numberofdofspernode; 2055 2056 /* gaussian points: */ 2057 int num_gauss,ig; 2058 double* first_gauss_area_coord = NULL; 2059 double* second_gauss_area_coord = NULL; 2060 double* third_gauss_area_coord = NULL; 2061 double* gauss_weights = NULL; 2062 double gauss_weight; 2063 double gauss_l1l2l3[3]; 2064 2065 2066 /* matrices: */ 2067 double L[1][3]; 2068 double DL_scalar; 2069 2070 double Ke_gg[3][3]; //stiffness matrix 2071 double Ke_gg_gaussian[3][3]; //stiffness matrix evaluated at the gaussian point. 2072 double Jdet; 2073 2074 ParameterInputs* inputs=NULL; 2075 2076 /*recover pointers: */ 2077 inputs=(ParameterInputs*)vinputs; 2078 2079 /* Get node coordinates and dof list: */ 2080 GetElementNodeData( &xyz_list[0][0], nodes, numgrids); 2081 GetDofList(&doflist[0],&numberofdofspernode); 2082 2083 /* Set Ke_gg to 0: */ 2084 for(i=0;i<numdofs;i++) for(j=0;j<numdofs;j++) Ke_gg[i][j]=0.0; 2085 2086 /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */ 2087 GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2); 2088 2089 /* Start looping on the number of gaussian points: */ 2090 for (ig=0; ig<num_gauss; ig++){ 2091 /*Pick up the gaussian point: */ 2092 gauss_weight=*(gauss_weights+ig); 2093 gauss_l1l2l3[0]=*(first_gauss_area_coord+ig); 2094 gauss_l1l2l3[1]=*(second_gauss_area_coord+ig); 2095 gauss_l1l2l3[2]=*(third_gauss_area_coord+ig); 2096 2097 /* Get Jacobian determinant: */ 2098 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss_l1l2l3); 2099 2100 //Get L matrix if viscous basal drag present: 2101 GetL(&L[0][0], &xyz_list[0][0], gauss_l1l2l3,NDOF1); 2102 2103 DL_scalar=gauss_weight*Jdet; 2104 2105 /* Do the triple producte tL*D*L: */ 2106 TripleMultiply( &L[0][0],1,3,1, 2107 &DL_scalar,1,1,0, 2108 &L[0][0],1,3,0, 2109 &Ke_gg_gaussian[0][0],0); 2110 2111 2112 /* Add the Ke_gg_gaussian, and optionally Ke_gg_drag_gaussian onto Ke_gg: */ 2113 for( i=0; i<numdofs; i++) for(j=0;j<numdofs;j++) Ke_gg[i][j]+=Ke_gg_gaussian[i][j]; 2114 } //for (ig=0; ig<num_gauss; ig++ 2115 2116 /*Add Ke_gg to global matrix Kgg: */ 2117 MatSetValues(Kgg,numdofs,doflist,numdofs,doflist,(const double*)Ke_gg,ADD_VALUES); 2118 2119 cleanup_and_return: 2120 xfree((void**)&first_gauss_area_coord); 2121 xfree((void**)&second_gauss_area_coord); 2122 xfree((void**)&third_gauss_area_coord); 2123 xfree((void**)&gauss_weights); 2124 } 2125 2104 2126 #undef __FUNCT__ 2105 2127 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticSurfaceVert" 2106 void Tria::CreateKMatrixDiagnosticSurfaceVert(Mat Kgg, ParameterInputs*inputs,int analysis_type){2128 void Tria::CreateKMatrixDiagnosticSurfaceVert(Mat Kgg,void* vinputs,int analysis_type){ 2107 2129 2108 2130 int i,j; … … 2144 2166 double Ke_gg[numdofs][numdofs]; //local element stiffness matrix 2145 2167 double Ke_gg_gaussian[numdofs][numdofs]; //stiffness matrix evaluated at the gaussian point. 2168 2169 ParameterInputs* inputs=NULL; 2170 2171 /*recover pointers: */ 2172 inputs=(ParameterInputs*)vinputs; 2146 2173 2147 2174 /* Get node coordinates and dof list: */ … … 2227 2254 #undef __FUNCT__ 2228 2255 #define __FUNCT__ "Tria::CreatePVectorDiagnosticBaseVert" 2229 void Tria::CreatePVectorDiagnosticBaseVert(Vec pg, ParameterInputs*inputs,int analysis_type){2256 void Tria::CreatePVectorDiagnosticBaseVert(Vec pg,void* vinputs,int analysis_type){ 2230 2257 2231 2258 int i,j; … … 2263 2290 /*input parameters for structural analysis (diagnostic): */ 2264 2291 double* velocity_param=NULL; 2265 double vx_list[numgrids] ;2266 double vy_list[numgrids] ;2292 double vx_list[numgrids]={0,0,0}; 2293 double vy_list[numgrids]={0,0,0}; 2267 2294 double vx,vy; 2268 2295 double meltingvalue; 2269 2296 double slope[2]; 2270 2297 double dbdx,dbdy; 2298 int dofs1[1]={0}; 2299 int dofs2[1]={1}; 2300 2301 ParameterInputs* inputs=NULL; 2302 2303 /*recover pointers: */ 2304 inputs=(ParameterInputs*)vinputs; 2271 2305 2272 2306 /* recover input parameters: */ 2273 velocity_param=ParameterInputsRecover(inputs,"velocity");2274 if(!velocity_param)throw ErrorException(__FUNCT__," cannot compute vertical velocity without horizontal velocity");2307 if(!inputs->Recover("velocity",&vx_list[0],1,dofs1,numgrids,(void**)nodes))throw ErrorException(__FUNCT__," cannot compute vertical velocity without horizontal velocity"); 2308 inputs->Recover("velocity",&vy_list[0],1,dofs2,numgrids,(void**)nodes); 2275 2309 2276 2310 /* Get node coordinates and dof list: */ … … 2281 2315 for(i=0;i<numdofs;i++) pe_g[i]=0.0; 2282 2316 2283 /*Initialize vx_list and vy_list: */2284 for(i=0;i<numgrids;i++){2285 if(velocity_param){2286 /*doflist is a list of dofs for the node. We have 1 dof per node for the vertical analysis. But the horizontal velocity2287 *runs with 2 dofs per node! Therefore, we multiply by 2 the dof count, to extract the velocity from the inputs: */2288 vx_list[i]=velocity_param[2*doflist[i*numberofdofspernode+0]+0];2289 vy_list[i]=velocity_param[2*doflist[i*numberofdofspernode+0]+1];2290 }2291 else{2292 vx_list[i]=0;2293 vy_list[i]=0;2294 }2295 }2296 2297 2317 /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */ 2298 2318 GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2); -
issm/trunk/src/c/objects/Tria.h
r241 r246 3 3 */ 4 4 5 #ifndef _TRIA_H 6 #define _TRIA_H 5 #ifndef _TRIA_H_ 6 #define _TRIA_H_ 7 7 8 8 9 #include "./Element.h" … … 10 11 #include "./Matice.h" 11 12 #include "./Matpar.h" 13 #include "./ParameterInputs.h" 12 14 13 15 class Tria: public Element{ … … 63 65 int MyRank(); 64 66 void Configure(void* loads,void* nodes,void* materials); 65 void CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type);66 void CreatePVector(Vec pg, ParameterInputs* inputs, int analysis_type);67 void UpdateFromInputs( ParameterInputs* inputs);67 void CreateKMatrix(Mat Kgg,void* inputs,int analysis_type); 68 void CreatePVector(Vec pg, void* inputs, int analysis_type); 69 void UpdateFromInputs(void* inputs); 68 70 void GetDofList(int* doflist,int* pnumberofdofs); 69 71 70 void CreateKMatrixDiagnosticHoriz(Mat Kgg,ParameterInputs* inputs,int analysis_type); 71 void CreateKMatrixDiagnosticHorizFriction(Mat Kgg,ParameterInputs* inputs,int analysis_type); 72 void CreateKMatrixDiagnosticSurfaceVert(Mat Kgg,ParameterInputs* inputs,int analysis_type); 72 void CreateKMatrixDiagnosticHoriz(Mat Kgg,void* inputs,int analysis_type); 73 void CreateKMatrixDiagnosticHorizFriction(Mat Kgg,void* inputs,int analysis_type); 74 void CreateKMatrixDiagnosticBaseVert(Mat Kgg,void* inputs,int analysis_type); 75 void CreateKMatrixDiagnosticSurfaceVert(Mat Kgg,void* inputs,int analysis_type); 73 76 void GetParameterValue(double* pp, double* plist, double* gauss_l1l2l3); 74 77 void GetParameterDerivativeValue(double* p, double* plist,double* xyz_list, double* gauss_l1l2l3); … … 83 86 void GetJacobianInvert(double* Jinv, double* xyz_list,double* gauss_l1l2l3); 84 87 void GetJacobian(double* J, double* xyz_list,double* gauss_l1l2l3); 85 void Du(Vec du_g,double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type);86 void Gradj(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type,char* control_type);87 void GradjDrag(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type);88 void GradjB(Vec grad_g,double* u_g,double* lambda_g, ParameterInputs* inputs,int analysis_type);89 double Misfit(double* u_g,double* u_g_obs, ParameterInputs* inputs,int analysis_type);88 void Du(Vec du_g,double* u_g,double* u_g_obs,void* inputs,int analysis_type); 89 void Gradj(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type,char* control_type); 90 void GradjDrag(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type); 91 void GradjB(Vec grad_g,double* u_g,double* lambda_g,void* inputs,int analysis_type); 92 double Misfit(double* u_g,double* u_g_obs,void* inputs,int analysis_type); 90 93 91 void CreatePVectorDiagnosticHoriz(Vec pg, ParameterInputs* inputs,int analysis_type);92 void CreatePVectorDiagnosticBaseVert(Vec pg, ParameterInputs* inputs,int analysis_type);93 Matpar* GetMatPar();94 void CreatePVectorDiagnosticHoriz(Vec pg,void* inputs,int analysis_type); 95 void CreatePVectorDiagnosticBaseVert(Vec pg,void* inputs,int analysis_type); 96 void* GetMatPar(); 94 97 int GetShelf(); 95 void GetNodes( Node** nodes);98 void GetNodes(void** nodes); 96 99 int GetOnBed(); 97 100 -
issm/trunk/src/c/objects/objects.h
r8 r246 14 14 #include "./Matpar.h" 15 15 #include "./Node.h" 16 #include "./Object.h"17 16 #include "./Penta.h" 18 17 #include "./Tria.h" … … 28 27 #include "./Contour.h" 29 28 #include "./ParameterInputs.h" 29 #include "./Input.h" 30 30 #include "./Friction.h" 31 31 #include "./SolverEnum.h" -
issm/trunk/src/c/parallel/control.cpp
r237 r246 34 34 double search_scalar; 35 35 char* control_type=NULL; 36 int gsize;37 36 double* fit=NULL; 38 37 double* optscal=NULL; 39 38 double* u_g_obs=NULL; 39 double* u_g_initial=NULL; 40 int gsize; 41 int numberofnodes; 40 42 double* maxiter=NULL; 41 43 double tolx; … … 51 53 OptArgs optargs; 52 54 OptPars optpars; 55 Param* param=NULL; 53 56 54 57 … … 87 90 femmodel.parameters->FindParam((void*)&mincontrolconstraint,"mincontrolconstraint"); 88 91 femmodel.parameters->FindParam((void*)&maxcontrolconstraint,"maxcontrolconstraint"); 89 gsize=femmodel.nodes->NumberOfDofs(); 90 92 femmodel.parameters->FindParam((void*)&gsize,"gsize"); 91 93 femmodel.parameters->FindParam((void*)&p_g,"p_g"); 92 94 femmodel.parameters->FindParam((void*)&u_g_obs,"u_g_obs"); … … 96 98 97 99 /*Initialize inputs:*/ 98 inputs=NewParameterInputs(); 100 101 femmodel.parameters->FindParam((void*)&u_g_initial,"u_g"); 102 femmodel.parameters->FindParam((void*)&numberofnodes,"numberofnodes"); 103 104 inputs=new ParameterInputs; 105 inputs->Add("velocity",u_g_initial,3,numberofnodes); 106 107 /*erase useless parameters: */ 108 param=(Param*)femmodel.parameters->FindParamObject("p_g"); 109 femmodel.parameters->DeleteObject((Object*)param); 110 111 param=(Param*)femmodel.parameters->FindParamObject("u_g_obs"); 112 femmodel.parameters->DeleteObject((Object*)param); 113 114 param=(Param*)femmodel.parameters->FindParamObject("u_g"); 115 femmodel.parameters->DeleteObject((Object*)param); 116 99 117 100 118 /*Start looping: */ … … 102 120 103 121 _printf_("\n%s%i%s%i\n"," control method step ",n+1,"/",nsteps); 104 ParameterInputsAddFromMat(inputs,p_g,gsize,control_type);105 ParameterInputsAddFromDouble(inputs,fit[n],"fit");122 inputs->Add(control_type,p_g,2,numberofnodes); 123 inputs->Add("fit",fit[n]); 106 124 107 125 _printf_("%s\n"," computing gradJ..."); … … 135 153 if (((n+1)%5)==0){ 136 154 _printf_("%s\n"," saving temporary results..."); 137 ParameterInputsAddFromMat(inputs,p_g,gsize,control_type);138 ParameterInputsAddFromDouble(inputs,fit[n],"fit");155 inputs->Add(control_type,p_g,2,numberofnodes); 156 inputs->Add("fit",fit[n]); 139 157 diagnostic_core_nonlinear(&u_g,NULL,NULL,inputs,&femmodel); 140 158 OutputControl(u_g,p_g,J,nsteps,femmodel.partition,outputfilename,femmodel.nodesets); … … 150 168 /*Write results to disk: */ 151 169 _printf_("%s\n"," preparing final velocity solution..."); 152 ParameterInputsAddFromMat(inputs,p_g,gsize,control_type);153 ParameterInputsAddFromDouble(inputs,fit[n],"fit");170 inputs->Add(control_type,p_g,2,numberofnodes); 171 inputs->Add("fit",fit[n]); 154 172 155 173 diagnostic_core_nonlinear(&u_g,NULL,NULL,inputs,&femmodel); -
issm/trunk/src/c/parallel/diagnostic.cpp
r210 r246 24 24 char* lockname=NULL; 25 25 char* analysis_type="diagnostic_horiz"; 26 int numberofnodes; 26 27 27 28 /*Intermediary: */ … … 32 33 33 34 double* u_g_initial=NULL; 34 int gsize;35 35 Param* param=NULL; 36 36 … … 60 60 61 61 _printf_("initialize inputs:\n"); 62 inputs=NewParameterInputs(); 63 femmodel.parameters->FindParam((void*)&u_g,"u_g"); 64 femmodel.parameters->FindParam((void*)&gsize,"gsize"); 65 ParameterInputsAddFromMat(inputs,u_g_initial,gsize,"velocity"); 62 femmodel.parameters->FindParam((void*)&u_g_initial,"u_g"); 63 femmodel.parameters->FindParam((void*)&numberofnodes,"numberofnodes"); 66 64 65 inputs=new ParameterInputs; 66 inputs->Add("velocity",u_g_initial,3,numberofnodes); 67 67 68 param=(Param*)femmodel.parameters->FindParamObject("u_g"); 68 69 femmodel.parameters->DeleteObject((Object*)param); -
issm/trunk/src/c/parallel/diagnostic_core_nonlinear.cpp
r81 r246 31 31 int num_unstable_constraints; 32 32 int count; 33 int numberofnodes; 33 34 34 35 Vec dug; … … 47 48 fem->parameters->FindParam((void*)&connectivity,"connectivity"); 48 49 fem->parameters->FindParam((void*)&numberofdofspernode,"numberofdofspernode"); 50 fem->parameters->FindParam((void*)&numberofnodes,"numberofnodes"); 49 51 fem->parameters->FindParam((void*)&solver_string,"solverstring"); 50 52 fem->parameters->FindParam((void*)&eps_rel,"eps_rel"); … … 64 66 65 67 /*Set input parameters: */ 66 if(old_ug) ParameterInputsAddFromVec(inputs,old_ug,"old_velocity");67 if(ug) ParameterInputsAddFromVec(inputs,ug,"velocity");68 if(old_ug)inputs->Add("old_velocity",old_ug,numberofdofspernode,numberofnodes); 69 if(ug)inputs->Add("velocity",ug,numberofdofspernode,numberofnodes); 68 70 69 71 //save pointer to old velocity … … 112 114 //Deal with penalty loads 113 115 if (debug) _printf_(" penalty constraints\n"); 114 ParameterInputsAddFromVec(inputs,ug,"velocity");115 ParameterInputsAddFromVec(inputs,old_ug,"old_velocity");116 inputs->Add("old_velocity",old_ug,numberofdofspernode,numberofnodes); 117 inputs->Add("velocity",ug,numberofdofspernode,numberofnodes); 116 118 117 119 PenaltyConstraintsx(&constraints_converged, &num_unstable_constraints, fem->elements,fem->nodes,loads,fem->materials,inputs,analysis_type); … … 157 159 158 160 /*Set input parameters: */ 159 ParameterInputsAddFromVec(inputs,ug,"velocity");160 ParameterInputsAddFromVec(inputs,old_ug,"old_velocity");161 inputs->Add("old_velocity",old_ug,numberofdofspernode,numberofnodes); 162 inputs->Add("velocity",ug,numberofdofspernode,numberofnodes); 161 163 162 164 kflag=1; pflag=0; //stiffness generation only -
issm/trunk/src/c/parallel/objectivefunctionC.cpp
r46 r246 41 41 Vec u_g=NULL; 42 42 double* u_g_double=NULL; 43 int numberofnodes; 43 44 44 45 … … 58 59 femmodel->parameters->FindParam((void*)&fit,"fit"); 59 60 femmodel->parameters->FindParam((void*)&analysis_type,"analysis_type"); 61 femmodel->parameters->FindParam((void*)&numberofnodes,"numberofnodes"); 60 62 61 63 /*First copy p_g so we don't modify it: */ … … 70 72 71 73 /*Add new parameter to inputs: */ 72 ParameterInputsAddFromMat(inputs,p_g_copy,gsize,control_type);74 inputs->Add(control_type,p_g_copy,2,numberofnodes); 73 75 74 76 //Run diagnostic with updated parameters. … … 77 79 78 80 //Compute misfit for this velocity field. 79 ParameterInputsAddFromDouble(inputs,fit[n],"fit");81 inputs->Add("fit",fit[n]); 80 82 Misfitx( &J, femmodel->elements,femmodel->nodes, femmodel->loads, femmodel->materials, 81 83 u_g_double,u_g_obs, inputs,analysis_type); -
issm/trunk/src/m/solutions/cielo/diagnostic.m
r202 r246 19 19 20 20 %initialize inputs 21 if strcmp(md.analysis_type,'diagnostic_stokes'), 22 inputs.velocity=m_dh.parameters.u_g; 23 else 24 inputs.velocity=zeros(2*m_dh.parameters.numberofnodes,1); 25 inputs.velocity(1:2:end)=m_dh.parameters.u_g(1:3:end); 26 inputs.velocity(2:2:end)=m_dh.parameters.u_g(2:3:end); 27 end 21 inputs=parameterinputs; 22 inputs=add(inputs,'velocity',m_dh.parameters.u_g,'doublevec',3,m_dh.parameters.numberofnodes); 28 23 29 24 %Get horizontal solution. -
issm/trunk/src/m/solutions/cielo/diagnostic_core_nonlinear.m
r202 r246 12 12 converged=0; 13 13 14 [velocity_param velocity_is_present]=recover_input(inputs,'velocity'); 15 if velocity_is_present 16 soln(count).u_g=velocity_param; 17 else 18 soln(count).u_g=[]; 19 end 14 soln(count).u_g=get(inputs,'velocity',[1 1 (m.parameters.numberofdofspernode>=3)]); %only keep vz if running with more than 3 dofs per node 20 15 soln(count).u_f=[]; 21 16 … … 27 22 28 23 %add velocity to inputs 29 inputs .velocity=full(soln(count).u_g);24 inputs=add(inputs,'velocity',soln(count).u_g,'doublevec',m.parameters.numberofdofspernode,m.parameters.numberofnodes); 30 25 if count>1, 31 inputs .old_velocity=full(soln(count-1).u_g);26 inputs=add(inputs,'old_velocity',soln(count-1).u_g,'doublevec',m.parameters.numberofdofspernode,m.parameters.numberofnodes); 32 27 else 33 inputs .old_velocity=full(soln(count).u_g);28 inputs=add(inputs,'old_velocity',soln(count).u_g,'doublevec',m.parameters.numberofdofspernode,m.parameters.numberofnodes); 34 29 end 35 30 36 31 %Update inputs in datasets 37 32 [m.elements,m.nodes, loads,m.materials]=UpdateFromInputs(m.elements,m.nodes, loads,m.materials,inputs); 38 33 39 34 %system matrices 40 35 [K_gg_nopenalty , p_g_nopenalty]=SystemMatrices(m.elements,m.nodes,loads,m.materials,m.parameters,inputs); … … 67 62 68 63 %Deal with penalty loads 69 inputs .velocity=soln(count).u_g;64 inputs=add(inputs,'velocity',soln(count).u_g,'vector',m.parameters.numberofdofspernode,m.parameters.numberofnodes); 70 65 71 66 %penalty constraints … … 73 68 74 69 % Figure out if convergence is reached. 75 if(count>=3 | velocity_is_present), 76 dug=soln(count).u_g-soln(count-1).u_g; 77 nduinf=norm(dug,inf)*m.parameters.yts; 78 ndu=norm(dug,2); 79 nu=norm(soln(count-1).u_g,2); 70 dug=soln(count).u_g-soln(count-1).u_g; 71 nduinf=norm(dug,inf)*m.parameters.yts; 72 ndu=norm(dug,2); 73 nu=norm(soln(count-1).u_g,2); 80 74 81 %Relative criterion 82 if (ndu/nu<=m.parameters.eps_rel), 83 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: norm(du)/norm(u)=',ndu/nu,' < ',m.parameters.eps_rel)); end 84 converged=1; 75 %Relative criterion 76 if (ndu/nu<=m.parameters.eps_rel), 77 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: norm(du)/norm(u)=',ndu/nu,' < ',m.parameters.eps_rel)); end 78 converged=1; 79 else 80 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: norm(du)/norm(u)=',ndu/nu,' > ',m.parameters.eps_rel)); end 81 converged=0; 82 end 83 84 %Absolute criterion 85 if ~isnan(m.parameters.eps_abs), 86 if (nduinf<=m.parameters.eps_abs), 87 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: max(du)=',nduinf,' < ',m.parameters.eps_abs)); end 85 88 else 86 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: norm(du)/norm(u)=',ndu/nu,' > ',m.parameters.eps_rel)); end87 converged=0;89 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: max(du)=',nduinf,' > ',m.parameters.eps_abs)); end 90 converged=0; 88 91 end 92 end 89 93 90 %Absolute criterion 91 if ~isnan(m.parameters.eps_abs), 92 if (nduinf<=m.parameters.eps_abs), 93 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: max(du)=',nduinf,' < ',m.parameters.eps_abs)); end 94 else 95 if m.parameters.debug, disp(sprintf('%s %g %s %g',' convergence criterion: max(du)=',nduinf,' > ',m.parameters.eps_abs)); end 96 converged=0; 97 end 98 end 99 100 %rift convergence criterion 101 if ~constraints_converged, 102 converged=0; 103 end 94 %rift convergence criterion 95 if ~constraints_converged, 96 converged=0; 104 97 end 105 98 … … 118 111 if nout==2, 119 112 120 inputs .velocity=full(soln(count).u_g);113 inputs=add(inputs,'velocity',soln(count).u_g,'vector',m.parameters.numberofdofspernode,m.parameters.numberofnodes); 121 114 m.parameters.kflag=1; m.parameters.pflag=0; 122 115 [K_gg, p_g]=SystemMatrices(m.elements,m.nodes,loads,m.materials,m.parameters,inputs); -
issm/trunk/src/mex/Du/Du.cpp
r1 r246 40 40 41 41 /*Fetch inputs: */ 42 ParameterInputsInit(&inputs,INPUTS); 42 inputs=new ParameterInputs; 43 inputs->Init(INPUTS); 43 44 44 45 /*!Call core code: */ … … 56 57 xfree((void**)&u_g_obs); 57 58 VecFree(&du_g); 58 DeleteParameterInputs(&inputs);59 delete inputs; 59 60 60 61 /*end module: */ -
issm/trunk/src/mex/Gradj/Gradj.cpp
r1 r246 42 42 43 43 /*Fetch inputs: */ 44 ParameterInputsInit(&inputs,INPUTS); 44 inputs=new ParameterInputs; 45 inputs->Init(INPUTS); 45 46 46 47 /*!Call core code: */ … … 58 59 xfree((void**)&lambda_g); 59 60 xfree((void**)&control_type); 60 DeleteParameterInputs(&inputs);61 delete inputs; 61 62 VecFree(&grad_g); 62 63 -
issm/trunk/src/mex/Misfit/Misfit.cpp
r1 r246 39 39 40 40 /*Fetch inputs: */ 41 ParameterInputsInit(&inputs,INPUTS); 41 inputs=new ParameterInputs; 42 inputs->Init(INPUTS); 42 43 43 44 /*!Call core code: */ … … 54 55 xfree((void**)&u_g); 55 56 xfree((void**)&u_g_obs); 56 DeleteParameterInputs(&inputs);57 delete inputs 57 58 58 59 /*end module: */ -
issm/trunk/src/mex/PenaltyConstraints/PenaltyConstraints.cpp
r1 r246 38 38 39 39 /*Fetch inputs: */ 40 ParameterInputsInit(&inputs,INPUTS); 40 inputs=new ParameterInputs; 41 inputs->Init(INPUTS); 41 42 42 43 /*!Generate internal degree of freedom numbers: */ … … 54 55 delete loads; 55 56 delete materials; 56 DeleteParameterInputs(&inputs);57 delete inputs; 57 58 58 59 /*end module: */ -
issm/trunk/src/mex/PenaltySystemMatrices/PenaltySystemMatrices.cpp
r1 r246 40 40 41 41 /*Fetch inputs: */ 42 ParameterInputsInit(&inputs,INPUTS); 42 inputs=new ParameterInputs; 43 inputs->Init(INPUTS); 43 44 44 45 /*!Generate stiffnesses from penalties: */ … … 54 55 delete loads; 55 56 delete materials; 56 DeleteParameterInputs(&inputs);57 delete inputs; 57 58 MatFree(&Kgg); 58 59 VecFree(&pg); -
issm/trunk/src/mex/SystemMatrices/SystemMatrices.cpp
r1 r246 44 44 45 45 /*Fetch inputs: */ 46 ParameterInputsInit(&inputs,INPUTS); 46 inputs=new ParameterInputs; 47 inputs->Init(INPUTS); 47 48 48 49 /*!Generate internal degree of freedom numbers: */ … … 59 60 delete loads; 60 61 delete materials; 61 DeleteParameterInputs(&inputs);62 delete inputs; 62 63 MatFree(&Kgg); 63 64 VecFree(&pg); -
issm/trunk/src/mex/UpdateFromInputs/UpdateFromInputs.cpp
r1 r246 30 30 31 31 /*Fetch inputs: */ 32 ParameterInputsInit(&inputs,INPUTS); 32 inputs=new ParameterInputs; 33 inputs->Init(INPUTS); 33 34 34 35 /*!Generate internal degree of freedom numbers: */ … … 46 47 delete loads; 47 48 delete materials; 48 DeleteParameterInputs(&inputs);49 delete inputs; 49 50 50 51 /*end module: */
Note:
See TracChangeset
for help on using the changeset viewer.