Ice Sheet System Model  4.18
Code documentation
GetVectorFromControlInputsx.cpp
Go to the documentation of this file.
1 
6 #include "../../shared/shared.h"
7 #include "../../toolkits/toolkits.h"
8 
9 void GetVectorFromControlInputsx(Vector<IssmDouble>** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,const char* data){/*{{{*/
10 
11  bool isautodiff;
12  parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum);
13  if(isautodiff){
14  int* N = NULL;
15  int* M = NULL;
16  int num_controls;
17  int* control_type = NULL;
18  Vector<IssmDouble>* vector=NULL;
19 
20  /*Retrieve some parameters*/
21  parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
22  parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
23  parameters->FindParam(&N,NULL,ControlInputSizeNEnum);
24  parameters->FindParam(&M,NULL,ControlInputSizeMEnum);
25 
26  /*1. Get vector size*/
27  int size = 0;
28  for(int i=0;i<num_controls;i++) size+=M[i]*N[i];
29 
30  /*2. Allocate vector*/
31  vector=new Vector<IssmDouble>(size);
32 
33  /*3. Populate vector*/
34  int offset = 0;
35  for(int i=0;i<num_controls;i++){
36  for(int j=0;j<elements->Size();j++){
37  Element* element=(Element*)elements->GetObjectByOffset(j);
38  element->GetVectorFromControlInputs(vector,control_type[i],i,data,offset);
39  }
40  offset += M[i]*N[i];
41  }
42 
43  vector->Assemble();
44 
45  /*Assign output pointers:*/
46  xDelete<int>(control_type);
47  xDelete<int>(M);
48  xDelete<int>(N);
49 
50  *pvector=vector;
51  }
52  else{
53  int num_controls;
54  int* control_type = NULL;
55  Vector<IssmDouble>* vector=NULL;
56 
57  /*Retrieve some parameters*/
58  parameters->FindParam(&num_controls,InversionNumControlParametersEnum);
59  parameters->FindParam(&control_type,NULL,InversionControlParametersEnum);
60 
61  /*2. Allocate vector*/
62  vector=new Vector<IssmDouble>(num_controls*vertices->NumberOfVertices());
63 
64  /*3. Populate vector*/
65  int offset = 0;
66  for(int i=0;i<num_controls;i++){
67  for(int j=0;j<elements->Size();j++){
68  Element* element=(Element*)elements->GetObjectByOffset(j);
69  element->GetVectorFromControlInputs(vector,control_type[i],i,data);
70  }
71  }
72  vector->Assemble();
73 
74  /*Assign output pointers:*/
75  xDelete<int>(control_type);
76  *pvector=vector;
77  }
78 
79 }/*}}}*/
80 void GetVectorFromControlInputsx( IssmDouble** pvector,int *pN, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){/*{{{*/
81 
82  /*intermediary: */
83  int N;
84  Vector<IssmDouble>* vec_vector=NULL;
85 
86  /*Get PETSc vector*/
87  GetVectorFromControlInputsx( &vec_vector, elements,nodes, vertices, loads, materials, parameters,data);
88 
89  /*Serialize*/
90  vec_vector->GetSize(&N);
91  IssmDouble* vector=vec_vector->ToMPISerial();
92  delete vec_vector;
93 
94  /*Assign output pointers:*/
95  *pvector=vector;
96  if(pN) *pN=N;
97 }/*}}}*/
98 
99 /*For autodiff, we sometimes need to cast our vectors to passive*/
100 #ifdef _HAVE_AD_
101 void GetPassiveVectorFromControlInputsx(IssmPDouble** pvector,int* pN, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){/*{{{*/
102 
103  /*Get active vector first*/
104  Vector<IssmDouble> *activevector = NULL;
105  IssmPDouble *vector = NULL;
106  int size;
107 
108  /*Retrieve some parameters*/
109  GetVectorFromControlInputsx(&activevector, elements,nodes, vertices, loads, materials, parameters,data);
110 
111  /*Serialize vector*/
112  activevector->GetSize(&size);
113  IssmDouble* dactivevector=activevector->ToMPISerial();
114 
115  /*Cast to passive*/
116  vector=xNew<IssmPDouble>(size);
117  for(int i=0;i<size;i++) vector[i] = reCast<IssmPDouble>(dactivevector[i]);
118 
119  /*Assign output pointers:*/
120  delete activevector;
121  xDelete<IssmDouble>(dactivevector);
122  *pvector=vector;
123  if(pN) *pN=size;
124 
125 }/*}}}*/
126 #else
127 void GetPassiveVectorFromControlInputsx(IssmPDouble** pvector,int* pN, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){/*{{{*/
128 
129  GetVectorFromControlInputsx(pvector,pN,elements,nodes, vertices, loads, materials, parameters,data);
130 }/*}}}*/
131 #endif
DataSet::Size
int Size()
Definition: DataSet.cpp:399
GetVectorFromControlInputsx
void GetVectorFromControlInputsx(Vector< IssmDouble > **pvector, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters, const char *data)
Definition: GetVectorFromControlInputsx.cpp:9
Vertices
Declaration of Vertices class.
Definition: Vertices.h:15
GetPassiveVectorFromControlInputsx
void GetPassiveVectorFromControlInputsx(IssmPDouble **pvector, int *pN, Elements *elements, Nodes *nodes, Vertices *vertices, Loads *loads, Materials *materials, Parameters *parameters, const char *data)
Definition: GetVectorFromControlInputsx.cpp:127
IssmDouble
double IssmDouble
Definition: types.h:37
GetVectorFromControlInputsx.h
Nodes
Declaration of Nodes class.
Definition: Nodes.h:19
InversionNumControlParametersEnum
@ InversionNumControlParametersEnum
Definition: EnumDefinitions.h:223
InversionControlParametersEnum
@ InversionControlParametersEnum
Definition: EnumDefinitions.h:209
Parameters
Declaration of Parameters class.
Definition: Parameters.h:18
Elements
Declaration of Elements class.
Definition: Elements.h:17
Vertices::NumberOfVertices
int NumberOfVertices(void)
Definition: Vertices.cpp:255
ControlInputSizeMEnum
@ ControlInputSizeMEnum
Definition: EnumDefinitions.h:105
Vector::GetSize
void GetSize(int *pM)
Definition: Vector.h:185
Element
Definition: Element.h:41
Element::GetVectorFromControlInputs
virtual void GetVectorFromControlInputs(Vector< IssmDouble > *gradient, int control_enum, int control_index, const char *data, int offset)=0
Materials
Declaration of Materials class.
Definition: Materials.h:16
AutodiffIsautodiffEnum
@ AutodiffIsautodiffEnum
Definition: EnumDefinitions.h:50
Vector::Assemble
void Assemble(void)
Definition: Vector.h:142
Loads
Declaration of Loads class.
Definition: Loads.h:16
DataSet::GetObjectByOffset
Object * GetObjectByOffset(int offset)
Definition: DataSet.cpp:334
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
Vector::ToMPISerial
doubletype * ToMPISerial(void)
Definition: Vector.h:277
ControlInputSizeNEnum
@ ControlInputSizeNEnum
Definition: EnumDefinitions.h:106
IssmPDouble
IssmDouble IssmPDouble
Definition: types.h:38
Vector< IssmDouble >