#define CS 1 /* check subscripts on */ #include "common.h" #include "corefunc.h" #include #include "_linalg.h" #define VAR FloatHi #define VARPTR FloatHiPtr #define MOIE 1 /* Manually Optimize Inductive Expresions */ /* Pointer to standard linea algebra's functions */ Local(StdLinAlgDataPtr) stdalg; /* phase dim, numbers of mesh intervals, collocation points, boundary and integral conditions*/ Local(Int2) nphase,ntst,ncol,nbc,nnint; /* global constants */ Local(Int2) nfree,nrc,nrow,nclm; Local(Int2) ndecomp,nback; /* Address evaluation constants: Loc(A(i,j,k))=Loc(mp->A)+Ak*k+Aj*j+i */ Local(int) Ak,Aj,Bk,Cj,A1k,A2k,BBk,CCk,S1k,S2k; #define Bj nfree #define A1j nphase #define A2j nphase #define BBj nphase #define CCj nphase #define S1j nphase #define S2j nphase Local(int) ICFj; /* i - column, j - row, k - block */ #define MATRIXELEMA(mp,i,j,k) (*((mp)->A+Ak*(k)+Aj*(j)+(i))) #define MATRIXELEMB(mp,i,j,k) (*((mp)->B+Bk*(k)+Bj*(j)+(i))) #define MATRIXELEMC(mp,i,j,k) (*((mp)->C+(mp)->Ck*(k)+Cj*(j)+(i))) #define MATRIXELEMD(mp,i,j) (*((mp)->D+nfree*(j)+(i))) #define MATRIXELEMA1(mp,i,j,k) (*((mp)->A1+A1k*(k)+A1j*(j)+(i))) #define MATRIXELEMA2(mp,i,j,k) (*((mp)->A2+A2k*(k)+A2j*(j)+(i))) #define MATRIXELEMBB(mp,i,j,k) (*((mp)->BB+BBk*(k)+BBj*(j)+(i))) #define MATRIXELEMCC(mp,i,j,k) (*((mp)->CC+CCk*(k)+CCj*(j)+(i))) #define MATRIXELEMS1(mp,i,j,k) (*((mp)->S1+S1k*(k)+S1j*(j)+(i))) #define MATRIXELEMS2(mp,i,j,k) (*((mp)->S2+S2k*(k)+S2j*(j)+(i))) #define MATRIXELEMFAA(mp,i,j) (*((mp)->FAA+nphase*(j)+(i))) #define MATRIXELEMFCC(mp,i) (*((mp)->FCC+(i))) #define MATRIXELEMBUF(mp,i) (*((mp)->BUF+(i))) #define MATRIXELEMSOL1(mp,i,j) (*((mp)->SOL1+nphase*(j)+(i))) #define MATRIXELEMSOL2(mp,i,j) (*((mp)->SOL2+nphase*(j)+(i))) #define MATRIXELEMSOL3(mp,i,j) (*((mp)->SOL3+nphase*(j)+(i))) #define MATRIXELEME(mp,i,j) (*((mp)->E+(nbc+nphase+nfree)*(j)+(i))) #define MATRIXELEMX(mp,i) (*((mp)->X+(i))) #define MATRIXELEMP0(mp,i,j) (*((mp)->P0+nphase*(j)+(i))) #define MATRIXELEMP1(mp,i,j) (*((mp)->P1+nphase*(j)+(i))) #define MATRIXELEMIRF(mp,i,j) (*((mp)->IRF+nphase*ncol*(j)+(i))) #define MATRIXELEMICF(mp,i,j) (*((mp)->ICF+ICFj*(j)+(i))) #define MATRIXELEMIPR(mp,i,j) (*((mp)->IPR+nphase*(j)+(i))) #define MATRIXELEMICF1(mp,i,j) (*((mp)->ICF1+nphase*(j)+(i))) #define MATRIXELEMICF2(mp,i,j) (*((mp)->ICF2+nphase*(j)+(i))) #define MATRIXELEMIR(mp,i) (*((mp)->IR+(i))) #define MATRIXELEMIC(mp,i) (*((mp)->IC+(i))) #ifdef Nint #undef Nint /* ncbimath.h defines this */ #endif /* Initialization function */ Entry(void) bvp_Init(StdLinAlgDataPtr Stdalg, Int2 Nphase, Int2 Ntst, Int2 Ncol, Int2 Nbc, Int2 Nint, Int2 Nfree) { stdalg=Stdalg; ndecomp=nback=0; nphase=Nphase; ntst=Ntst; ncol=Ncol; nbc=Nbc; nnint=Nint; nfree=Nfree; nrc=nbc+nfree; nrow=nphase*ncol; nclm=nphase*(ncol+1); Ak=(ncol+1)*nphase*nphase*ncol; Aj=nphase*(ncol+1); Bk=ncol*nphase*nfree; Cj=nphase*(ncol+1); A1k=nphase*nphase; A2k=nphase*nphase; BBk=nphase*nfree; CCk=nphase*(nphase+nfree); S1k=nphase*nphase; S2k=nphase*nphase; ICFj=nphase*(ncol+1); } #ifdef WIN_MSWIN static FILE *deb=NULL; static void DebOpen(void) { if (!deb) deb=fopen("debbvp","wt"); } #define Pr fprintf(deb, #else #define Pr printf( #endif #if CS Boolean Check(Int2 block, Int2 nblock, Int2 sub, Int2 lim, Int2 line) { if (block<0 || block>=nblock || sub<0 || sub>=lim) { if (Message(MSG_OKC,"Something is out of range:\n" " Block %i not in [0,%i), or\n" " index %i not in [0,%i)\n" "_bvpalg.c, line %i", (int)block,(int)nblock,(int)sub,(int)lim,(int)line) == ANS_CANCEL) { #ifdef WIN_MSWIN div(1,0); #else abort(); #endif } else return TRUE; } return FALSE; } #endif /***********/ /* Vectors */ /* k - block number, j - elem number */ #define VECTNUM(k,j) (nphase*ncol*(k)+(j)) #define VECTORELEMFA(vp,k,j) (*(vp+VECTNUM((k),(j)))) #define VECTORELEMFC(vp,j) (*(vp+VECTNUM(ntst,(j)))) Entry(void) bvp_SetVectorElementFA(Vector vp, Int2 k, Int2 j, VAR e) { #if CS Check(k,ntst,j,nphase*ncol,__LINE__); #endif vp[VECTNUM(k,j)]=e; } Entry(VAR) bvp_GetVectorElementFA(Vector vp, Int2 k, Int2 j) { #if CS Check(k,ntst,j,nphase*ncol,__LINE__); #endif return vp[VECTNUM(k,j)]; } Entry(void) bvp_SetVectorElementFC(Vector vp, Int2 j, VAR e) { #if CS Check(0,1,j,stdalg->GetVectorDim(vp)-nphase*ncol*ntst,__LINE__); #endif vp[VECTNUM(ntst,j)]=e; } Entry(VAR) bvp_GetVectorElementFC(Vector vp, Int2 j) { #if CS Check(0,1,j,stdalg->GetVectorDim(vp)-nphase*ncol*ntst,__LINE__); #endif return vp[VECTNUM(ntst,j)]; } Entry(void) bvp_PrintVector(Vector vp, CharPtr title) { int n=stdalg->GetVectorDim(vp),j,k; #ifdef WIN_MSWIN DebOpen(); #endif Pr "\n%s\n",title); Pr " nphase=%i, ncol=%i, ntst=%i, nfree=%i\n",(int)nphase,(int)ncol,(int)ntst,(int)nfree); Pr " n=%i\n",n); Pr " FA:\n"); for (k=0; knnint+1*/ #define MATRIXNUMBUF (nbc+nphase+nfree) #define MATRIXNUMSOL1 nphase*ntst #define MATRIXNUMSOL2 nphase*ntst #define MATRIXNUMSOL3 nphase*ntst #define MATRIXNUME (nbc+nphase+nfree)*(nbc+nphase+nfree) #define MATRIXNUMX nphase*ncol #define MATRIXNUMP0 nphase*nphase #define MATRIXNUMP1 nphase*nphase #define MATRIXNUMIRF (ntst+1)*nphase*ncol #define MATRIXNUMICF (ntst+1)*nphase*(ncol+1) #define MATRIXNUMIPR (ntst+1)*nphase #define MATRIXNUMICF1 (ntst+1)*nphase #define MATRIXNUMICF2 (ntst+1)*nphase #define MATRIXNUMIR (nbc+nphase+nfree) #define MATRIXNUMIC (nbc+nphase+nfree) #define MATRSIZE(n,m) (sizeof(bvpMatrix1)+\ (MATRIXNUMA+MATRIXNUMB+MATRIXNUMC(n)+MATRIXNUMD(n))*sizeof(VAR) +\ (MATRIXNUMA1+MATRIXNUMA2+MATRIXNUMBB+MATRIXNUMCC+MATRIXNUMS1+MATRIXNUMS2+\ MATRIXNUMFAA+MATRIXNUMFCC+MATRIXNUMBUF+MATRIXNUMSOL1+MATRIXNUMSOL2+\ MATRIXNUMSOL3+MATRIXNUME+MATRIXNUMX+MATRIXNUMP0+MATRIXNUMP1)*sizeof(VAR) +\ (MATRIXNUMIRF+MATRIXNUMICF+MATRIXNUMIPR+MATRIXNUMICF1+MATRIXNUMICF2+\ MATRIXNUMIR+MATRIXNUMIC)*sizeof(Int2) \ ) Entry(void) bvp_PrintMatrix(bvpMatrixPtr mp, CharPtr title, int Level) { int n=mp->n,m=mp->m,i,j,k; #ifdef WIN_MSWIN DebOpen(); #endif Pr "\n%s\n",title); Pr " nphase=%i, ncol=%i, ntst=%i, nfree=%i\n",(int)nphase,(int)ncol,(int)ntst,(int)nfree); Pr " n=%i, m=%i\n",n,m); if (Level==0) { Pr " A,B\n"); for (k=0; kn-ntst*nphase*ncol; j++) { for (i=0; in-ntst*nphase*ncol; j++) { for (i=0; iA=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMA; mp->B=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMB; mp->C=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMC(mp->n); mp->D=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMD(mp->n); mp->A1=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMA1; mp->A2=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMA2; mp->BB=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMBB; mp->CC=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMCC; mp->S1=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMS1; mp->S2=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMS2; mp->FAA=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMFAA; mp->FCC=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMFCC; mp->BUF=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMBUF; mp->SOL1=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMSOL1; mp->SOL2=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMSOL2; mp->SOL3=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMSOL3; mp->E=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUME; mp->X=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMX; mp->P0=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMP0; mp->P1=(VAR *)vp; vp+=sizeof(VAR)*MATRIXNUMP1; mp->IRF=(Int2Ptr)vp; vp+=sizeof(Int2)*MATRIXNUMIRF; mp->ICF=(Int2Ptr)vp; vp+=sizeof(Int2)*MATRIXNUMICF; mp->IPR=(Int2Ptr)vp; vp+=sizeof(Int2)*MATRIXNUMIPR; mp->ICF1=(Int2Ptr)vp; vp+=sizeof(Int2)*MATRIXNUMICF1; mp->ICF2=(Int2Ptr)vp; vp+=sizeof(Int2)*MATRIXNUMICF2; mp->IR=(Int2Ptr)vp; vp+=sizeof(Int2)*MATRIXNUMIR; mp->IC=(Int2Ptr)vp; } /* Creates a Matrix of dimensions n,m */ Entry(bvpMatrixPtr) bvp_CreateMatrix(int n, int m DEBPAR) { bvpMatrixPtr mp; mp = MemNewDeb(MATRSIZE(n,m) DEBARG); mp->n=(Int2)n; mp->m=(Int2)m; mp->Ck=(mp->n-ntst*ncol*nphase)*(ncol+1)*nphase; MatrixSetPtrs(mp); return mp; } /* Destroys a Matrix and free the memory it occupies */ Entry(bvpMatrixPtr) bvp_DestroyMatrix(bvpMatrixPtr mp) { return MemFree(mp); } /* Copies a Matrix */ Entry(bvpMatrixPtr) bvp_CopyMatrix(bvpMatrixPtr from, bvpMatrixPtr to DEBPAR) { if (!to) to=bvp_CreateMatrix(from->n,from->m DEBARG); MemCopy(to,from,MATRSIZE(from->n,from->m)); MatrixSetPtrs(to); return to; } /* Clears a Matrix */ Entry(void) bvp_ClearMatrix(bvpMatrixPtr mp) { if (mp) { MemFill((CharPtr)mp+sizeof(bvpMatrix1),0,MATRSIZE(mp->n,mp->m)-sizeof(bvpMatrix1)); } } /* Returns number of rows */ Entry(Int2) bvp_GetRowNum(bvpMatrixPtr mp) { return mp->n; } /* Returns number of columns */ Entry(Int2) bvp_GetColNum(bvpMatrixPtr mp) { return mp->m; } Entry(VARPTR) bvp_GetMatrixA(bvpMatrixPtr mp, Int2 k, Int2Ptr mAj) { *mAj=Aj; return &MATRIXELEMA(mp,0,0,k); } Entry(void) bvp_SetMatrixAElement(bvpMatrixPtr mp, Int2 i, Int2 j, Int2 k, VAR e) { MATRIXELEMA(mp,i,j,k)=e; } Entry(VAR) bvp_GetMatrixAElement(bvpMatrixPtr mp, Int2 i, Int2 j, Int2 k) { return MATRIXELEMA(mp,i,j,k); } Entry(void) bvp_SetMatrixBElement(bvpMatrixPtr mp, Int2 i, Int2 j, Int2 k, VAR e) { MATRIXELEMB(mp,i,j,k)=e; } Entry(VAR) bvp_GetMatrixBElement(bvpMatrixPtr mp, Int2 i, Int2 j, Int2 k) { return MATRIXELEMB(mp,i,j,k); } Entry(void) bvp_SetMatrixCElement(bvpMatrixPtr mp, Int2 i, Int2 j, Int2 k, VAR e) { MATRIXELEMC(mp,i,j,k)=e; } Entry(VAR) bvp_GetMatrixCElement(bvpMatrixPtr mp, Int2 i, Int2 j, Int2 k) { return MATRIXELEMC(mp,i,j,k); } Entry(void) bvp_SetMatrixDElement(bvpMatrixPtr mp, Int2 i, Int2 j, VAR e) { MATRIXELEMD(mp,i,j)=e; } Entry(VAR) bvp_GetMatrixDElement (bvpMatrixPtr mp, Int2 i, Int2 j) { return MATRIXELEMD(mp,i,j); } Entry(VAR) bvp_GetMatrixEElement (bvpMatrixPtr mp, Int2 i, Int2 j) { return MATRIXELEME(mp,i,j); } Entry(VAR) bvp_GetMatrixP0Element (bvpMatrixPtr mp, Int2 i, Int2 j) { return MATRIXELEMP0(mp,i,j); } Entry(VAR) bvp_GetMatrixP1Element (bvpMatrixPtr mp, Int2 i, Int2 j) { return MATRIXELEMP1(mp,i,j); } #define A(i,j,k) MATRIXELEMA(mp,i,j,k) #define B(i,j,k) MATRIXELEMB(mp,i,j,k) #define C(i,j,k) MATRIXELEMC(mp,i,j,k) #define D(i,j) MATRIXELEMD(mp,i,j) #define FA(k,j) VECTORELEMFA(vp,k,j) /* k counts BLOCKS */ #define FC(j) VECTORELEMFC(vp,j) #define NDIM nphase #define NTST ntst #define NCOL ncol #define NFPR nfree /* Multilpy Matrix by vector */ Entry(Vector) bvp_MultiplyMatrixVector(bvpMatrixPtr mp, Vector vp, Vector vpres DEBPAR) { #define FASV(k,j) VECTORELEMFA(vpres,k,j) /* k counts BLOCKS */ #define FCSV(j) VECTORELEMFC(vpres,j) VAR SUM; Int2 I,J,K,nrow; #if MOIE VARPTR pAi,pAj,pAk,pBi,pBj,pBk,pCi,pCk; int iCj; #endif nrow=bvp_GetRowNum(mp); if (!vpres) vpres=stdalg->CreateVector(nrow); #if MOIE pAi=mp->A; pBi=mp->B; #endif for (I=0; IC+iCj; #endif for (SUM=0.0,I=0; ICk; #endif } for (K=0; Kn+1,mpsrc->m DEBARG); MemCopy(mp->A,mpsrc->A,MATRIXNUMA*sizeof(VAR)); MemCopy(mp->B,mpsrc->B,MATRIXNUMB*sizeof(VAR)); for (k=0; kC+k*(MATRIXNUMC(mpsrc->n+1)/ntst), mpsrc->C+k*(MATRIXNUMC(mpsrc->n)/ntst), (MATRIXNUMC(mpsrc->n)/ntst)*sizeof(VAR)); MemCopy(mp->D,mpsrc->D,MATRIXNUMD(mpsrc->n)*sizeof(VAR)); j=mpsrc->n-ntst*nphase*ncol; k=0; for (i=0; iA; pBi=mp->B; pCi=mp->C; pICF_i=mp->ICF; #endif for (I=0; ICk; pICF_i+=ICFj; #endif } /* for (I=0; IA; pA1i=mp->A1; pA2i=mp->A2; pBi=mp->B; pBBi=mp->BB; #endif for (I=0; ICC; pCi=mp->C; #endif for (I=0; ICk; /* C(...,...,I-1) */ #endif for (IR=0; IRCk; #endif } return 0; } #define S1(i,j,k) MATRIXELEMS1(mp,i,j,k) #define S2(i,j,k) MATRIXELEMS2(mp,i,j,k) #define E(i,j) MATRIXELEME(mp,i,j) #define P0(i,j) MATRIXELEMP0(mp,i,j) #define P1(i,j) MATRIXELEMP1(mp,i,j) #define ICF1(i,j) MATRIXELEMICF1(mp,i,j) #define ICF2(i,j) MATRIXELEMICF2(mp,i,j) #define IPR(i,j) MATRIXELEMIPR(mp,i,j) Entry(Int2) bvp_reduce(bvpMatrixPtr mp) { Int2 NAM1,IPIV1,JPIV1,IPIV2,JPIV2,ITMP; Int2 NOVPI,NOVPJ,NOVPJ2; Int2 I,I1,I2,I3,J,K1,K2,IR,IC,ICP1,L; VAR ZERO,PIV1,PIV2,TPIV,TMP,RM; #if MOIE VARPTR pS1i,pS1k2,pS1k1; VARPTR pS2i,pS2k2,pS2k1; VARPTR pA2__i1,pA2k1_i1,pA2ic_i1,pA2ipiv_i1,pA2ir_i1; VARPTR pA2__i2,pA2ipivli2; VARPTR pA1__i2,pA1k1_i2,pA1ipiv_i2; VARPTR pS1__i1,pS1ic_i1,pS1icli1,pS1ipivli1; VARPTR pS2__i1,pS2ic_i1,pS2icli1,pS2ipivli1; VAR wA2; int iw,jw; #endif ZERO = 0.0; NAM1 = NA-1; /* INITIALIZATION */ #if MOIE pS1i=mp->S1; pS2i=mp->S2; #endif for (I=0; IA2; pA2__i2=mp->A2+A2k; /* I2=I1+1 */ pA1__i2=mp->A1+A2k; /* ---'--- */ pS1__i1=mp->S1; pS2__i1=mp->S2; #endif for (I1=0; I1= PIV2) { IPR(IC,I1) = IPIV1; ITMP = ICF2(IC,I1); ICF2(IC,I1) = ICF2(JPIV1,I1); ICF2(JPIV1,I1) = ITMP; ITMP = ICF1(IC,I2); ICF1(IC,I2) = ICF1(JPIV1,I2); ICF1(JPIV1,I2) = ITMP; /* SWAPPING */ #if MOIE pS1icli1=pS1ic_i1; pS2icli1=pS2ic_i1; pS1ipivli1=pS1__i1+IPIV1; pS2ipivli1=pS2__i1+IPIV1; pA2ipiv_i1=pA2__i1+IPIV1; #endif for (L=0; L= IC) { #if MOIE iw=A2j*ICF2(L,I1); TMP=*(pA2ic_i1+iw); *(pA2ic_i1+iw)=*(pA2ipiv_i1+iw); *(pA2ipiv_i1+iw)= TMP; #else TMP=A2(IC,ICF2(L,I1),I1); A2(IC,ICF2(L,I1),I1)=A2(IPIV1,ICF2(L,I1),I1); A2(IPIV1,ICF2(L,I1),I1)= TMP; #endif } #if MOIE TMP = *pS2icli1; *pS2icli1 = *pS2ipivli1; *pS2ipivli1 = TMP; #else TMP = S2(IC,L,I1); S2(IC,L,I1) = S2(IPIV1,L,I1); S2(IPIV1,L,I1) = TMP; #endif #if MOIE pS1icli1+=S1j; pS2icli1+=S2j; pS1ipivli1+=S1j; pS2ipivli1+=S2j; #endif } /* Don't optimize - NCB is small (~2) */ for (L=0; L= IC) { #if MOIE iw=A2j*ICF2(L,I1); jw=A1j*ICF2(L,I1); TMP = *(pA2ic_i1+iw); *(pA2ic_i1+iw)=*(pA1ipiv_i2+jw); *(pA1ipiv_i2+jw) = TMP; #else TMP = A2(IC,ICF2(L,I1),I1); A2(IC,ICF2(L,I1),I1)=A1(IPIV2,ICF2(L,I1),I2); A1(IPIV2,ICF2(L,I1),I2) = TMP; #endif } #if MOIE TMP = *pS2icli1; *pS2icli1 = *pA2ipivli2; *pA2ipivli2 = TMP; pS2icli1+=S2j; pA2ipivli2+=A2j; #else TMP = S2(IC,L,I1); S2(IC,L,I1) = A2(IPIV2,L,I2); A2(IPIV2,L,I2) = TMP; #endif #if MOIE TMP = *pS1icli1; *pS1icli1 = S1(IPIV2,L,I2); S1(IPIV2,L,I2) = TMP; pS1icli1+=S1j; #else TMP = S1(IC,L,I1); S1(IC,L,I1) = S1(IPIV2,L,I2); S1(IPIV2,L,I2) = TMP; #endif } /* Don't optimize - NCB is small (~2) */ for (L=0; L PIV) { PIV=P; IPIV=I; JPIV=J; } } } *DET=*DET*E(IR(IPIV),IC(JPIV)); if (IPIV != JJ) *DET=-*DET; if (JPIV != JJ) *DET=-*DET; K=IR(JJ); IR(JJ)=IR(IPIV); IR(IPIV)=K; K=IC(JJ); IC(JJ)=IC(JPIV); IC(JPIV)=K; JJP1=JJ+1; for (L=JJP1; L PIV) { PIV=P; IPIV=I; JPIV=J; } } } KK=IR(JJ); IR(JJ)=IR(IPIV); IR(IPIV)=KK; KK=IC(JJ); IC(JJ)=IC(JPIV); IC(JPIV)=KK; JJP1=JJ+1; for (L=JJP1; L 1) { for (L=0; L=0; I--) { for (K=NOV-1; K>=0; K--) { for (L=0, SM=0.0; L 0) { SOL3(L,I-1)=SOL2(L,I); SOL1(L,I-1)=SOL1(L,I); } } } return 0; } #define X(i) MATRIXELEMX(mp,i) Entry(Int2) bvp_infpar(bvpMatrixPtr mp, Vector vp) { Int2 I,IR,J,NRAM,NRAPJ,IRP1,IRFIR,NOVPJ,NOVPIR,J1,ICFNOVPIR,ICFJ1; VAR SM; /* DETERMINE THE "LOCAL" VARIABLES BY BACKSUBSTITUTION */ NRAM=NRA-NOV; /* BACKSUBSTITUTE PROCESS IN THE CONDENSATION OF PARAMETERS */ for (I=0; I=0; IR--) { IRP1=IR+1; IRFIR=IRF(IR,I); for (J=0, SM=0.0; JScalProd(a,a)/(NTST*NCOL)); if (s>=1.0) s=1.0; return s; } Entry(void) bvp_setzero(bvpMatrixPtr mp, Vector vp) { Int2 I,J; for (I=0; I