jacobian.c
Go to the documentation of this file.
1 #include "jacobian.h"
2 
3 #include "error.h"
4 #include "basic_algebra.h"
5 
17 {
18  unsigned int i;
19 
20  j->neqs=NEqualityEquations(eqs);
21  j->nvars=NVariables(vs);
22 
23  if (j->nvars==0)
24  Error("Empty problem in InitJacobian");
25 
26  NEW(j->J,j->nvars,Tequations);
27  for(i=0;i<j->nvars;i++)
28  {
29  DeriveEqualityEquations(i,&(j->J[i]),eqs);
30  CacheScalarEQUInfo(&(j->J[i]));
31  }
32 }
33 
34 void CopyJacobian(TJacobian *j_dst,TJacobian *j_src)
35 {
36  unsigned int i;
37 
38  j_dst->neqs=j_src->neqs;
39  j_dst->nvars=j_src->nvars;
40 
41  NEW(j_dst->J,j_dst->nvars,Tequations);
42  for(i=0;i<j_dst->nvars;i++)
43  {
44  CopyEquations(&(j_dst->J[i]),&(j_src->J[i]));
45  CacheScalarEQUInfo(&(j_dst->J[i]));
46  }
47 }
48 
49 void GetJacobianSize(unsigned int *nr,unsigned int *nc,TJacobian *j)
50 {
51  *nr=j->neqs;
52  *nc=j->nvars;
53 }
54 
56 {
57  if (nv>=j->nvars)
58  Error("Index out of range in GetJacobianColumn");
59 
60  return(&(j->J[nv]));
61 }
62 
63 Tequation *GetJacobianEquation(unsigned int r,unsigned int c,TJacobian *j)
64 {
65  if ((r>=j->neqs)||(c>=j->nvars))
66  Error("Index out of range in GetJacobianEquation");
67 
68  return(GetEquation(r,&(j->J[c])));
69 }
70 
72 {
73  if (j->neqs>0)
74  {
75  unsigned int i;
76 
77  NEW(*m,j->neqs,double *);
78  for(i=0;i<j->neqs;i++)
79  {
80  NEW((*m)[i],j->nvars,double);
81  }
82  }
83 }
84 
85 void EvaluateJacobian(double *v,double **m,TJacobian *j)
86 {
87  if (j->neqs>0)
88  {
89  unsigned int i,k;
90  double *e;
91 
92  NEW(e,j->neqs,double);
93  for(i=0;i<j->nvars;i++)
94  {
95  EvaluateEqualityEquations(FALSE,v,e,&(j->J[i]));
96  for(k=0;k<j->neqs;k++)
97  m[k][i]=e[k];
98  }
99  free(e);
100  }
101 }
102 
103 void EvaluateJacobianInVector(double *v,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
104 {
105  if (j->neqs>0)
106  {
107  unsigned int i;
108  double *e;
109 
110  NEW(e,j->neqs,double);
111  for(i=0;i<j->nvars;i++)
112  {
113  EvaluateEqualitySparseEquations(v,e,&(j->J[i]));
114  SubMatrixFromMatrix(j->neqs,1,e,0,i,nr,nc,m);
115  }
116  free(e);
117  }
118 }
119 
120 void EvaluateJacobianSubSetInVector(double *v,boolean *sr,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
121 {
122  if (j->neqs>0)
123  {
124  unsigned int i,l;
125  double *e;
126 
127  l=0;
128  for(i=0;i<j->neqs;i++)
129  {
130  if (sr[i]) l++;
131  }
132 
133  NEW(e,l,double);
134  for(i=0;i<j->nvars;i++)
135  {
136  EvaluateSubSetEqualitySparseEquations(v,sr,e,&(j->J[i]));
137  SubMatrixFromMatrix(l,1,e,0,i,nr,nc,m);
138  }
139  free(e);
140  }
141 }
142 
143 void EvaluateTransposedJacobianInVector(double *v,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
144 {
145  if (j->neqs>0)
146  {
147  unsigned int i;
148  double *e;
149 
150  NEW(e,j->neqs,double);
151  for(i=0;i<j->nvars;i++)
152  {
153  EvaluateEqualitySparseEquations(v,e,&(j->J[i]));
154  SubMatrixFromMatrix(1,j->neqs,e,i,0,nr,nc,m);
155  }
156  free(e);
157  }
158 }
159 
160 void EvaluateTransposedJacobianSubSetInVector(double *v,boolean *sr,unsigned int nr,unsigned int nc,double *m,TJacobian *j)
161 {
162  if (j->neqs>0)
163  {
164  unsigned int i,l;
165  double *e;
166 
167  l=0;
168  for(i=0;i<j->neqs;i++)
169  {
170  if (sr[i]) l++;
171  }
172 
173  NEW(e,l,double);
174  for(i=0;i<j->nvars;i++)
175  {
176  EvaluateSubSetEqualitySparseEquations(v,sr,e,&(j->J[i]));
177  SubMatrixFromMatrix(1,l,e,i,0,nr,nc,m);
178  }
179  free(e);
180  }
181 }
182 
183 void PrintJacobianEvaluation(FILE *f,double **m,TJacobian *j)
184 {
185  unsigned int i,k;
186 
187  fprintf(f,"[");
188  for(i=0;i<j->neqs;i++)
189  {
190  for(k=0;k<j->nvars;k++)
191  {
192  fprintf(f,"%.16f ",m[i][k]);
193  }
194  fprintf(f,"\n");
195  }
196  fprintf(f,"];\n");
197 }
198 
199 
201 {
202  if (j->neqs>0)
203  {
204  unsigned int i;
205 
206  for(i=0;i<j->neqs;i++)
207  free(m[i]);
208  free(m);
209  }
210 }
211 
213  unsigned int n,unsigned int ng,unsigned int *g,double *v,
214  unsigned int *nr,unsigned int *nc,double ***m,
215  TJacobian *j)
216 {
217  unsigned int i,k;
218  double *e;
219 
220  /* Size of the output matrix */
221  *nr=3*n;
222  *nc=j->nvars;
223 
224  /* Allocate the output matrix. */
225  NEW(*m,3*n,double*);
226  for(i=0;i<*nr;i++)
227  { NEW((*m)[i],*nc,double); }
228 
229  /* Space for the evaluation of each column */
230  NEW(e,*nr,double);
231 
232  /* Evaluate column-wise */
233  for(i=0;i<j->nvars;i++)
234  {
235  EvaluateEquationsXVectors(p,ng,g,v,e,&(j->J[i]));
236  for(k=0;k<(*nr);k++)
237  (*m)[k][i]=e[k];
238  }
239 
240  /* Release space */
241  free(e);
242 }
243 
244 void PrintJacobian(FILE *f,char **varNames,TJacobian *j)
245 {
246  unsigned int i;
247 
248  for(i=0;i<j->nvars;i++)
249  {
250  fprintf(f,"Jacobian column %u\n",i);
251  PrintEquations(f,varNames,&(j->J[i]));
252  }
253 }
254 
256 {
257  unsigned int i;
258 
259  for(i=0;i<j->nvars;i++)
260  DeleteEquations(&(j->J[i]));
261  free(j->J);
262 }
void AllocateJacobianEvaluation(double ***m, TJacobian *j)
Allocate space for the Jacobian evaluation.
Definition: jacobian.c:71
void FreeJacobianEvaluation(double **m, TJacobian *j)
Release space for the Jacobian evaluation.
Definition: jacobian.c:200
void InitJacobian(Tvariables *vs, Tequations *eqs, TJacobian *j)
Constructor.
Definition: jacobian.c:16
Set of variables of a cuiksystem.
Definition: variables.h:38
Tequation * GetEquation(unsigned int n, Tequations *eqs)
Gets an equation from the set.
Definition: equations.c:1799
#define FALSE
FALSE.
Definition: boolean.h:30
Tequations * J
Definition: jacobian.h:26
unsigned int NVariables(Tvariables *vs)
Gets the number of variables in a set.
Definition: variables.c:69
void EvaluateJacobian(double *v, double **m, TJacobian *j)
Evaluates the Jacobian.
Definition: jacobian.c:85
#define NEW(_var, _n, _type)
Allocates memory space.
Definition: defines.h:385
Definition of the TJacobian type and the associated functions.
void CopyEquations(Tequations *eqs_dst, Tequations *eqs_src)
Copy constructor.
Definition: equations.c:755
void PrintJacobianEvaluation(FILE *f, double **m, TJacobian *j)
Prints the result of evaluating the Jacobian.
Definition: jacobian.c:183
void Error(const char *s)
General error function.
Definition: error.c:80
void PrintJacobian(FILE *f, char **varNames, TJacobian *j)
Prints the symbolic Jacobian.
Definition: jacobian.c:244
void EvaluateSubSetEqualitySparseEquations(double *v, boolean *se, double *r, Tequations *eqs)
Evaluates a subset of the set of equality equations for sparse systems.
Definition: equations.c:2698
Tequation * GetJacobianEquation(unsigned int r, unsigned int c, TJacobian *j)
Returns one element of the Jacobian.
Definition: jacobian.c:63
Error and warning functions.
Tequations * GetJacobianColumn(unsigned int nv, TJacobian *j)
Returns one of the Jacobian element.
Definition: jacobian.c:55
void EvaluateJacobianXVectors(double *p, unsigned int n, unsigned int ng, unsigned int *g, double *v, unsigned int *nr, unsigned int *nc, double ***m, TJacobian *j)
Evaluates the Jacobian multiplied by some given vectors.
Definition: jacobian.c:212
unsigned int neqs
Definition: jacobian.h:24
unsigned int NEqualityEquations(Tequations *eqs)
Number of equalities in the set.
Definition: equations.c:1189
Set of equations.
Definition: equations.h:81
An equation.
Definition: equation.h:237
void EvaluateJacobianInVector(double *v, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates the Jacobian.
Definition: jacobian.c:103
void EvaluateEqualitySparseEquations(double *v, double *r, Tequations *eqs)
Evaluates the set of equality equations for sparse systems.
Definition: equations.c:2675
void EvaluateEqualityEquations(boolean systemOnly, double *v, double *r, Tequations *eqs)
Evaluates all equality equations in the set.
Definition: equations.c:2579
void CacheScalarEQUInfo(Tequations *eqs)
Collects information about scalar equality equations.
Definition: equations.c:2643
void EvaluateEquationsXVectors(double *v, unsigned int ng, unsigned int *g, double *p, double *r, Tequations *eqs)
Evaluates the matrix equations multiplied by some given vectors.
Definition: equations.c:2736
CBLAS_INLINE void SubMatrixFromMatrix(unsigned int nr1, unsigned int nc1, double *m1, unsigned int nri, unsigned int nci, unsigned int nr, unsigned int nc, double *m)
Defines a submatrix in a matrix.
unsigned int nvars
Definition: jacobian.h:25
void EvaluateJacobianSubSetInVector(double *v, boolean *sr, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates some of the Jacobian equations.
Definition: jacobian.c:120
The Jacobian of a set of equations.
Definition: jacobian.h:23
void EvaluateTransposedJacobianSubSetInVector(double *v, boolean *sr, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates a subset of the transposed Jacobian.
Definition: jacobian.c:160
void DeleteEquations(Tequations *eqs)
Destructor.
Definition: equations.c:2862
void PrintEquations(FILE *f, char **varNames, Tequations *eqs)
Prints a set of equations.
Definition: equations.c:2806
void GetJacobianSize(unsigned int *nr, unsigned int *nc, TJacobian *j)
Returns the size of the Jacobian.
Definition: jacobian.c:49
void DeriveEqualityEquations(unsigned int v, Tequations *deqs, Tequations *eqs)
Derives an equation set.
Definition: equations.c:2780
void DeleteJacobian(TJacobian *j)
Destructor.
Definition: jacobian.c:255
void CopyJacobian(TJacobian *j_dst, TJacobian *j_src)
Constructor.
Definition: jacobian.c:34
void EvaluateTransposedJacobianInVector(double *v, unsigned int nr, unsigned int nc, double *m, TJacobian *j)
Evaluates the transposed Jacobian.
Definition: jacobian.c:143