@@ -68,6 +68,9 @@ EquilibriumReactions< REAL_TYPE,
6868
6969 RealType forwardProduct = 1.0 ;
7070 RealType reverseProduct = 1.0 ;
71+
72+ // these actually only hold the derivatives of the single concentration term for the product...not the full product.
73+ // it will have to be multiplied by the product itself to get the derivative of the product.
7174 RealType dForwardProduct_dxi[numReactions] = {0.0 };
7275 RealType dReverseProduct_dxi[numReactions] = {0.0 };
7376 // loop over species
@@ -98,15 +101,15 @@ EquilibriumReactions< REAL_TYPE,
98101 // compute the residual for this reaction
99102 if constexpr ( RESIDUAL_FORM == 0 )
100103 {
101- residual[a] = forwardProduct - Keq * reverseProduct;
104+ residual[a] = Keq * forwardProduct - reverseProduct;
102105 }
103106 else if constexpr ( RESIDUAL_FORM == 1 )
104107 {
105- residual[a] = 1.0 - Keq * reverseProduct / forwardProduct;
108+ residual[a] = 1.0 - reverseProduct / ( forwardProduct * Keq ) ;
106109 }
107110 else if constexpr ( RESIDUAL_FORM == 2 )
108111 {
109- residual[a] = log ( Keq * reverseProduct / forwardProduct );
112+ residual[a] = log ( reverseProduct / ( forwardProduct * Keq ) );
110113 }
111114 // printf( "residual[%d] = %g - %g * %g = %g\n", a, forwardProduct, Keq, reverseProduct, residual[a] );
112115
@@ -117,20 +120,25 @@ EquilibriumReactions< REAL_TYPE,
117120 // printf( "(%d) dReverseProduct_dxi[%d] = %f\n", a, b, dReverseProduct_dxi[b] );
118121 // printf( "Keq = %f\n", Keq );
119122
120- dForwardProduct_dxi[b] *= forwardProduct;
121- dReverseProduct_dxi[b] *= reverseProduct;
122123
123124 if constexpr ( RESIDUAL_FORM == 0 )
124125 {
125- jacobian ( a, b ) = dForwardProduct_dxi[b] - Keq * dReverseProduct_dxi[b];
126+ dForwardProduct_dxi[b] *= forwardProduct;
127+ dReverseProduct_dxi[b] *= reverseProduct;
128+ jacobian ( a, b ) = Keq * dForwardProduct_dxi[b] - dReverseProduct_dxi[b];
126129 }
127130 else if constexpr ( RESIDUAL_FORM == 1 )
128131 {
129- jacobian ( a, b ) = -Keq * ( dReverseProduct_dxi[b] / forwardProduct - dForwardProduct_dxi[b] * reverseProduct / ( forwardProduct * forwardProduct ) );
132+ dForwardProduct_dxi[b] *= forwardProduct;
133+ dReverseProduct_dxi[b] *= reverseProduct;
134+ jacobian ( a, b ) = -1 /Keq * ( dReverseProduct_dxi[b] / forwardProduct - dForwardProduct_dxi[b] * reverseProduct / ( forwardProduct * forwardProduct ) );
130135 }
131136 else if constexpr ( RESIDUAL_FORM == 2 )
132137 {
133- jacobian ( a, b ) = -dForwardProduct_dxi[b] / forwardProduct + dReverseProduct_dxi[b] / reverseProduct;
138+ // printf( "(%d) dForwardProduct_dxi[%d] = %f\n", a, b, dForwardProduct_dxi[b] );
139+ // printf( "(%d) dReverseProduct_dxi[%d] = %f\n", a, b, dReverseProduct_dxi[b] );
140+ jacobian ( a, b ) = -dForwardProduct_dxi[b] + dReverseProduct_dxi[b];
141+ // printf( " jacobian( a, b ) = %g + %g = %g\n", -dForwardProduct_dxi[b], dReverseProduct_dxi[b], jacobian( a, b ) );
134142 }
135143 }
136144 }
@@ -162,7 +170,7 @@ EquilibriumReactions< REAL_TYPE,
162170 CArrayWrapper< double , numReactions, numReactions > jacobian;
163171
164172 REAL_TYPE residualNorm = 0.0 ;
165- for ( int k=0 ; k<100 ; ++k )
173+ for ( int k=0 ; k<30 ; ++k )
166174 {
167175 computeResidualAndJacobian ( temperature,
168176 params,
@@ -178,7 +186,7 @@ EquilibriumReactions< REAL_TYPE,
178186 }
179187 residualNorm = sqrt ( residualNorm );
180188 printf ( " iter, residualNorm = %2d, %16.10g \n " , k, residualNorm );
181- if ( residualNorm < 1.0e-14 )
189+ if ( residualNorm < 1.0e-12 )
182190 {
183191 printf ( " converged\n " );
184192 break ;
@@ -213,26 +221,28 @@ EquilibriumReactions< REAL_TYPE,
213221 printf ( " },\n " );
214222 }
215223 printf ( " }\n " );
216- }
217224
218- int numNonSymmetric = 0 ;
219- for ( int i=0 ; i<numReactions; ++i )
220- {
221- for ( int j=i; j<numReactions; ++j )
225+ int numNonSymmetric = 0 ;
226+ for ( int i=0 ; i<numReactions; ++i )
222227 {
223- if ( fabs ( jacobian ( i, j ) - jacobian ( j, i ) ) > 0.5 * ( jacobian ( i, j ) + jacobian ( j, i ) )* 1.0e-14 )
228+ for ( int j=i; j<numReactions; ++j )
224229 {
225- ++numNonSymmetric;
226- printf ( " jacobian not symmetric: i = %d, j = %d, jacobian(i,j) = %g, jacobian(j,i) = %g\n " , i, j, jacobian ( i, j ), jacobian ( j, i ) );
230+ if ( fabs ( jacobian ( i, j ) - jacobian ( j, i ) ) > 0.5 * ( jacobian ( i, j ) + jacobian ( j, i ) )*1.0e-14 )
231+ {
232+ ++numNonSymmetric;
233+ printf ( " jacobian not symmetric: i = %d, j = %d, jacobian(i,j) = %g, jacobian(j,i) = %g\n " , i, j, jacobian ( i, j ), jacobian ( j, i ) );
234+ }
227235 }
228236 }
229- }
230- if ( numNonSymmetric > 0 )
231- {
232- printf ( " numNonSymmetric = %d\n " , numNonSymmetric );
237+ if ( numNonSymmetric > 0 )
238+ {
239+ printf ( " numNonSymmetric = %d\n " , numNonSymmetric );
240+ }
241+
242+ printf ( " is J PD = %d\n " , isPositiveDefinite< double , numReactions >( jacobian.data ) );
243+
233244 }
234245
235- printf ( " is J PD = %d\n " , isPositiveDefinite< double , numReactions >( jacobian.data ) );
236246
237247 // solve for the change in xi
238248 solveNxN_Cholesky< double , numReactions >( jacobian.data , residual, dxi );
0 commit comments