Changeset 22739 for issm/trunk-jpl/src/c/classes/Elements/Element.cpp
- Timestamp:
- 05/03/18 13:31:36 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r22625 r22739 1387 1387 /*Get number of controls*/ 1388 1388 int num_controls; 1389 bool isautodiff; 1389 1390 parameters->FindParam(&num_controls,InversionNumControlParametersEnum); 1391 parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); 1392 1390 1393 1391 1394 /*Get number of vertices*/ 1392 1395 int numvertices = this->GetNumberOfVertices(); 1393 1396 if(isautodiff){ 1397 int* N; 1398 int* M; 1399 int start = 0; 1400 parameters->FindParam(&N,NULL,ControlInputSizeNEnum); 1401 parameters->FindParam(&M,NULL,ControlInputSizeMEnum); 1402 if(control_index>0) for(int n=0;n<control_index-1;n++) start+=N[n]*M[n]; 1403 1404 for(int n=0;n<N[control_index];n++){ 1405 for(int i=0;i<numvertices;i++){ 1406 indexing[i+n*numvertices]=this->vertices[i]->Sid() + start + n*M[control_index]; 1407 } 1408 } 1409 } 1410 else{ 1411 int M; 1412 parameters->FindParam(&M,ControlInputSizeMEnum); 1394 1413 /*get gradient indices*/ 1395 if(onsid){1396 for(int i=0;i<numvertices;i++){1397 indexing[i]=num_controls*this->vertices[i]->Sid() + control_index;1398 }1399 }1400 else{1401 for(int i=0;i<numvertices;i++){1402 indexing[i]=num_controls*this->vertices[i]->Pid() + control_index;1403 }1404 }1405 1414 if(onsid){ 1415 for(int i=0;i<numvertices;i++){ 1416 indexing[i]=this->vertices[i]->Sid() + (control_index)*M; 1417 } 1418 } 1419 else{ 1420 for(int i=0;i<numvertices;i++){ 1421 indexing[i]=this->vertices[i]->Pid() + (control_index)*M; 1422 } 1423 } 1424 } 1406 1425 } 1407 1426 /*}}}*/ … … 1619 1638 1620 1639 /*For now we only support nodal vectors*/ 1621 if(M!=iomodel->numberofvertices) _error_("not supported");1622 if(N!=1) _error_("not supported");1640 //if(M!=iomodel->numberofvertices) _error_("not supported"); 1641 //if(N!=1) _error_("not supported"); 1623 1642 1624 1643 /*Recover vertices ids needed to initialize inputs*/ … … 1637 1656 this->AddControlInput(input_enum,values,min_vector,max_vector,P1Enum,id); 1638 1657 } 1658 1659 else if(M==iomodel->numberofvertices+1){ 1660 /*create transient input: */ 1661 IssmDouble* times = xNew<IssmDouble>(N); 1662 for(int t=0;t<N;t++) times[t] = vector[(M-1)*N+t]; 1663 /*Create the three transient inputs for the control input*/ 1664 TransientInput* values_input=new TransientInput(ControlInputValuesEnum,times,N); 1665 TransientInput* mins_input = new TransientInput(ControlInputMinsEnum,times,N); 1666 TransientInput* maxs_input = new TransientInput(ControlInputMaxsEnum,times,N); 1667 TransientInput* grad_input = new TransientInput(ControlInputGradEnum); 1668 for(int t=0;t<N;t++){ 1669 for(int i=0;i<numvertices;i++){ 1670 values[i]=vector[N*(vertexids[i]-1)+t]; 1671 values_min[i] = min_vector[N*(vertexids[i]-1)+t]; 1672 values_max[i] = max_vector[N*(vertexids[i]-1)+t]; 1673 } 1674 switch(this->ObjectEnum()){ 1675 case TriaEnum: 1676 values_input->AddTimeInput(new TriaInput(ControlInputValuesEnum,values,P1Enum)); 1677 mins_input->AddTimeInput(new TriaInput(ControlInputMinsEnum,values_min,P1Enum)); 1678 maxs_input->AddTimeInput(new TriaInput(ControlInputMaxsEnum,values_max,P1Enum)); 1679 break; 1680 case PentaEnum: 1681 printf("-------------- file: Element.cpp line: %i\n",__LINE__); 1682 values_input->AddTimeInput(new PentaInput(ControlInputValuesEnum,values,P1Enum)); 1683 mins_input->AddTimeInput(new PentaInput(ControlInputMinsEnum,values_min,P1Enum)); 1684 maxs_input->AddTimeInput(new PentaInput(ControlInputMaxsEnum,values_max,P1Enum)); 1685 break; 1686 case TetraEnum: 1687 values_input->AddTimeInput(new TetraInput(ControlInputValuesEnum,values,P1Enum)); 1688 mins_input->AddTimeInput(new TetraInput(ControlInputMinsEnum,values_min,P1Enum)); 1689 maxs_input->AddTimeInput(new TetraInput(ControlInputMaxsEnum,values_max,P1Enum)); 1690 break; 1691 default: _error_("Not implemented yet"); 1692 } 1693 } 1694 this->inputs->AddInput(new ControlInput(input_enum,TransientInputEnum,values_input,mins_input,maxs_input,grad_input,P1Enum,id)); 1695 xDelete<IssmDouble>(times); 1696 } 1697 else _error_("not currently supported type of M and N attempted"); 1639 1698 1640 1699 /*clean up*/
Note:
See TracChangeset
for help on using the changeset viewer.