/*--------------------------------------------------------------------------*/ fint fov_reverse_(fint* ftag, fint* fm, fint* fn, fint* fq, fdouble* fu, fdouble* fz) { int rc=-1; int tag=*ftag, m=*fm, n=*fn, q=*fq; double** U = myalloc2(q,m); double** Z = myalloc2(q,n); spread2(q,m,fu,U); rc=fov_reverse(tag,m,n,q,U,Z); pack2(q,n,Z,fz); free((char*)*Z); free((char*)Z); free((char*)*U); free((char*)U); return rc; }
int jac_solv( unsigned short tag, int n, double* x, double* b, unsigned short sparse, unsigned short mode ) { static double **J; static double **I; static double *y; static double *xold; static int* ri; static int* ci; static int nax,tagold,modeold,cgd; int i,j; int rc = 3; if ((n != nax) || (tag != tagold)) { if (nax) { free(*J); free(J); free(*I); free(I); free(xold); free(ri); free(ci); free(y); } J = myalloc2(n,n); I = myalloc2(n,n); y = myalloc1(n); xold = myalloc1(n); ri = (int*)malloc(n*sizeof(int)); ci = (int*)malloc(n*sizeof(int)); for (i=0; i<n; i++) { xold[i] = 0; for (j=0;j<n;j++) I[i][j]=(i==j)?1.0:0.0; } cgd = 1; modeold = 0; nax = n; tagold = tag; } if (cgd == 0) for (i=0; i<n; i++) if (x[i] != xold[i]) cgd = 1; if (cgd == 1) for (i=0; i<n; i++) xold[i] = x[i]; switch(mode) { case 0: MINDEC(rc,zos_forward(tag,n,n,1,x,y)); MINDEC(rc,fov_reverse(tag,n,n,n,I,J)); break; case 1: if ((modeold == 0) || (cgd == 1)) { MINDEC(rc,zos_forward(tag,n,n,1,x,y)); MINDEC(rc,fov_reverse(tag,n,n,n,I,J)); } if (LUFactorization(J,n,ri,ci) < 0) return -3; modeold = 1; break; case 2: if ((modeold < 1) || (cgd == 1)) { MINDEC(rc,zos_forward(tag,n,n,1,x,y)); MINDEC(rc,fov_reverse(tag,n,n,n,I,J)); if (LUFactorization(J,n,ri,ci) < 0) return -3; } GauszSolve(J,n,ri,ci,b); modeold = 2; break; } cgd = 0; return rc; }