int KppDecomp( double *JVS ) { double W[KPP_NVAR]; double a; int k, kk, j, jj; for( k = 0; k < KPP_NVAR; k++ ) { if( JVS[ LU_DIAG[k] ] == 0.0 ) return k+1; for( kk = LU_CROW[k]; kk < LU_CROW[k+1]; kk++ ) W[ LU_ICOL[kk] ] = JVS[kk]; for( kk = LU_CROW[k]; kk < LU_DIAG[k]; kk++ ) { j = LU_ICOL[kk]; a = -W[j] / JVS[ LU_DIAG[j] ]; W[j] = -a; for( jj = LU_DIAG[j]+1; jj < LU_CROW[j+1]; jj++ ) W[ LU_ICOL[jj] ] += a*JVS[jj]; } for( kk = LU_CROW[k]; kk < LU_CROW[k+1]; kk++ ) JVS[kk] = W[ LU_ICOL[kk] ]; } return 0; }