Changeset 22515
- Timestamp:
- 03/10/18 19:14:51 (7 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Cfsurfacesquare.cpp
r22507 r22515 119 119 IssmDouble J=0.; 120 120 IssmDouble J_sum=0.; 121 121 printf("-------------- file: Cfsurfacesquare.cpp line: %i\n",__LINE__); 122 _printf_("current time: "<<time<<" datatime: "<<datatime<<"\n"); 122 123 if(datatime<=time && !timepassedflag){ 124 printf("-------------- file: Cfsurfacesquare.cpp line: %i\n",__LINE__); 123 125 for(i=0;i<femmodel->elements->Size();i++){ 124 126 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i); -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r22507 r22515 1602 1602 } 1603 1603 else _error_("Cannot add input for vector type " << vector_type << " (not supported)"); 1604 } 1605 /*}}}*/ 1606 void Element::ControlInputCreate(IssmDouble* vector,IssmDouble* min_vector,IssmDouble* max_vector,IoModel* iomodel,int M,int N,int input_enum,int id){/*{{{*/ 1607 1608 /*Intermediaries*/ 1609 int numvertices = this->GetNumberOfVertices(); 1610 int *vertexids = xNew<int>(numvertices); 1611 IssmDouble *values = xNew<IssmDouble>(numvertices); 1612 IssmDouble *values_min = xNew<IssmDouble>(numvertices); 1613 IssmDouble *values_max = xNew<IssmDouble>(numvertices); 1614 1615 /*Some sanity checks*/ 1616 _assert_(vector); 1617 _assert_(min_vector); 1618 _assert_(max_vector); 1619 1620 /*For now we only support nodal vectors*/ 1621 if(M!=iomodel->numberofvertices) _error_("not supported"); 1622 if(N!=1) _error_("not supported"); 1623 1624 /*Recover vertices ids needed to initialize inputs*/ 1625 _assert_(iomodel->elements); 1626 for(int i=0;i<numvertices;i++){ 1627 vertexids[i]=reCast<int>(iomodel->elements[numvertices*this->Sid()+i]); //ids for vertices are in the elements array from Matlab 1628 } 1629 1630 /*Are we in transient or static? */ 1631 if(M==iomodel->numberofvertices){ 1632 for(int i=0;i<numvertices;i++){ 1633 values[i]=vector[vertexids[i]-1]; 1634 values_min[i] = min_vector[vertexids[i]-1]; 1635 values_max[i] = max_vector[vertexids[i]-1]; 1636 } 1637 this->AddControlInput(input_enum,values,min_vector,max_vector,P1Enum,id); 1638 } 1639 1640 /*clean up*/ 1641 xDelete<IssmDouble>(values); 1642 xDelete<int>(vertexids); 1604 1643 } 1605 1644 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r22507 r22515 122 122 void InputChangeName(int enum_type,int enum_type_old); 123 123 void InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code); 124 void ControlInputCreate(IssmDouble* doublearray,IssmDouble* independents_min,IssmDouble* independents_max,IoModel* iomodel,int M,int N,int input_enum,int id); 124 125 void DatasetInputAdd(int enum_type,IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code,int input_enum); 125 126 void InputDuplicate(int original_enum,int new_enum); … … 188 189 virtual void AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum)=0; 189 190 virtual void AddInput(int input_enum, IssmDouble* values, int interpolation_enum)=0; 191 virtual void AddControlInput(int input_enum, IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id){_error_("not supported yet");}; 192 virtual void DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,IoModel* iomodel,int input_enum){_error_("not supported");}; 190 193 virtual void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0; 191 194 virtual void BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r22379 r22515 1400 1400 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1401 1401 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1402 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1402 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1403 1403 } 1404 1404 break; … … 1408 1408 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1409 1409 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1410 this->inputs->AddInput(new ControlInput(VxEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1410 this->inputs->AddInput(new ControlInput(VxEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1411 1411 } 1412 1412 break; … … 1416 1416 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1417 1417 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1418 this->inputs->AddInput(new ControlInput(VyEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1418 this->inputs->AddInput(new ControlInput(VyEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1419 1419 } 1420 1420 break; … … 1424 1424 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1425 1425 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1426 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1426 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1427 1427 } 1428 1428 break; … … 1432 1432 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1433 1433 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1434 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1434 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1435 1435 } 1436 1436 break; … … 1440 1440 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1441 1441 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1442 this->inputs->AddInput(new ControlInput(DamageDEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1442 this->inputs->AddInput(new ControlInput(DamageDEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1443 1443 } 1444 1444 break; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.cpp
r21876 r22515 394 394 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts; 395 395 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts; 396 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));396 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 397 397 } 398 398 break; … … 402 402 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts; 403 403 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts; 404 this->inputs->AddInput(new ControlInput(VxEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));404 this->inputs->AddInput(new ControlInput(VxEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 405 405 } 406 406 break; … … 410 410 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts; 411 411 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]/yts; 412 this->inputs->AddInput(new ControlInput(VyEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));412 this->inputs->AddInput(new ControlInput(VyEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 413 413 } 414 414 break; … … 418 418 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]; 419 419 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]; 420 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));420 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 421 421 } 422 422 break; … … 426 426 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]; 427 427 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]; 428 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));428 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 429 429 } 430 430 break; … … 434 434 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]; 435 435 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tetra_vertex_ids[j]-1)*num_control_type+i]; 436 this->inputs->AddInput(new ControlInput(DamageDEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));436 this->inputs->AddInput(new ControlInput(DamageDEnum,TetraInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 437 437 } 438 438 break; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r22488 r22515 168 168 _assert_(this->inputs); 169 169 this->inputs->AddInput(new TriaInput(input_enum,values,interpolation_enum)); 170 } 171 /*}}}*/ 172 void Tria::AddControlInput(int input_enum,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id){/*{{{*/ 173 174 /*Call inputs method*/ 175 _assert_(this->inputs); 176 this->inputs->AddInput(new ControlInput(input_enum,TriaInputEnum,values,values_min,values_max,interpolation_enum,id)); 177 } 178 /*}}}*/ 179 void Tria::DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,IoModel* iomodel,int input_enum){/*{{{*/ 180 181 IssmDouble nodeinputs[NUMVERTICES]; 182 if(num_inputs<1) _error_("Cannot create a DatasetInput of size <1"); 183 if(M!=iomodel->numberofvertices) _error_("not supported yet"); 184 if(N!=num_inputs) _error_("sizes are not consistent"); 185 186 int tria_vertex_ids[3]; 187 188 for(int k=0;k<3;k++){ 189 tria_vertex_ids[k]=reCast<int>(iomodel->elements[3*this->Sid()+k]); //ids for vertices are in the elements array from Matlab 190 } 191 /*Create inputs and add to DataSetInput*/ 192 DatasetInput* datasetinput=new DatasetInput(input_enum); 193 for(int i=0;i<num_inputs;i++){ 194 for(int j=0;j<NUMVERTICES;j++)nodeinputs[j]=array[(tria_vertex_ids[j]-1)*N+i]; 195 datasetinput->AddInput(new TriaInput(input_enum,nodeinputs,P1Enum),individual_enums[i]); 196 } 197 198 /*Add datasetinput to element inputs*/ 199 this->inputs->AddInput(datasetinput); 170 200 } 171 201 /*}}}*/ … … 1911 1941 IssmDouble cmmininputs[3]; 1912 1942 IssmDouble cmmaxinputs[3]; 1913 bool control_analysis = false;1943 bool control_analysis,ad_analysis = false; 1914 1944 int num_control_type,num_responses; 1915 1945 char** controls = NULL; … … 1919 1949 iomodel->FindConstant(&yts,"md.constants.yts"); 1920 1950 iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol"); 1921 if(control_analysis) iomodel->FindConstant(&num_control_type,"md.inversion.num_control_parameters"); 1922 if(control_analysis) iomodel->FindConstant(&num_responses,"md.inversion.num_cost_functions"); 1951 iomodel->FindConstant(&ad_analysis, "md.autodiff.isautodiff"); 1952 if(control_analysis && !ad_analysis) iomodel->FindConstant(&num_control_type,"md.inversion.num_control_parameters"); 1953 if(control_analysis && !ad_analysis) iomodel->FindConstant(&num_responses,"md.inversion.num_cost_functions"); 1954 if(control_analysis && ad_analysis) iomodel->FindConstant(&num_control_type,"md.autodiff.num_independent_objects"); 1955 if(control_analysis && ad_analysis) iomodel->FindConstant(&num_responses,"md.autodiff.num_dependent_objects"); 1956 1957 1923 1958 1924 1959 /*Recover vertices ids needed to initialize inputs*/ … … 1934 1969 /*Control Inputs*/ 1935 1970 if (control_analysis){ 1936 iomodel->FindConstant(&controls,NULL,"md.inversion.control_parameters"); 1971 if(!ad_analysis)iomodel->FindConstant(&controls,NULL,"md.inversion.control_parameters"); 1972 if(ad_analysis)iomodel->FindConstant(&controls,NULL,"md.autodiff.independent_object_names"); 1973 1937 1974 for(i=0;i<num_control_type;i++){ 1938 1975 _assert_(controls[i]); … … 1944 1981 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1945 1982 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1946 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1983 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1947 1984 } 1948 1985 break; … … 1952 1989 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1953 1990 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1954 this->inputs->AddInput(new ControlInput(VxEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1991 this->inputs->AddInput(new ControlInput(VxEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1955 1992 } 1956 1993 break; … … 1960 1997 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1961 1998 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1962 this->inputs->AddInput(new ControlInput(VyEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));1999 this->inputs->AddInput(new ControlInput(VyEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1963 2000 } 1964 2001 break; … … 1968 2005 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1969 2006 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1970 this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));2007 this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1971 2008 } 1972 2009 break; … … 1976 2013 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1977 2014 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1978 this->inputs->AddInput(new ControlInput(BalancethicknessSpcthicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));2015 this->inputs->AddInput(new ControlInput(BalancethicknessSpcthicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1979 2016 } 1980 2017 break; … … 1984 2021 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1985 2022 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1986 this->inputs->AddInput(new ControlInput(BalancethicknessOmegaEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));2023 this->inputs->AddInput(new ControlInput(BalancethicknessOmegaEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1987 2024 } 1988 2025 break; … … 1992 2029 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1993 2030 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 1994 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));2031 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 1995 2032 } 1996 2033 break; … … 2000 2037 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 2001 2038 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 2002 this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));2039 this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 2003 2040 } 2004 2041 break; … … 2008 2045 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 2009 2046 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i]; 2010 this->inputs->AddInput(new ControlInput(DamageDbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs, i+1));2047 this->inputs->AddInput(new ControlInput(DamageDbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,P1Enum,i+1)); 2011 2048 } 2012 2049 break; -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r22473 r22515 162 162 void AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum); 163 163 void AddInput(int input_enum, IssmDouble* values, int interpolation_enum); 164 void AddControlInput(int input_enum, IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max, int interpolation_enum,int id); 165 void DatasetInputCreate(IssmDouble* array,int M,int N,int* individual_enums,int num_inputs,IoModel* iomodel,int input_enum); 164 166 IssmDouble GetArea(void); 165 167 IssmDouble GetArea3D(void); -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
r21974 r22515 22 22 } 23 23 /*}}}*/ 24 ControlInput::ControlInput(int in_enum_type,int enum_input,IssmDouble* pvalues,IssmDouble* pmin,IssmDouble* pmax,int id){/*{{{*/24 ControlInput::ControlInput(int in_enum_type,int input_layout_enum,IssmDouble* pvalues,IssmDouble* pmin,IssmDouble* pmax,int interp,int id){/*{{{*/ 25 25 26 26 control_id=id; 27 27 enum_type=in_enum_type; 28 28 29 switch(enum_input){ 29 _assert_(interp==P1Enum); 30 31 switch(input_layout_enum){ 30 32 case TriaInputEnum: 31 values =new TriaInput(enum_type,pvalues, P1Enum);32 savedvalues=new TriaInput(enum_type,pvalues, P1Enum);33 minvalues =new TriaInput(enum_type,pmin, P1Enum);34 maxvalues =new TriaInput(enum_type,pmax, P1Enum);33 values =new TriaInput(enum_type,pvalues,interp); 34 savedvalues=new TriaInput(enum_type,pvalues,interp); 35 minvalues =new TriaInput(enum_type,pmin,interp); 36 maxvalues =new TriaInput(enum_type,pmax,interp); 35 37 break; 36 38 case PentaInputEnum: 37 values =new PentaInput(enum_type,pvalues, P1Enum);38 savedvalues=new PentaInput(enum_type,pvalues, P1Enum);39 minvalues =new PentaInput(enum_type,pmin, P1Enum);40 maxvalues =new PentaInput(enum_type,pmax, P1Enum);39 values =new PentaInput(enum_type,pvalues,interp); 40 savedvalues=new PentaInput(enum_type,pvalues,interp); 41 minvalues =new PentaInput(enum_type,pmin,interp); 42 maxvalues =new PentaInput(enum_type,pmax,interp); 41 43 break; 42 44 default: 43 _error_("Input of Enum " << EnumToStringx( enum_input) << " not supported yet by ControlInput");45 _error_("Input of Enum " << EnumToStringx(input_layout_enum) << " not supported yet by ControlInput"); 44 46 } 45 47 gradient =NULL; -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h
r21974 r22515 26 26 /*ControlInput constructors, destructors: {{{*/ 27 27 ControlInput(); 28 ControlInput(int enum_type,int enum_input,IssmDouble* pvalues,IssmDouble* pmin,IssmDouble* pmax,int i d);28 ControlInput(int enum_type,int enum_input,IssmDouble* pvalues,IssmDouble* pmin,IssmDouble* pmax,int interp,int id); 29 29 ~ControlInput(); 30 30 /*}}}*/ -
issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp
r22445 r22515 355 355 long niter = long(maxsteps); /*Maximum number of iterations*/ 356 356 long nsim = long(maxiter);/*Maximum number of function calls*/ 357 357 358 358 /*Get initial guess*/ 359 359 Vector<double> *Xpetsc = NULL; 360 361 /*THIS IS WHERE IT FAILS*/ 360 362 GetPassiveVectorFromControlInputsx(&Xpetsc,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value"); 361 363 X = Xpetsc->ToMPISerial(); … … 363 365 delete Xpetsc; 364 366 _assert_(intn==numberofvertices*num_controls); 365 367 366 368 /*Get problem dimension and initialize gradient and initial guess*/ 367 369 long n = long(intn); … … 395 397 /*Initialize Gradient and cost function of M1QN3*/ 396 398 indic = 4; /*gradient required*/ 399 printf("-------------- file: controladm1qn3_core.cpp line: %i\n",__LINE__); 397 400 simul_ad(&indic,&n,X,&f,G,izs,rzs,(void*)&mystruct); 398 401 /*Estimation of the expected decrease in f during the first iteration*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
r22443 r22515 28 28 if(control_analysis){ 29 29 30 /*How many controls and how many responses?*/31 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.num_control_parameters",InversionNumControlParametersEnum));32 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.num_cost_functions",InversionNumCostFunctionsEnum));33 34 30 /*What solution type?*/ 35 31 if(solution_type==SteadystateSolutionEnum){ … … 40 36 } 41 37 42 /*recover controls and convert to Enums*/ 43 iomodel->FindConstant(&controls,&num_controls,"md.inversion.control_parameters"); 44 if(num_controls<1) _error_("no controls found"); 45 int* control_enums=xNew<int>(num_controls); 46 for(int i=0;i<num_controls;i++){ 47 control_enums[i]=StringToEnumx(controls[i]); 48 xDelete<char>(controls[i]); 38 switch(inversiontype){ 39 _printf_("Inversiontype: "<<inversiontype<<"\n"); 40 { 41 case 0:/*Brent Search*/ 42 case 1:/*TAO*/ 43 case 2:/*M1QN3*/ 44 case 3:/*Validation*/ 45 /*How many controls and how many responses?*/ 46 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.num_control_parameters",InversionNumControlParametersEnum)); 47 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.num_cost_functions",InversionNumCostFunctionsEnum)); 48 49 /*recover controls and convert to Enums*/ 50 iomodel->FindConstant(&controls,&num_controls,"md.inversion.control_parameters"); 51 if(num_controls<1) _error_("no controls found"); 52 int* control_enums=xNew<int>(num_controls); 53 for(int i=0;i<num_controls;i++){ 54 control_enums[i]=StringToEnumx(controls[i]); 55 xDelete<char>(controls[i]); 56 } 57 xDelete<char*>(controls); 58 parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_enums,num_controls)); 59 60 iomodel->FindConstant(&cm_responses,&num_costfunc,"md.inversion.cost_functions"); 61 if(num_costfunc<1) _error_ ("no cost functions found"); 62 int* costfunc_enums=xNew<int>(num_costfunc); 63 for(int i=0;i<num_costfunc;i++){ 64 costfunc_enums[i]=StringToEnumx(cm_responses[i]); 65 xDelete<char>(cm_responses[i]); 66 } 67 xDelete<char*>(cm_responses); 68 parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,costfunc_enums,num_costfunc)); 69 70 xDelete<int>(control_enums); 71 xDelete<int>(costfunc_enums); 72 73 break; 49 74 } 50 xDelete<char*>(controls); 51 parameters->AddObject(new IntVecParam(InversionControlParametersEnum,control_enums,num_controls)); 75 case 4:/*AD M1QN3*/ 76 { 77 /*Intermediaries*/ 78 int num_independent_objects,M; 79 char** names = NULL; 80 81 /*this is done somewhere else*/ 82 parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.num_independent_objects",InversionNumControlParametersEnum)); 83 parameters->AddObject(iomodel->CopyConstantObject("md.autodiff.num_dependent_objects",InversionNumCostFunctionsEnum)); 84 85 /*Step1: create controls (independents)*/ 86 iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects"); 87 _assert_(num_independent_objects>0); 88 iomodel->FetchData(&names,&M,"md.autodiff.independent_object_names"); 89 _assert_(M==num_independent_objects); 90 int* ind_enums=xNew<int>(num_independent_objects); 91 for(int i=0;i<num_independent_objects;i++){ 92 ind_enums[i]=StringToEnumx(names[i]); 93 xDelete<char>(names[i]); 94 } 52 95 53 iomodel->FindConstant(&cm_responses,&num_costfunc,"md.inversion.cost_functions"); 54 if(num_costfunc<1) _error_ ("no cost functions found"); 55 int* costfunc_enums=xNew<int>(num_costfunc); 56 for(int i=0;i<num_costfunc;i++){ 57 costfunc_enums[i]=StringToEnumx(cm_responses[i]); 58 xDelete<char>(cm_responses[i]); 96 parameters->AddObject(new IntVecParam(InversionControlParametersEnum,ind_enums,num_independent_objects)); 97 //iomodel->FetchData(&num_costfunc,"md.numberedcostfunction.num_cost_functions"); 98 _assert_(num_costfunc>0); 99 iomodel->FindConstant(&cm_responses,&num_costfunc,"md.autodiff.dependent_object_names"); 100 if(num_costfunc<1) _error_ ("no cost functions found"); 101 int* costfunc_enums=xNew<int>(num_costfunc); 102 for(int i=0;i<num_costfunc;i++){ 103 costfunc_enums[i]=StringToEnumx(cm_responses[i]); 104 xDelete<char>(cm_responses[i]); 105 } 106 xDelete<char*>(cm_responses); 107 parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,costfunc_enums,num_costfunc)); 108 109 iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.autodiff.independent_scaling_factors"); 110 parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_independent_objects)); 111 112 /*cleanup*/ 113 for(int i=0;i<num_independent_objects;i++){ 114 xDelete<char>(names[i]); 115 } 116 xDelete<char*>(names); 117 xDelete<int>(ind_enums); 118 xDelete<int>(costfunc_enums); 119 break; 120 } 121 default: 122 _error_("not supported"); 59 123 } 60 xDelete<char*>(cm_responses);61 parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,costfunc_enums,num_costfunc));62 63 xDelete<int>(control_enums);64 xDelete<int>(costfunc_enums);65 124 66 125 /*Inversion type specifics*/ … … 107 166 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxsteps",InversionMaxstepsEnum)); 108 167 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.maxiter",InversionMaxiterEnum)); 109 iomodel->FetchData(&control_scaling_factors,NULL,NULL,"md.inversion.control_scaling_factors"); 110 parameters->AddObject(new DoubleVecParam(InversionControlScalingFactorsEnum,control_scaling_factors,num_controls)); 111 break; 168 break; 112 169 default: 113 170 _error_("not supported"); 114 171 } 115 172 116 xDelete<int>(control_enums);117 173 xDelete<int>(maxiter); 118 174 xDelete<IssmDouble>(control_scaling_factors); -
issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
r22266 r22515 9 9 #include "../ModelProcessorx.h" 10 10 11 12 #if !defined(_HAVE_ADOLC_) 11 13 void UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel){ 12 14 13 15 /*Intermediary*/ 14 16 bool control_analysis; … … 21 23 char **cost_functions = NULL; 22 24 25 if(_HAVE_ADOLC_) return; 26 23 27 /*Fetch parameters: */ 24 28 iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol"); … … 27 31 /*Now, return if no control*/ 28 32 if(!control_analysis) return; 29 33 30 34 /*Process controls and convert from string to enums*/ 31 35 iomodel->FindConstant(&controls,&num_controls,"md.inversion.control_parameters"); … … 125 129 xDelete<char*>(controls); 126 130 } 131 #else 132 void UpdateElementsAndMaterialsControl(Elements* elements,Materials* materials, IoModel* iomodel){ 133 134 /*Intermediaries*/ 135 int num_independent_objects,M,N; 136 char** names = NULL; 137 int* types = NULL; 138 IssmDouble* independent = NULL; 139 IssmDouble** independents_min = NULL; 140 IssmDouble** independents_max = NULL; 141 142 /*Step1: create controls (independents)*/ 143 iomodel->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects"); 144 _assert_(num_independent_objects>0); 145 iomodel->FetchData(&names,&M,"md.autodiff.independent_object_names"); 146 _assert_(M==num_independent_objects); 147 iomodel->FetchData(&types,NULL,NULL,"md.autodiff.independent_object_types"); 148 149 150 /*TODO: fetch min and max*/ 151 independents_min = xNew<IssmDouble*>(num_independent_objects); 152 independents_max = xNew<IssmDouble*>(num_independent_objects); 153 for(int i=0;i<num_independent_objects;i++) independents_min[i]=NULL; 154 for(int i=0;i<num_independent_objects;i++) independents_max[i]=NULL; 155 156 /*create independent objects, and at the same time, fetch the corresponding independent variables, 157 *and declare them as such in ADOLC: */ 158 for(int i=0;i<num_independent_objects;i++){ 159 160 if(types[i]==1){ /* vector:*/ 161 162 /*Get field name and input Enum from independent name*/ 163 char* iofieldname = NULL; 164 int input_enum; 165 FieldAndEnumFromCode(&input_enum,&iofieldname,names[i]); 166 167 /*Fetch required data*/ 168 iomodel->FetchData(&independent,&M,&N,iofieldname); 169 iomodel->FetchData(&independents_min[i],&M,&N,"md.autodiff.independent_min_parameters"); 170 iomodel->FetchData(&independents_max[i],&M,&N,"md.autodiff.independent_max_parameters"); 171 172 _assert_(independent); 173 174 for(int j=0;j<elements->Size();j++){ 175 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j)); 176 element->ControlInputCreate(independent,independents_min[i],independents_max[i],iomodel,M,N,input_enum,i+1); 177 } 178 xDelete<IssmDouble>(independent); 179 } 180 else{ 181 _error_("Independent cannot be of size " << types[i]); 182 } 183 } 184 185 /*cleanup*/ 186 for(int i=0;i<num_independent_objects;i++){ 187 xDelete<char>(names[i]); 188 xDelete<IssmDouble>(independents_min[i]); 189 xDelete<IssmDouble>(independents_max[i]); 190 } 191 xDelete<IssmDouble*>(independents_min); 192 xDelete<IssmDouble*>(independents_max); 193 xDelete<char*>(names); 194 xDelete<int>(types); 195 196 /*Step2: create cost functions (dependents)*/ 197 198 return; 199 } 200 #endif -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
r22323 r22515 15 15 bool control_analysis; 16 16 bool dakota_analysis; 17 bool adolc_analysis; 17 18 int nnat,dummy; 18 19 int* nature=NULL; … … 22 23 iomodel->FindConstant(&dakota_analysis,"md.qmu.isdakota"); 23 24 iomodel->FindConstant(&materials_type,"md.materials.type"); 25 iomodel->FindConstant(&adolc_analysis,"md.autodiff.isautodiff"); 24 26 25 27 /*Did we already create the elements? : */ … … 30 32 31 33 /*Create elements*/ 32 if(control_analysis)iomodel->FetchData(2,"md.inversion.min_parameters","md.inversion.max_parameters"); 34 if(control_analysis && !adolc_analysis)iomodel->FetchData(2,"md.inversion.min_parameters","md.inversion.max_parameters"); 35 33 36 switch(iomodel->meshelementtype){ 34 37 case TriaEnum: … … 218 221 219 222 /*Free data: */ 220 iomodel->DeleteData(7,"md.mesh.upperelements","md.mesh.lowerelements","md.material.rheology_B", 221 "md.material.rheology_n","md.damage.D","md.inversion.min_parameters","md.inversion.max_parameters"); 223 iomodel->DeleteData(7,"md.mesh.upperelements","md.mesh.lowerelements","md.material.rheology_B","md.material.rheology_n","md.damage.D","md.inversion.min_parameters","md.inversion.max_parameters"); 222 224 223 225 /*Add new constant material property to materials, at the end: */ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
r22507 r22515 507 507 508 508 /*Intermediary*/ 509 int numout; 510 char **ncf_name_s = NULL; 511 char **ncf_definitionstring_s = NULL; 512 char **cost_functions = NULL; 513 int cost_function ,domaintype; 514 int num_cost_functions; 509 int numout,numout2; 510 char **ncf_name_s = NULL; 511 char **ncf_definitionstring_s = NULL; 512 char **cost_functions = NULL; 513 IssmDouble **cost_functions_weights = NULL; 514 int* cost_functions_weights_M = NULL; 515 int* cost_functions_weights_N = NULL; 516 int cost_function,domaintype; 517 int num_cost_functions; 515 518 516 519 /*Process cost functions and convert from string to enums*/ … … 523 526 } 524 527 525 //iomodel->FetchData(1,"md.numberedcostfunction.cost_functions_coefficients");526 527 528 iomodel->FetchMultipleData(&ncf_name_s,&numout,"md.numberedcostfunction.name"); 528 iomodel->FetchMultipleData(&ncf_definitionstring_s,&numout,"md.numberedcostfunction.definitionstring"); 529 if(numout>1) _error_("not implemented yet, check code here"); 529 iomodel->FetchMultipleData(&ncf_definitionstring_s,&numout2,"md.numberedcostfunction.definitionstring"); _assert_(numout2 == numout); 530 iomodel->FetchMultipleData(&cost_functions_weights,&cost_functions_weights_M,&cost_functions_weights_N,&numout2,"md.numberedcostfunction.cost_functions_coefficients"); _assert_(numout2 == numout); 531 if(numout!=1) _error_("not implemented yet, check code here"); 530 532 531 533 /*Fetch Observations */ … … 543 545 if(domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(elements,"md.numberedcostfunction.vy_obs",InversionVyObsEnum); 544 546 } 545 546 547 } 547 548 548 549 for(j=0;j<numout;j++){ 549 550 551 /*Now, for this particular misfit object, make sure we plug into the elements: the observation, and the weights.*/ 552 for(int k=0;k<elements->Size();k++){ 553 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(k)); 554 element->DatasetInputCreate(cost_functions_weights[i],cost_functions_weights_M[i],cost_functions_weights_N[i],cost_function_enums,num_cost_functions,iomodel,InversionCostFunctionsCoefficientsEnum); 555 } 550 556 output_definitions->AddObject(new Numberedcostfunction(ncf_name_s[j],StringToEnumx(ncf_definitionstring_s[j]),num_cost_functions,cost_function_enums)); 551 552 } 553 557 } 554 558 555 559 /*Free data: */ 556 //iomodel->DeleteData(1,"md.inversion.cost_functions_coefficients");557 560 iomodel->DeleteData(2,"md.numberedcostfunction.name","md.numberedcostfunction.definitionstring"); 558 561 xDelete<int>(cost_function_enums); … … 564 567 xDelete<char>(ncf_name_s[j]); 565 568 xDelete<char>(ncf_definitionstring_s[j]); 569 xDelete<IssmDouble>(cost_functions_weights[j]); 566 570 } 567 571 xDelete<char*>(ncf_name_s); 568 572 xDelete<char*>(ncf_definitionstring_s); 573 xDelete<int>(cost_functions_weights_M); 574 xDelete<int>(cost_functions_weights_N); 575 xDelete<IssmDouble*>(cost_functions_weights); 569 576 } 570 577 /*}}}*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r22473 r22515 347 347 #ifdef _HAVE_ADOLC_ 348 348 if(VerboseMProcessor()) _printf0_(" starting autodiff parameters \n"); 349 printf("-------------- file: CreateParameters.cpp line: %i\n",__LINE__); 349 350 CreateParametersAutodiff(parameters,iomodel); 350 351 if(VerboseMProcessor()) _printf0_(" ending autodiff parameters \n"); -
issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
r22471 r22515 11 11 /*output*/ 12 12 char* fieldname = NULL; 13 int param_enum = -1;13 int input_enum = -1; 14 14 15 15 if(strcmp(string_in,"Thickness")==0){ 16 16 const char* field = "md.geometry.thickness"; 17 param_enum = ThicknessEnum;17 input_enum = ThicknessEnum; 18 18 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 19 19 } 20 20 else if(strcmp(string_in,"MaterialsRheologyB")==0){ 21 21 const char* field = "md.materials.rheology_B"; 22 param_enum = MaterialsRheologyBEnum;22 input_enum = MaterialsRheologyBEnum; 23 23 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 24 24 } 25 25 else if(strcmp(string_in,"SmbMassBalance")==0){ 26 26 const char* field = "md.smb.mass_balance"; 27 param_enum = SmbMassBalanceEnum;27 input_enum = SmbMassBalanceEnum; 28 28 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 29 29 } 30 30 else if(strcmp(string_in,"SmbAccumulation")==0){ 31 31 const char* field = "md.smb.accumulation"; 32 param_enum = SmbAccumulationEnum;32 input_enum = SmbAccumulationEnum; 33 33 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 34 34 } 35 35 else if(strcmp(string_in,"SmbMelt")==0){ 36 36 const char* field = "md.smb.melt"; 37 param_enum = SmbMeltEnum;37 input_enum = SmbMeltEnum; 38 38 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 39 39 } 40 40 else if(strcmp(string_in,"SmbRefreeze")==0){ 41 41 const char* field = "md.smb.refreeze"; 42 param_enum = SmbRefreezeEnum;42 input_enum = SmbRefreezeEnum; 43 43 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 44 44 } 45 45 else if(strcmp(string_in,"SmbRunoff")==0){ 46 46 const char* field = "md.smb.runoff"; 47 param_enum = SmbRunoffEnum;47 input_enum = SmbRunoffEnum; 48 48 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 49 49 } 50 50 else if(strcmp(string_in,"SmbEvaporation")==0){ 51 51 const char* field = "md.smb.evaporation"; 52 param_enum = SmbEvaporationEnum;52 input_enum = SmbEvaporationEnum; 53 53 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 54 54 } 55 55 else if(strcmp(string_in,"SmbTa")==0){ 56 56 const char* field = "md.smb.Ta"; 57 param_enum = SmbTaEnum;57 input_enum = SmbTaEnum; 58 58 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 59 59 } 60 60 else if(strcmp(string_in,"SmbV")==0){ 61 61 const char* field = "md.smb.V"; 62 param_enum = SmbVEnum;62 input_enum = SmbVEnum; 63 63 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 64 64 } 65 65 else if(strcmp(string_in,"SmbDswrf")==0){ 66 66 const char* field = "md.smb.dswrf"; 67 param_enum = SmbDswrfEnum;67 input_enum = SmbDswrfEnum; 68 68 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 69 69 } 70 70 else if(strcmp(string_in,"SmbDlwrf")==0){ 71 71 const char* field = "md.smb.dlwrf"; 72 param_enum = SmbDlwrfEnum;72 input_enum = SmbDlwrfEnum; 73 73 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 74 74 } 75 75 else if(strcmp(string_in,"SmbP")==0){ 76 76 const char* field = "md.smb.P"; 77 param_enum = SmbPEnum;77 input_enum = SmbPEnum; 78 78 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 79 79 } 80 80 else if(strcmp(string_in,"SmbEAir")==0){ 81 81 const char* field = "md.smb.eAir"; 82 param_enum = SmbEAirEnum;82 input_enum = SmbEAirEnum; 83 83 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 84 84 } 85 85 else if(strcmp(string_in,"SmbPAir")==0){ 86 86 const char* field = "md.smb.pAir"; 87 param_enum = SmbPAirEnum;87 input_enum = SmbPAirEnum; 88 88 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 89 89 } 90 90 else if(strcmp(string_in,"SmbVz")==0){ 91 91 const char* field = "md.smb.Vz"; 92 param_enum = SmbVzEnum;92 input_enum = SmbVzEnum; 93 93 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 94 94 } 95 95 else if(strcmp(string_in,"SmbTz")==0){ 96 96 const char* field = "md.smb.Tz"; 97 param_enum = SmbTzEnum;97 input_enum = SmbTzEnum; 98 98 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 99 99 } 100 100 else if(strcmp(string_in,"SmbC")==0){ 101 101 const char* field = "md.smb.C"; 102 param_enum = SmbCEnum;102 input_enum = SmbCEnum; 103 103 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 104 104 } 105 105 else if(strcmp(string_in,"BasalforcingsFloatingiceMeltingRate")==0){ 106 106 const char* field = "md.basalforcings.floatingice_melting_rate"; 107 param_enum = BasalforcingsFloatingiceMeltingRateEnum;108 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 109 } 110 else if(strcmp(string_in,"FrictionCoefficient")==0 ){107 input_enum = BasalforcingsFloatingiceMeltingRateEnum; 108 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 109 } 110 else if(strcmp(string_in,"FrictionCoefficient")==0 || strcmp(string_in,"md.friction.coefficient")==0){ 111 111 const char* field = "md.friction.coefficient"; 112 param_enum = FrictionCoefficientEnum;112 input_enum = FrictionCoefficientEnum; 113 113 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 114 114 } 115 115 else if(strcmp(string_in,"Vx")==0){ 116 116 const char* field = "md.initialization.vx"; 117 param_enum = VxEnum;117 input_enum = VxEnum; 118 118 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 119 119 } 120 120 else if(strcmp(string_in,"Vy")==0){ 121 121 const char* field = "md.initialization.vy"; 122 param_enum = VyEnum;122 input_enum = VyEnum; 123 123 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 124 124 } 125 125 else if(strcmp(string_in,"BalancethicknessThickeningRate")==0){ 126 126 const char* field = "md.balancethickness.thickening_rate"; 127 param_enum = BalancethicknessThickeningRateEnum;127 input_enum = BalancethicknessThickeningRateEnum; 128 128 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 129 129 } 130 130 else if(strcmp(string_in,"BalancethicknessSpcthickness")==0){ 131 131 const char* field = "md.balancethickness.spcthickness"; 132 param_enum = BalancethicknessSpcthicknessEnum;132 input_enum = BalancethicknessSpcthicknessEnum; 133 133 fieldname=xNew<char>((strlen(field)+1)); xMemCpy<char>(fieldname,field,(strlen(field)+1)); 134 134 } … … 138 138 139 139 /*Assign output pointers*/ 140 *out_enum = param_enum;140 *out_enum = input_enum; 141 141 *pfield = fieldname; 142 142 return; -
issm/trunk-jpl/src/m/classes/adm1qn3inversion.m
r22443 r22515 7 7 properties (SetAccess=public) 8 8 iscontrol = 0 9 control_parameters = NaN10 control_scaling_factors = NaN11 9 maxsteps = 0 12 10 maxiter = 0 13 11 dxmin = 0 14 12 gttol = 0 15 cost_functions = NaN16 cost_functions_coefficients = NaN17 min_parameters = NaN18 max_parameters = NaN19 vx_obs = NaN20 vy_obs = NaN21 vz_obs = NaN22 vel_obs = NaN23 thickness_obs = NaN24 surface_obs = NaN25 13 26 14 end … … 37 25 end % }}} 38 26 function self = extrude(self,md) % {{{ 39 self.vx_obs=project3d(md,'vector',self.vx_obs,'type','node');40 self.vy_obs=project3d(md,'vector',self.vy_obs,'type','node');41 self.vel_obs=project3d(md,'vector',self.vel_obs,'type','node');42 self.thickness_obs=project3d(md,'vector',self.thickness_obs,'type','node');43 if numel(self.cost_functions_coefficients)>1,self.cost_functions_coefficients=project3d(md,'vector',self.cost_functions_coefficients,'type','node');end;44 if numel(self.min_parameters)>1,self.min_parameters=project3d(md,'vector',self.min_parameters,'type','node');end;45 if numel(self.max_parameters)>1,self.max_parameters=project3d(md,'vector',self.max_parameters,'type','node');end;46 27 end % }}} 47 28 function self = setdefaultparameters(self) % {{{ … … 50 31 %parameter to be inferred by control methods (only 51 32 %drag and B are supported yet) 52 self.control_parameters={'FrictionCoefficient'}; 53 54 %Scaling factor for each control 55 self.control_scaling_factors=1; 33 %self.control_parameters={'FrictionCoefficient'}; 56 34 57 35 %number of iterations 58 36 self.maxsteps=20; 59 37 self.maxiter=40; 60 61 %several responses can be used:62 self.cost_functions=101;63 38 64 39 %m1qn3 parameters … … 75 50 md = checkmessage(md,['M1QN3 has not been installed, ISSM needs to be reconfigured and recompiled with M1QN3']); 76 51 end 77 num_controls=numel(md.inversion.control_parameters);78 num_costfunc=size(md.inversion.cost_functions,2);79 52 80 53 md = checkfield(md,'fieldname','inversion.iscontrol','values',[0 1]); 81 md = checkfield(md,'fieldname','inversion.control_parameters','cell',1,'values',supportedcontrols());82 md = checkfield(md,'fieldname','inversion.control_scaling_factors','size',[1 num_controls],'>',0,'NaN',1,'Inf',1);83 54 md = checkfield(md,'fieldname','inversion.maxsteps','numel',1,'>=',0); 84 55 md = checkfield(md,'fieldname','inversion.maxiter','numel',1,'>=',0); 85 56 md = checkfield(md,'fieldname','inversion.dxmin','numel',1,'>',0); 86 57 md = checkfield(md,'fieldname','inversion.gttol','numel',1,'>',0); 87 md = checkfield(md,'fieldname','inversion.cost_functions','size',[1 num_costfunc],'values',supportedcostfunctions());88 md = checkfield(md,'fieldname','inversion.cost_functions_coefficients','size',[md.mesh.numberofvertices num_costfunc],'>=',0);89 md = checkfield(md,'fieldname','inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);90 md = checkfield(md,'fieldname','inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);91 58 92 if strcmp(solution,'BalancethicknessSolution') 93 md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 94 md = checkfield(md,'fieldname','inversion.surface_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 95 elseif strcmp(solution,'BalancethicknessSoftSolution') 96 md = checkfield(md,'fieldname','inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 97 else 98 md = checkfield(md,'fieldname','inversion.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 99 if ~strcmp(domaintype(md.mesh),'2Dvertical'), 100 md = checkfield(md,'fieldname','inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1,'Inf',1); 101 end 102 end 103 end % }}} 59 end % }}} 104 60 function disp(self) % {{{ 105 61 disp(sprintf(' adm1qn3inversion parameters:')); 106 62 fielddisplay(self,'iscontrol','is inversion activated?'); 107 fielddisplay(self,'control_parameters','ex: {''FrictionCoefficient''}, or {''MaterialsRheologyBbar''}');108 fielddisplay(self,'control_scaling_factors','order of magnitude of each control (useful for multi-parameter optimization)');109 63 fielddisplay(self,'maxsteps','maximum number of iterations (gradient computation)'); 110 64 fielddisplay(self,'maxiter','maximum number of Function evaluation (forward run)'); 111 65 fielddisplay(self,'dxmin','convergence criterion: two points less than dxmin from eachother (sup-norm) are considered identical'); 112 66 fielddisplay(self,'gttol','convergence criterion: ||g(X)||/||g(X0)|| (g(X0): gradient at initial guess X0)'); 113 fielddisplay(self,'cost_functions','indicate the type of response for each optimization step');114 fielddisplay(self,'cost_functions_coefficients','cost_functions_coefficients applied to the misfit of each vertex and for each control_parameter');115 fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex');116 fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex');117 fielddisplay(self,'vx_obs','observed velocity x component [m/yr]');118 fielddisplay(self,'vy_obs','observed velocity y component [m/yr]');119 fielddisplay(self,'vel_obs','observed velocity magnitude [m/yr]');120 fielddisplay(self,'thickness_obs','observed thickness [m]');121 fielddisplay(self,'surface_obs','observed surface elevation [m]');122 disp('Available cost functions:');123 disp(' 101: SurfaceAbsVelMisfit');124 disp(' 102: SurfaceRelVelMisfit');125 disp(' 103: SurfaceLogVelMisfit');126 disp(' 104: SurfaceLogVxVyMisfit');127 disp(' 105: SurfaceAverageVelMisfit');128 disp(' 201: ThicknessAbsMisfit');129 disp(' 501: DragCoefficientAbsGradient');130 disp(' 502: RheologyBbarAbsGradient');131 disp(' 503: ThicknessAbsGradient');132 67 end % }}} 133 68 function marshall(self,prefix,md,fid) % {{{ … … 138 73 WriteData(fid,prefix,'name','md.inversion.type','data',4,'format','Integer'); 139 74 if ~self.iscontrol, return; end 140 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','control_scaling_factors','format','DoubleMat','mattype',3);141 75 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxsteps','format','Integer'); 142 76 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','maxiter','format','Integer'); 143 77 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','dxmin','format','Double'); 144 78 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','gttol','format','Double'); 145 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','cost_functions_coefficients','format','DoubleMat','mattype',1);146 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','min_parameters','format','DoubleMat','mattype',3);147 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','max_parameters','format','DoubleMat','mattype',3);148 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vx_obs','format','DoubleMat','mattype',1,'scale',1./yts);149 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vy_obs','format','DoubleMat','mattype',1,'scale',1./yts);150 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vz_obs','format','DoubleMat','mattype',1,'scale',1./yts);151 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','vel_obs','format','DoubleMat','mattype',1,'scale',1./yts);152 if(numel(self.thickness_obs)==md.mesh.numberofelements),153 mattype=2;154 else155 mattype=1;156 end157 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','thickness_obs','format','DoubleMat','mattype',mattype);158 WriteData(fid,prefix,'object',self,'class','inversion','fieldname','surface_obs','format','DoubleMat','mattype',mattype);159 79 160 %process control parameters161 num_control_parameters=numel(self.control_parameters);162 WriteData(fid,prefix,'object',self,'fieldname','control_parameters','format','StringArray');163 WriteData(fid,prefix,'data',num_control_parameters,'name','md.inversion.num_control_parameters','format','Integer');164 165 %process cost functions166 num_cost_functions=size(self.cost_functions,2);167 data=marshallcostfunctions(self.cost_functions);168 WriteData(fid,prefix,'data',data,'name','md.inversion.cost_functions','format','StringArray');169 WriteData(fid,prefix,'data',num_cost_functions,'name','md.inversion.num_cost_functions','format','Integer');170 80 end % }}} 171 81 function savemodeljs(self,fid,modelname) % {{{ 172 82 173 83 writejsdouble(fid,[modelname '.inversion.iscontrol'],self.iscontrol); 174 writejscellstring(fid,[modelname '.inversion.control_parameters'],self.control_parameters);175 writejsdouble(fid,[modelname '.inversion.control_scaling_factors'],self.control_scaling_factors);176 84 writejsdouble(fid,[modelname '.inversion.maxsteps'],self.maxsteps); 177 85 writejsdouble(fid,[modelname '.inversion.maxiter'],self.maxiter); 178 86 writejsdouble(fid,[modelname '.inversion.dxmin'],self.dxmin); 179 87 writejsdouble(fid,[modelname '.inversion.gttol'],self.gttol); 180 writejs2Darray(fid,[modelname '.inversion.cost_functions'],self.cost_functions);181 writejs2Darray(fid,[modelname '.inversion.cost_functions_coefficients'],self.cost_functions_coefficients);182 writejs1Darray(fid,[modelname '.inversion.min_parameters'],self.min_parameters);183 writejs1Darray(fid,[modelname '.inversion.max_parameters'],self.max_parameters);184 writejs1Darray(fid,[modelname '.inversion.vx_obs'],self.vx_obs);185 writejs1Darray(fid,[modelname '.inversion.vy_obs'],self.vy_obs);186 writejs1Darray(fid,[modelname '.inversion.vz_obs'],self.vz_obs);187 writejs1Darray(fid,[modelname '.inversion.vel_obs'],self.vel_obs);188 writejs1Darray(fid,[modelname '.inversion.thickness_obs'],self.thickness_obs);189 writejs1Darray(fid,[modelname '.inversion.surface_obs'],self.surface_obs);190 88 191 89 end % }}} -
issm/trunk-jpl/src/m/classes/autodiff.m
r20979 r22515 130 130 names{i}=indep.name; 131 131 types(i)=indep.typetoscalar(); 132 min_parameters(:,i)=indep.min_parameters; 133 max_parameters(:,i)=indep.max_parameters; 134 scaling_factors(i)=indep.control_scaling_factor; 132 135 end 133 136 WriteData(fid,prefix,'data',names,'name','md.autodiff.independent_object_names','format','StringArray'); 134 137 WriteData(fid,prefix,'data',types,'name','md.autodiff.independent_object_types','format','IntMat','mattype',3); 138 WriteData(fid,prefix,'data',min_parameters,'name','md.autodiff.independent_min_parameters','format','DoubleMat','mattype',3); 139 WriteData(fid,prefix,'data',max_parameters,'name','md.autodiff.independent_max_parameters','format','DoubleMat','mattype',3); 140 WriteData(fid,prefix,'data',scaling_factors,'name','md.autodiff.independent_scaling_factors','format','DoubleMat','mattype',3); 141 142 135 143 end 136 144 %}}} -
issm/trunk-jpl/src/m/classes/independent.m
r21049 r22515 11 11 fov_forward_indices = []; 12 12 nods = 0; 13 min_parameters = NaN; 14 max_parameters = NaN; 15 control_scaling_factor = NaN 13 16 end 14 17 methods … … 45 48 end 46 49 md = checkfield(md,'fieldname',['autodiff.independents{' num2str(i) '}.fov_forward_indices'],'>=',1,'<=',self.nods,'size',[NaN 1]); 50 md = checkfield(md,'fieldname',['autodiff.independents{' num2str(i) '}.min_parameters'],'size',[md.mesh.numberofvertices 1]); 51 md = checkfield(md,'fieldname',['autodiff.independents{' num2str(i) '}.max_parameters'],'size',[md.mesh.numberofvertices 1]); 52 md = checkfield(md,'fieldname',['autodiff.independents{' num2str(i) '}.control_scaling_factors'],'size',[1 1],'>',0,'NaN',1,'Inf',1); 53 47 54 end 48 55 … … 54 61 fielddisplay(self,'type','type of variable (''vertex'' or ''scalar'')'); 55 62 fielddisplay(self,'nods','size of dependent variables'); 63 fielddisplay(self,'min_parameters','absolute minimum acceptable value of the inversed parameter on each vertex'); 64 fielddisplay(self,'max_parameters','absolute maximum acceptable value of the inversed parameter on each vertex'); 65 fielddisplay(self,'control_scaling_factor','order of magnitude of each control (useful for multi-parameter optimization)'); 56 66 if ~isnan(self.fos_forward_index), 57 67 fielddisplay(self,'fos_forward_index','index for fos_foward driver of ADOLC');
Note:
See TracChangeset
for help on using the changeset viewer.