Changeset 25406
- Timestamp:
- 08/16/20 15:34:50 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Cfsurfacelogvel.cpp
r25379 r25406 101 101 IssmDouble Cfsurfacelogvel::Response(FemModel* femmodel){/*{{{*/ 102 102 103 /*diverse: */ 104 IssmDouble time; 105 106 /*recover time parameters: */ 107 femmodel->parameters->FindParam(&time,TimeEnum); 108 if(time < last_time) timepassedflag = false; 109 last_time = time; 110 111 int i; 112 IssmDouble J=0.; 113 IssmDouble J_sum=0.; 114 115 if(datatime<=time && !timepassedflag){ 116 for(i=0;i<femmodel->elements->Size();i++){ 117 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i); 118 J+=this->Cfsurfacelogvel_Calculation(element,definitionenum); 119 } 120 121 ISSM_MPI_Allreduce ( (void*)&J,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm()); 122 ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 123 J=J_sum; 124 125 timepassedflag = true; 126 return J; 127 } 128 else return J; 129 } 130 /*}}}*/ 103 104 /*recover time parameters: */ 105 IssmDouble time; 106 femmodel->parameters->FindParam(&time,TimeEnum); 107 if(time < last_time) this->timepassedflag = false; //FIXME: do we really need this? looks like an old piece of code before copy 108 this->last_time = time; 109 110 IssmDouble J=0.; 111 IssmDouble J_sum=0.; 112 if(this->datatime<=time && !timepassedflag){ 113 for(int i=0;i<femmodel->elements->Size();i++){ 114 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i); 115 J+=this->Cfsurfacelogvel_Calculation(element,definitionenum); 116 } 117 118 ISSM_MPI_Allreduce ( (void*)&J,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm()); 119 ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 120 J=J_sum; 121 122 this->timepassedflag = true; 123 } 124 return J; 125 }/*}}}*/ 131 126 IssmDouble Cfsurfacelogvel::Cfsurfacelogvel_Calculation(Element* element, int definitionenum){/*{{{*/ 132 127 … … 165 160 Input *vy_input = NULL; 166 161 if(numcomponents==2){ 167 162 vy_input = topelement->GetInput(VyEnum); _assert_(vy_input); 168 163 } 169 164 … … 192 187 * * [ vel + eps ] 2 193 188 * * J = 4 \bar{v}^2 | log ( ----------- ) | 194 * *[ vel + eps ]195 * *obs196 * */189 * [ vel + eps ] 190 * obs 191 */ 197 192 if(numcomponents==1){ 198 193 velocity_mag =fabs(vx)+epsvel; … … 205 200 206 201 misfit=4*pow(meanvel,2)*pow(log(velocity_mag/obs_velocity_mag),2); 202 _printf_(velocity_mag<<" "<<obs_velocity_mag<<"\n"); 203 _error_("S"); 207 204 208 205 /*Add to cost function*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r25396 r25406 20 20 #include "../Inputs/PentaInput.h" 21 21 #include "../Inputs/DatasetInput.h" 22 #include "../Inputs/ControlInput.h" 22 23 #include "../Inputs/ArrayInput.h" 23 24 /*}}}*/ … … 1747 1748 /*Intermediaries*/ 1748 1749 const int numvertices = this->GetNumberOfVertices(); 1750 IssmDouble value,value_min,value_max; 1749 1751 1750 1752 int *vertexids = xNew<int>(numvertices); … … 1779 1781 this->AddControlInput(input_enum,inputs,iomodel,values,values_min,values_max,P0Enum,id); 1780 1782 } 1781 1783 else if(M==iomodel->numberofelements+1 && N>1){ 1784 1785 /*create transient input: */ 1786 IssmDouble* times = xNew<IssmDouble>(N); 1787 for(int t=0;t<N;t++) times[t] = vector[(M-1)*N+t]; 1788 inputs->SetTransientControlInput(input_enum,id,times,N); 1789 1790 /*Get input*/ 1791 ControlInput* control_input = inputs->GetControlInput(input_enum); _assert_(control_input); 1792 TransientInput* transientinput_val = control_input->GetTransientInput("value"); 1793 TransientInput* transientinput_min = control_input->GetTransientInput("lowerbound"); 1794 TransientInput* transientinput_max = control_input->GetTransientInput("upperbound"); 1795 for(int t=0;t<N;t++){ 1796 value = vector[N*this->Sid()+t]; 1797 value_min = scale*min_vector[N*this->Sid()+t]; 1798 value_max = scale*max_vector[N*this->Sid()+t]; 1799 switch(this->ObjectEnum()){ 1800 case TriaEnum: 1801 transientinput_val->AddTriaTimeInput( t,1,&(this->lid),&value,P0Enum); 1802 transientinput_min->AddTriaTimeInput( t,1,&(this->lid),&value_min,P0Enum); 1803 transientinput_max->AddTriaTimeInput( t,1,&(this->lid),&value_max,P0Enum); 1804 break; 1805 case PentaEnum: 1806 //transientinput->AddPentaTimeInput(t,1,&(this->lid),&value,P0Enum); 1807 _error_("to be implemented"); 1808 break; 1809 default: _error_("Not implemented yet"); 1810 } 1811 } 1812 xDelete<IssmDouble>(times); 1813 } 1782 1814 else if(M==iomodel->numberofvertices+1 && N>1){ 1783 1815 _error_("not supported tet"); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r25384 r25406 259 259 virtual int GetNumberOfNodes(int enum_type)=0; 260 260 virtual int GetNumberOfVertices(void)=0; 261 virtual void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,int offset)=0; 262 virtual void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data)=0; 261 virtual void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,int N,const char* data,int offset)=0; 263 262 virtual void GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0; 264 263 virtual void GetVerticesCoordinatesTop(IssmDouble** xyz_list)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r25379 r25406 215 215 } 216 216 217 /*Create Control Input*/ 218 inputs->SetControlInput(input_enum,PentaInputEnum,interpolation_enum,id); 219 ControlInput* control_input = inputs->GetControlInput(input_enum); _assert_(input_enum); 220 217 221 /*Call inputs method*/ 218 222 switch(interpolation_enum){ 219 223 case P1Enum: 220 inputs->SetPentaControlInput(input_enum,PentaInputEnum,interpolation_enum,id,NUMVERTICES,vertexlids,values,values_min,values_max);224 control_input->SetControl(interpolation_enum,NUMVERTICES,&vertexlids[0],values,values_min,values_max); 221 225 break; 222 226 default: … … 1830 1834 } 1831 1835 /*}}}*/ 1832 void Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/ 1833 1834 _error_("NOT NEEDED ANYMORE"); 1836 void Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,int N,const char* data,int offset){/*{{{*/ 1837 1835 1838 /*Get input*/ 1836 1839 if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum; … … 1878 1881 for(int t=0;t<transientinput->numtimesteps;t++) { 1879 1882 IssmDouble time = transientinput->GetTimeByOffset(t); 1880 _error_("not implemented"); 1881 //PentaInput* timeinput = xDynamicCast<PentaInput*>(transientinput->GetTimeInput(time)); 1882 //if(timeinput->interpolation_type!=P1Enum) _error_("not supported yet"); 1883 //input->Serve(NUMVERTICES,&lidlist[0]); 1884 ///*Create list of indices and values for global vector*/ 1885 //for(int i=0;i<NUMVERTICES;i++){ 1886 // idlist[N*i+t] = offset + this->vertices[i]->Sid()+t*M[control_index]; 1887 // values[N*i+t] = timeinput->values[i]; 1888 //} 1889 } 1890 vector->SetValues(NUMVERTICES*transientinput->numtimesteps,idlist,values,INS_VAL); 1891 xDelete<int>(M); 1892 xDelete<int>(idlist); 1893 xDelete<IssmDouble>(values); 1894 break; 1895 } 1896 default: _error_("input "<<EnumToStringx(input->ObjectEnum())<<" not supported yet"); 1897 } 1898 } 1899 /*}}}*/ 1900 void Penta::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,int offset){/*{{{*/ 1901 1902 /*Get input*/ 1903 if(control_enum==MaterialsRheologyBbarEnum) control_enum=MaterialsRheologyBEnum; 1904 ElementInput* input=this->inputs->GetControlInputData(control_enum,data); _assert_(input); 1905 1906 /*Lid list once for all*/ 1907 int lidlist[NUMVERTICES]; 1908 for(int i=0;i<NUMVERTICES;i++) lidlist[i] = vertices[i]->lid; 1909 1910 /*Check what input we are dealing with*/ 1911 switch(input->ObjectEnum()){ 1912 case PentaInputEnum: 1913 { 1914 IssmDouble values[NUMVERTICES]; 1915 int idlist[NUMVERTICES]; 1916 1917 PentaInput* triainput = xDynamicCast<PentaInput*>(input); 1918 1919 /*Create list of indices and values for global vector*/ 1920 GradientIndexing(&idlist[0],control_index); 1921 1922 if(triainput->GetInputInterpolationType()==P1Enum){ 1923 input->Serve(NUMVERTICES,&lidlist[0]); 1924 for(int i=0;i<NUMVERTICES;i++) values[i] = triainput->element_values[i]; 1925 vector->SetValues(NUMVERTICES,idlist,values,INS_VAL); 1926 } 1927 else if(triainput->GetInputInterpolationType()==P0Enum){ 1928 input->Serve(1,&this->lid); 1929 vector->SetValue(idlist[0],triainput->element_values[0],INS_VAL); 1930 } 1931 else{ 1932 _error_("not supported yet"); 1933 } 1934 break; 1935 } 1936 1937 case TransientInputEnum: 1938 { 1939 TransientInput* transientinput = xDynamicCast<TransientInput*>(input); 1940 int N = transientinput->numtimesteps; 1941 int* M = NULL; 1942 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 1943 int* idlist = xNew<int>(NUMVERTICES*N); 1944 IssmDouble* values = xNew<IssmDouble>(NUMVERTICES*N); 1945 for(int t=0;t<transientinput->numtimesteps;t++) { 1946 IssmDouble time = transientinput->GetTimeByOffset(t); 1947 _error_("not implemented"); 1883 _error_("not implemented, SEE TRIA!"); 1948 1884 //PentaInput* timeinput = xDynamicCast<PentaInput*>(transientinput->GetTimeInput(time)); 1949 1885 //if(timeinput->interpolation_type!=P1Enum) _error_("not supported yet"); -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r25379 r25406 99 99 Penta* GetLowerPenta(void); 100 100 Penta* GetUpperPenta(void); 101 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data); 102 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,int offset); 101 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,int N,const char* data,int offset); 103 102 int GetVertexIndex(Vertex* vertex); 104 103 void GetVerticesCoordinatesBase(IssmDouble** pxyz_list); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r25379 r25406 73 73 int GetNumberOfNodes(int enum_type){_error_("not implemented yet");}; 74 74 int GetNumberOfVertices(void); 75 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,int offset){_error_("not implemented yet");}; 76 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data){_error_("not implemented yet");}; 75 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,int N,const char* data,int offset){_error_("not implemented yet");}; 77 76 void GetVerticesCoordinates(IssmDouble** pxyz_list); 78 77 void GetVerticesCoordinatesBase(IssmDouble** pxyz_list){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r25379 r25406 77 77 int GetNumberOfNodes(int enum_type){_error_("not implemented yet");}; 78 78 int GetNumberOfVertices(void); 79 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,int offset){_error_("not implemented yet");}; 80 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data){_error_("not implemented yet");}; 79 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,int N,const char* data,int offset){_error_("not implemented yet");}; 81 80 void GetVerticesCoordinatesBase(IssmDouble** pxyz_list); 82 81 void GetVerticesCoordinatesTop(IssmDouble** pxyz_list); -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r25379 r25406 220 220 } 221 221 222 /*Create Control Input*/ 223 inputs->SetControlInput(input_enum,TriaInputEnum,interpolation_enum,id); 224 ControlInput* control_input = inputs->GetControlInput(input_enum); _assert_(input_enum); 225 222 226 /*Call inputs method*/ 223 227 switch(interpolation_enum){ 224 228 case P0Enum: 225 inputs->SetTriaControlInput(input_enum,TriaInputEnum,interpolation_enum,id,1,&this->lid,values,values_min,values_max);229 control_input->SetControl(interpolation_enum,1,&this->lid,values,values_min,values_max); 226 230 break; 227 231 case P1Enum: 228 inputs->SetTriaControlInput(input_enum,TriaInputEnum,interpolation_enum,id,NUMVERTICES,vertexlids,values,values_min,values_max);232 control_input->SetControl(interpolation_enum,NUMVERTICES,&vertexlids[0],values,values_min,values_max); 229 233 break; 230 234 default: … … 1104 1108 IssmDouble values[NUMVERTICES]; 1105 1109 int lidlist[NUMVERTICES]; 1106 int idlist[NUMVERTICES]; 1107 1108 ElementInput* input=this->inputs->GetControlInputData(control_enum,"gradient"); _assert_(input); 1110 1111 /*Get list of ids for this element and this control*/ 1112 int* idlist = xNew<int>(NUMVERTICES*N); 1113 GradientIndexing(&idlist[0],control_index); 1114 1115 ControlInput* control_input=this->inputs->GetControlInput(control_enum); _assert_(control_input); 1109 1116 this->GetVerticesLidList(&lidlist[0]); 1110 GradientIndexing(&idlist[0],control_index);1111 1117 1112 1118 /*Get values on vertices*/ 1113 if(input->ObjectEnum()==TriaInputEnum && input->GetInputInterpolationType()==P1Enum){ 1114 _assert_(N==1); 1115 for(int i=0;i<NUMVERTICES;i++){ 1116 values[i] = gradient[idlist[i]]; 1117 } 1118 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 1119 } 1120 else if(input->ObjectEnum()==TriaInputEnum && input->GetInputInterpolationType()==P0Enum){ 1121 _assert_(N==1); 1122 input->SetInput(P0Enum,this->lid,gradient[idlist[0]]); 1123 } 1124 else if(input->ObjectEnum()==TransientInputEnum){ 1119 if(control_input->layout_enum==TriaInputEnum){ 1120 ElementInput* gradient_input = control_input->GetInput("gradient"); _assert_(gradient_input); 1121 if(gradient_input->GetInputInterpolationType()==P1Enum){ 1122 _assert_(N==1); 1123 for(int i=0;i<NUMVERTICES;i++){ 1124 values[i] = gradient[idlist[i]]; 1125 } 1126 gradient_input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 1127 } 1128 else if(gradient_input->GetInputInterpolationType()==P0Enum){ 1129 _assert_(N==1); 1130 gradient_input->SetInput(P0Enum,this->lid,gradient[idlist[0]]); 1131 } 1132 else{ 1133 _error_("not implemented yet"); 1134 } 1135 } 1136 else if(control_input->layout_enum==TransientInputEnum){ 1137 _assert_(N>1); 1138 TransientInput* gradient_input = control_input->GetTransientInput("gradient"); _assert_(gradient_input); 1139 1125 1140 for(int n=0;n<N;n++){ 1126 _error_("not implemented"); 1127 //Input* new_input = new TriaInput(control_enum,gradient,P1Enum); 1128 //controlinput->SetInput(new_input,n); 1129 //controlinput->Configure(parameters); 1141 TriaInput* input_n = gradient_input->GetTriaInput(n); _assert_(input_n); 1142 if(input_n->GetInputInterpolationType()==P1Enum){ 1143 _error_("not implemented"); 1144 } 1145 else if(input_n->GetInputInterpolationType()==P0Enum){ 1146 input_n->SetInput(P0Enum,this->lid,gradient[idlist[n]]); 1147 } 1148 else{ 1149 _error_("not implemented yet"); 1150 } 1130 1151 } 1131 1152 } 1132 1153 else _error_("Type not supported"); 1154 1155 /*Clean up*/ 1156 xDelete<int>(idlist); 1133 1157 1134 1158 }/*}}}*/ … … 2407 2431 } 2408 2432 /*}}}*/ 2409 void Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data){/*{{{*/ 2410 2411 _error_("DO WE NEED THIS FUNCTION?? REALLY?? see below"); 2412 2413 /*Get out if this is not an element input*/ 2414 if(!IsInputEnum(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput"); 2415 2416 /*Prepare index list*/ 2417 int idlist[NUMVERTICES]; 2418 GradientIndexing(&idlist[0],control_index); 2419 2420 /*Get input (either in element or material)*/ 2421 ElementInput* input=this->inputs->GetControlInputData(control_enum,data); _assert_(input); 2422 2423 /*Intermediaries*/ 2424 int numindices; 2425 int indices[NUMVERTICES]; 2426 2427 /*Check interpolation*/ 2428 int interpolation = input->GetInterpolation(); 2429 switch(interpolation){ 2430 case P0Enum: 2433 void Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,int N,const char* data,int offset){/*{{{*/ 2434 2435 /*Get list of ids for this element and this control*/ 2436 int* idlist = xNew<int>(NUMVERTICES*N); 2437 int lidlist[NUMVERTICES]; 2438 this->GradientIndexing(&idlist[0],control_index); 2439 this->GetVerticesLidList(&lidlist[0]); 2440 2441 /*Get Control*/ 2442 ControlInput* control_input=this->inputs->GetControlInput(control_enum); _assert_(control_input); 2443 2444 /*Get values on vertices*/ 2445 if(control_input->layout_enum==TriaInputEnum){ 2446 _assert_(N==1); 2447 TriaInput* input = xDynamicCast<TriaInput*>(control_input->GetInput("value")); _assert_(input); 2448 2449 if(input->GetInputInterpolationType()==P1Enum){ 2450 IssmDouble values[NUMVERTICES]; 2451 input->Serve(NUMVERTICES,&lidlist[0]); 2452 for(int i=0;i<NUMVERTICES;i++) values[i] = input->element_values[i]; 2453 vector->SetValues(NUMVERTICES,idlist,values,INS_VAL); 2454 } 2455 else if(input->GetInputInterpolationType()==P0Enum){ 2431 2456 input->Serve(1,&this->lid); 2432 break; 2433 case P1Enum: 2434 numindices = NUMVERTICES; 2435 for(int i=0;i<NUMVERTICES;i++) indices[i] = vertices[i]->lid; 2436 input->Serve(numindices,&indices[0]); 2437 break; 2438 default: _error_("interpolation "<<EnumToStringx(interpolation)<<" not supported"); 2439 } 2440 2441 /*Flag as collapsed for later use*/ 2442 if(this->iscollapsed){ 2443 xDynamicCast<PentaInput*>(input)->SetServeCollapsed(true); 2444 } 2445 2446 /* Start looping on the number of vertices: */ 2447 IssmDouble values[NUMVERTICES]; 2448 Gauss*gauss=this->NewGauss(); 2449 for(int iv=0;iv<NUMVERTICES;iv++){ 2450 gauss->GaussVertex(iv); 2451 input->GetInputValue(&values[iv],gauss); 2452 } 2453 delete gauss; 2454 2455 vector->SetValues(NUMVERTICES,idlist,&values[0],INS_VAL); 2456 } 2457 /*}}}*/ 2458 void Tria::GetVectorFromControlInputs(Vector<IssmDouble>* vector,int control_enum,int control_index,const char* data,int offset){/*{{{*/ 2459 2460 /*Get input*/ 2461 ElementInput* input=this->inputs->GetControlInputData(control_enum,data); _assert_(input); 2462 2463 /*Lid list once for all*/ 2464 int lidlist[NUMVERTICES]; 2465 for(int i=0;i<NUMVERTICES;i++) lidlist[i] = vertices[i]->lid; 2466 2467 /*Check what input we are dealing with*/ 2468 switch(input->ObjectEnum()){ 2469 case TriaInputEnum: 2470 { 2471 IssmDouble values[NUMVERTICES]; 2472 int idlist[NUMVERTICES]; 2473 2474 TriaInput* triainput = xDynamicCast<TriaInput*>(input); 2475 2476 /*Create list of indices and values for global vector*/ 2477 GradientIndexing(&idlist[0],control_index); 2478 2479 if(triainput->GetInputInterpolationType()==P1Enum){ 2480 input->Serve(NUMVERTICES,&lidlist[0]); 2481 for(int i=0;i<NUMVERTICES;i++) values[i] = triainput->element_values[i]; 2482 vector->SetValues(NUMVERTICES,idlist,values,INS_VAL); 2483 } 2484 else if(triainput->GetInputInterpolationType()==P0Enum){ 2485 input->Serve(1,&this->lid); 2486 vector->SetValue(idlist[0],triainput->element_values[0],INS_VAL); 2487 } 2488 else{ 2489 _error_("not supported yet"); 2490 } 2491 break; 2492 } 2493 2494 case TransientInputEnum: 2495 { 2496 TransientInput* transientinput = xDynamicCast<TransientInput*>(input); 2497 int N = transientinput->numtimesteps; 2498 int* M = NULL; 2499 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 2500 int* idlist = xNew<int>(NUMVERTICES*N); 2501 IssmDouble* values = xNew<IssmDouble>(NUMVERTICES*N); 2502 for(int t=0;t<transientinput->numtimesteps;t++) { 2503 IssmDouble time = transientinput->GetTimeByOffset(t); 2504 _error_("not implemented"); 2505 //TriaInput* timeinput = xDynamicCast<TriaInput*>(transientinput->GetTimeInput(time)); 2506 //if(timeinput->interpolation_type!=P1Enum) _error_("not supported yet"); 2507 //input->Serve(NUMVERTICES,&lidlist[0]); 2508 ///*Create list of indices and values for global vector*/ 2509 //for(int i=0;i<NUMVERTICES;i++){ 2510 // idlist[N*i+t] = offset + this->vertices[i]->Sid()+t*M[control_index]; 2511 // values[N*i+t] = timeinput->values[i]; 2512 //} 2513 } 2514 vector->SetValues(NUMVERTICES*transientinput->numtimesteps,idlist,values,INS_VAL); 2515 xDelete<int>(M); 2516 xDelete<int>(idlist); 2517 xDelete<IssmDouble>(values); 2518 break; 2519 } 2520 default: _error_("input "<<EnumToStringx(input->ObjectEnum())<<" not supported yet"); 2521 } 2457 vector->SetValue(idlist[0],input->element_values[0],INS_VAL); 2458 } 2459 else{ 2460 _error_("not supported yet"); 2461 } 2462 } 2463 else if(control_input->layout_enum==TransientInputEnum){ 2464 TransientInput* input = control_input->GetTransientInput("value"); _assert_(input); 2465 _assert_(N==input->numtimesteps); 2466 IssmDouble* values = xNew<IssmDouble>(NUMVERTICES*N); 2467 2468 int count = 0; 2469 for(int n=0;n<N;n++){ 2470 TriaInput* input_n = input->GetTriaInput(n); _assert_(input_n); 2471 if(input_n->GetInputInterpolationType()==P1Enum){ 2472 _error_("not implemented"); 2473 } 2474 else if(input_n->GetInputInterpolationType()==P0Enum){ 2475 input_n->Serve(1,&this->lid); 2476 values[n] = input_n->element_values[0]; 2477 count++; 2478 } 2479 else{ 2480 _error_("not implemented yet"); 2481 } 2482 } 2483 vector->SetValues(count,idlist,values,INS_VAL); 2484 xDelete<IssmDouble>(values); 2485 } 2486 else _error_("Type not supported"); 2487 2488 /*Clean up*/ 2489 xDelete<int>(idlist); 2522 2490 } 2523 2491 /*}}}*/ … … 3944 3912 IssmDouble values[NUMVERTICES]; 3945 3913 int lidlist[NUMVERTICES]; 3946 int idlist[NUMVERTICES];3947 3914 3948 3915 /*Get Domain type*/ … … 3966 3933 if(!IsInputEnum(control_enum)) return; 3967 3934 3968 ElementInput* input=this->inputs->GetControlInputData(control_enum,"value"); _assert_(input); 3935 /*Get list of ids for this element and this control*/ 3936 int* idlist = xNew<int>(NUMVERTICES*N); 3937 GradientIndexing(&idlist[0],control_index); 3938 3939 ControlInput* control_input=this->inputs->GetControlInput(control_enum); _assert_(control_input); 3969 3940 this->GetVerticesLidList(&lidlist[0]); 3970 GradientIndexing(&idlist[0],control_index); 3971 3972 /*Get values on vertices*/ 3973 if(input->ObjectEnum()==TriaInputEnum && input->GetInputInterpolationType()==P1Enum){ 3974 _assert_(N==1); 3975 for(int i=0;i<NUMVERTICES;i++){ 3976 values[i] = vector[idlist[i]]; 3977 } 3978 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 3979 } 3980 else if(input->ObjectEnum()==TriaInputEnum && input->GetInputInterpolationType()==P0Enum){ 3981 _assert_(N==1); 3982 input->SetInput(P0Enum,this->lid,vector[idlist[0]]); 3983 } 3984 else if(input->ObjectEnum()==TransientInputEnum){ 3941 3942 if(control_input->layout_enum==TriaInputEnum){ 3943 ElementInput* input = control_input->GetInput("value"); _assert_(input); 3944 if(input->GetInputInterpolationType()==P1Enum){ 3945 _assert_(N==1); 3946 for(int i=0;i<NUMVERTICES;i++){ 3947 values[i] = vector[idlist[i]]; 3948 } 3949 input->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]); 3950 } 3951 else if(input->GetInputInterpolationType()==P0Enum){ 3952 _assert_(N==1); 3953 input->SetInput(P0Enum,this->lid,vector[idlist[0]]); 3954 } 3955 else{ 3956 _error_("not implemented yet"); 3957 } 3958 } 3959 else if(control_input->layout_enum==TransientInputEnum){ 3960 _assert_(N>1); 3961 TransientInput* input = control_input->GetTransientInput("value"); _assert_(input); 3962 3985 3963 for(int n=0;n<N;n++){ 3986 _error_("not implemented"); 3987 //Input* new_input = new TriaInput(control_enum,values,P1Enum); 3988 //controlinput->SetInput(new_input,n); 3989 //controlinput->Configure(parameters); 3964 TriaInput* input_n = input->GetTriaInput(n); _assert_(input_n); 3965 if(input_n->GetInputInterpolationType()==P1Enum){ 3966 _error_("not implemented"); 3967 } 3968 else if(input_n->GetInputInterpolationType()==P0Enum){ 3969 input_n->SetInput(P0Enum,this->lid,vector[idlist[n]]); 3970 } 3971 else{ 3972 _error_("not implemented yet"); 3973 } 3990 3974 } 3991 3975 } 3992 3976 else _error_("Type not supported"); 3977 3978 /*Clean up*/ 3979 xDelete<int>(idlist); 3993 3980 } 3994 3981 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r25379 r25406 91 91 int GetNumberOfNodes(int enum_type); 92 92 int GetNumberOfVertices(void); 93 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data,int offset); 94 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,const char* data); 93 void GetVectorFromControlInputs(Vector<IssmDouble>* gradient,int control_enum,int control_index,int N,const char* data,int offset); 95 94 void GetVerticesCoordinatesBase(IssmDouble** pxyz_list); 96 95 void GetVerticesCoordinatesTop(IssmDouble** pxyz_list); -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
r25379 r25406 13 13 #include "./TriaInput.h" 14 14 #include "./PentaInput.h" 15 #include "./TransientInput.h" 15 16 //#include "../../toolkits/objects/Vector.h" 16 17 … … 50 51 } 51 52 /*}}}*/ 53 ControlInput::ControlInput(int enum_in,int nbe, int nbv,int id,IssmDouble* times, int numtimes){/*{{{*/ 54 55 this->enum_type = enum_in; 56 this->control_id = id; 57 this->layout_enum = TransientInputEnum; /*Tria or Penta?*/ 58 59 this->values =new TransientInput(enum_in,nbe,nbv,times,numtimes); 60 this->savedvalues=new TransientInput(enum_in,nbe,nbv,times,numtimes); 61 this->minvalues =new TransientInput(enum_in,nbe,nbv,times,numtimes); 62 this->maxvalues =new TransientInput(enum_in,nbe,nbv,times,numtimes); 63 this->gradient =new TransientInput(enum_in,nbe,nbv,times,numtimes); 64 } 65 /*}}}*/ 52 66 ControlInput::~ControlInput(){/*{{{*/ 53 67 if(values) delete values; … … 67 81 output->enum_type=this->enum_type; 68 82 output->control_id=this->control_id; 69 output->layout_enum = this-> control_id;70 71 if(values) output->values = xDynamicCast<ElementInput*>(this->values->copy());72 if(savedvalues) output->savedvalues = xDynamicCast<ElementInput*>(this->savedvalues->copy());73 if(minvalues) output->minvalues = xDynamicCast<ElementInput*>(this->minvalues->copy());74 if(maxvalues) output->maxvalues = xDynamicCast<ElementInput*>(this->maxvalues->copy());75 if(gradient) output->gradient = xDynamicCast<ElementInput*>(this->gradient->copy());83 output->layout_enum = this->layout_enum; 84 85 if(values) output->values = this->values->copy(); 86 if(savedvalues) output->savedvalues = this->savedvalues->copy(); 87 if(minvalues) output->minvalues = this->minvalues->copy(); 88 if(maxvalues) output->maxvalues = this->maxvalues->copy(); 89 if(gradient) output->gradient = this->gradient->copy(); 76 90 77 91 return output; 92 } 93 /*}}}*/ 94 void ControlInput::Configure(Parameters* params){/*{{{*/ 95 this->values->Configure(params); 96 this->savedvalues->Configure(params); 97 this->minvalues->Configure(params); 98 this->maxvalues->Configure(params); 99 this->gradient->Configure(params); 78 100 } 79 101 /*}}}*/ … … 82 104 _printf_("ControlInput:\n"); 83 105 _printf_(setw(15)<<" ControlInput "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<"\n"); 84 _printf_(setw(15)<<" ControlInput"<<setw(25)<<left<<EnumToStringx(this->layout_enum)<<"\n");106 _printf_(setw(15)<<" Layout "<<setw(25)<<left<<EnumToStringx(this->layout_enum)<<"\n"); 85 107 _printf_("---values: \n"); if (values) values->Echo(); 86 108 _printf_("---savedvalues: \n");if (savedvalues) savedvalues->Echo(); … … 114 136 115 137 /*Set input*/ 116 //TriaInput* input = xDynamicCast<TriaInput*>(this->inputs[id]); 117 this->values->SetInput(interp,numindices,indices,values_in); 118 this->minvalues->SetInput(interp,numindices,indices,values_min); 119 this->maxvalues->SetInput(interp,numindices,indices,values_max); 138 if(this->values->ObjectEnum()==TriaInputEnum || this->values->ObjectEnum()==PentaInputEnum){ 139 xDynamicCast<ElementInput*>(this->values)->SetInput(interp,numindices,indices,values_in); 140 xDynamicCast<ElementInput*>(this->minvalues)->SetInput(interp,numindices,indices,values_min); 141 xDynamicCast<ElementInput*>(this->maxvalues)->SetInput(interp,numindices,indices,values_max); 142 } 143 else{ 144 _error_("not supported"); 145 } 120 146 } 121 147 /*}}}*/ … … 124 150 _assert_(this); 125 151 _assert_(this->gradient); 126 this->gradient->SetInput(interp,numindices,indices,values_in); 152 if(this->gradient->ObjectEnum()==TriaInputEnum || this->gradient->ObjectEnum()==PentaInputEnum){ 153 xDynamicCast<ElementInput*>(this->gradient)->SetInput(interp,numindices,indices,values_in); 154 } 155 else{ 156 _error_("not supported"); 157 } 127 158 } 128 159 /*}}}*/ … … 161 192 162 193 /*Cast and return*/ 163 if(this->values->ObjectEnum()!=TriaInputEnum){ 194 if(this->values->ObjectEnum()==TriaInputEnum){ 195 return xDynamicCast<TriaInput*>(this->values); 196 } 197 else if(this->values->ObjectEnum()==TransientInputEnum){ 198 return xDynamicCast<TransientInput*>(this->values)->GetTriaInput(); 199 } 200 else{ 164 201 _error_("Cannot return a TriaInput"); 165 202 } 166 return xDynamicCast<TriaInput*>(this->values);167 203 168 204 } … … 180 216 ElementInput* ControlInput::GetInput(const char* data){/*{{{*/ 181 217 182 if(strcmp(data,"value")==0){ 183 _assert_(values); 184 return values; 185 } 186 else if(strcmp(data,"savedvalues")==0){ 187 _assert_(savedvalues); 188 return values; 189 } 190 else if (strcmp(data,"lowerbound")==0){ 191 _assert_(minvalues); 192 return minvalues; 193 } 194 else if (strcmp(data,"upperbound")==0){ 195 _assert_(maxvalues); 196 return maxvalues; 197 } 198 else if (strcmp(data,"gradient")==0){ 199 _assert_(gradient); 200 return gradient; 201 } 202 else{ 203 _error_("Data " << data << " not supported yet"); 204 } 205 206 } 207 /*}}}*/ 218 if(this->gradient->ObjectEnum()==TriaInputEnum || this->gradient->ObjectEnum()==PentaInputEnum){ 219 if(strcmp(data,"value")==0){ 220 _assert_(values); 221 return xDynamicCast<ElementInput*>(values); 222 } 223 else if(strcmp(data,"savedvalues")==0){ 224 _assert_(savedvalues); 225 return xDynamicCast<ElementInput*>(values); 226 } 227 else if (strcmp(data,"lowerbound")==0){ 228 _assert_(minvalues); 229 return xDynamicCast<ElementInput*>(minvalues); 230 } 231 else if (strcmp(data,"upperbound")==0){ 232 _assert_(maxvalues); 233 return xDynamicCast<ElementInput*>(maxvalues); 234 } 235 else if (strcmp(data,"gradient")==0){ 236 _assert_(gradient); 237 return xDynamicCast<ElementInput*>(gradient); 238 } 239 else{ 240 _error_("Data " << data << " not supported yet"); 241 } 242 } 243 else{ 244 int* temp = xNew<int>(3); 245 _error_("not supported"); 246 } 247 248 } 249 /*}}}*/ 250 TransientInput* ControlInput::GetTransientInput(const char* data){/*{{{*/ 251 252 if(this->values->ObjectEnum()==TransientInputEnum){ 253 if(strcmp(data,"value")==0){ 254 _assert_(values); 255 return xDynamicCast<TransientInput*>(values); 256 } 257 else if(strcmp(data,"savedvalues")==0){ 258 _assert_(savedvalues); 259 return xDynamicCast<TransientInput*>(values); 260 } 261 else if (strcmp(data,"lowerbound")==0){ 262 _assert_(minvalues); 263 return xDynamicCast<TransientInput*>(minvalues); 264 } 265 else if (strcmp(data,"upperbound")==0){ 266 _assert_(maxvalues); 267 return xDynamicCast<TransientInput*>(maxvalues); 268 } 269 else if (strcmp(data,"gradient")==0){ 270 _assert_(gradient); 271 return xDynamicCast<TransientInput*>(gradient); 272 } 273 else{ 274 _error_("Data " << data << " not supported yet"); 275 } 276 } 277 else{ 278 _error_("not supported"); 279 } 280 281 } 282 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h
r25379 r25406 10 10 class Gauss; 11 11 class ElementInput; 12 class TransientInput; 12 13 13 14 class ControlInput: public Input{ 14 15 15 16 public: 16 int 17 int 18 int 19 ElementInput *gradient;20 ElementInput *maxvalues;21 ElementInput *minvalues;22 ElementInput *savedvalues;23 ElementInput *values;17 int control_id; 18 int enum_type; 19 int layout_enum; 20 Input *gradient; 21 Input *maxvalues; 22 Input *minvalues; 23 Input *savedvalues; 24 Input *values; 24 25 25 26 /*ControlInput constructors, destructors: {{{*/ 26 27 ControlInput(); 27 28 ControlInput(int nbe, int nbv,int input_layout_enum,int interp,int id); 29 ControlInput(int enum_in,int nbe, int nbv,int id,IssmDouble* times, int numtimes); 28 30 ~ControlInput(); 29 31 /*}}}*/ 30 32 /*Object virtual functions definitions:{{{ */ 31 33 Input* copy(); 32 void DeepEcho(); 33 void Echo(); 34 int Id(); 35 void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction); 36 int ObjectEnum(); 34 void Configure(Parameters* params); 35 void DeepEcho(); 36 void Echo(); 37 int Id(); 38 void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction); 39 int ObjectEnum(); 37 40 /*}}}*/ 38 41 void SetInput(Input* in_input){_error_("not impelemented");}; 39 42 void SetInput(Input* in_input,int timeoffset){_error_("not impelemented");}; 40 43 ElementInput* GetInput(const char* data); 44 TransientInput* GetTransientInput(const char* data); 41 45 void SetControl(int interp,int numindices,int* indices,IssmDouble* values_in,IssmDouble* values_min,IssmDouble* values_max); 42 46 void SetGradient(int interp,int numindices,int* indices,IssmDouble* values_in); -
issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp
r25379 r25406 690 690 } 691 691 }/*}}}*/ 692 void Inputs::Set TriaControlInput(int enum_in,int layout,int interpolation,int control_id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max){/*{{{*/692 void Inputs::SetControlInput(int enum_in,int layout,int interpolation,int control_id){/*{{{*/ 693 693 694 694 bool recreate = false; 695 695 696 /*Get input id*/ 696 697 int id = EnumToIndex(enum_in); … … 711 712 } 712 713 713 /*Set input*/ 714 ControlInput* input = xDynamicCast<ControlInput*>(this->inputs[id]); 715 input->SetControl(interpolation,numindices,indices,values,values_min,values_max); 714 }/*}}}*/ 715 void Inputs::SetTransientControlInput(int enum_in,int control_id,IssmDouble* times,int numtimes){/*{{{*/ 716 717 bool recreate = false; 718 719 /*Get input id*/ 720 int id = EnumToIndex(enum_in); 721 722 /*Create it if necessary*/ 723 if(this->inputs[id]){ 724 if(this->inputs[id]->ObjectEnum()!=ControlInputEnum){ 725 delete this->inputs[id]; 726 recreate = true; 727 } 728 } 729 else{ 730 recreate = true; 731 } 732 733 if(recreate){ 734 this->inputs[id] = new ControlInput(enum_in,this->numberofelements_local,this->numberofvertices_local,control_id,times,numtimes); 735 } 736 716 737 }/*}}}*/ 717 738 void Inputs::SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/ … … 822 843 input->SetInput(interpolation,row,numindices,values); 823 844 }/*}}}*/ 824 void Inputs::SetPentaControlInput(int enum_in,int layout,int interpolation,int control_id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max){/*{{{*/825 826 bool recreate = false;827 /*Get input id*/828 int id = EnumToIndex(enum_in);829 830 /*Create it if necessary*/831 if(this->inputs[id]){832 if(this->inputs[id]->ObjectEnum()!=ControlInputEnum){833 delete this->inputs[id];834 recreate = true;835 }836 }837 else{838 recreate = true;839 }840 841 if(recreate){842 this->inputs[id] = new ControlInput(this->numberofelements_local,this->numberofvertices_local,layout,interpolation,control_id);843 }844 845 /*Set input*/846 ControlInput* input = xDynamicCast<ControlInput*>(this->inputs[id]);847 input->SetControl(interpolation,numindices,indices,values,values_min,values_max);848 }/*}}}*/849 845 void Inputs::SetPentaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values){/*{{{*/ 850 846 -
issm/trunk-jpl/src/c/classes/Inputs/Inputs.h
r25379 r25406 73 73 void SetDoubleInput(int enum_in,int index,IssmDouble value); 74 74 void SetTransientInput(int enum_in,IssmDouble* times,int numtimes); 75 void SetControlInput(int enum_in,int layout,int interpolation,int control_id); 76 void SetTransientControlInput(int enum_in,int control_id,IssmDouble* times,int numtimes); 75 77 TransientInput* SetDatasetTransientInput(int enum_in,int id,IssmDouble* times,int numtimes); 76 78 void SetArrayInput(int enum_in,int row,IssmDouble* layers,int numlayers); 77 void SetTriaControlInput(int enum_in,int layout,int interpolation,int id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max);78 79 void SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values); 79 80 void SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values,int n); … … 82 83 void SetTriaInput(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values); 83 84 void SetTriaInput(int enum_in,int interpolation,int row,int numindices,IssmDouble* values); 84 void SetPentaControlInput(int enum_in,int layout,int interpolation,int id,int numindices,int* indices,IssmDouble* values,IssmDouble* values_min,IssmDouble* values_max);85 85 void SetPentaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values); 86 86 void SetPentaDatasetInput(int enum_in,int id,int interpolation,int numindices,int* indices,IssmDouble* values); -
issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp
r25379 r25406 80 80 output->inputs = xNew<Input*>(this->numtimesteps); 81 81 for(int i=0;i<this->numtimesteps;i++){ 82 output->inputs[i] = this->inputs[i]->copy(); 82 if(this->inputs[i]){ 83 output->inputs[i] = this->inputs[i]->copy(); 84 } 85 else{ 86 output->inputs[i] = NULL; 87 } 83 88 } 84 89 } -
issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h
r25379 r25406 38 38 /*}}}*/ 39 39 /*Object virtual functions definitions:{{{*/ 40 Input* copy();40 Input* copy(); 41 41 void Configure(Parameters* params); 42 42 void DeepEcho(); -
issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
r25317 r25406 32 32 for(int j=0;j<elements->Size();j++){ 33 33 Element* element=(Element*)elements->GetObjectByOffset(j); 34 element->GetVectorFromControlInputs(vector,control_type[i],i, data,offset);34 element->GetVectorFromControlInputs(vector,control_type[i],i,N[i],data,offset); 35 35 } 36 36 offset += M[i]*N[i]; … … 47 47 48 48 /*intermediary: */ 49 int 49 int N; 50 50 Vector<IssmDouble>* vec_vector=NULL; 51 51
Note:
See TracChangeset
for help on using the changeset viewer.