找回密码
 注册
查看: 1456|回复: 0

求解非线性方程组

[复制链接]
发表于 2003-6-10 05:51:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
c                                                                     
c TENSOLVE:  A Software Package for Solving Systems of Nonlinear
c            Equations and Nonlinear Least Squares Problems Using
c            Tensor Methods.
c
c AUTHORS:   Ali Bouaricha                                         
c            Argonne National Laboratory   
c            MCS Division                                               
c            e-mail: bouarich@mcs.anl.gov                              
c AND                                                                  
c            Robert B. Schnabel                                         
c            University of colorado at Boulder                          
c            Department of computer Science                             
c            e-mail: bobby@cs.colorado.edu                              
c                                                                        
c DATE:      February, 1994                                             
c                                                                        
c Purpose of Tensolve:
c                                                                        
c       TENSOLVE finds roots of systems of n nonlinear equations in n
c       unknowns, or minimizers of the sum of squares of m > n nonlinear
c       equations in n unknowns.  It allows the user to choose between
ca tensor method based on a quadratic model and a standard method
cbased on a linear model. Both models calculate an analytic or
c       finite-difference Jacobian matrix at each iteration.  The tensor
c       method augments the linear model with a low-rank, second-order
c       term that is chosen so that the model is hardly more expensive
c       to form, store, or solve than the standard linear model.  Either
c       a line search or trust-region step-selection strategy may be
c       selected.  The tensor method is significantly more efficient
c       than the standard method in iterations, function evaluations, and
c       time.  It is especially useful on problems where the Jacobian at
c       the solution is singular.
c       The software can be called with an interface where the user
c       supplies only the function, number of nonlinear equations, number
c       of variables, and starting point; default choices are made for
c       all the other input parameters.  An alternative interface allows
c       the user to specify any input parameters that are different from
c       the defaults.
c      
c List of subroutine and function names called by TENSOLVE:
c
c TS2DTR,TSBSLV,TSCHKI,TSCHKJ,TSCPMU,TSCPSS,TSD1SV,TSDFCN,TSDFLT,TSDUMJ,
c TSFAFA,TSFDFJ,TSFRMT,TSFSCL,TSFSLV,TSJMUV,TSJQTP,TSLMIN,TSLMSP,TSLSCH,
c TSMAFA,TSMDLS,TSMFDA,TSMFDV,TSMGSA,TSMSDA,TSMSDV,TSMSLV,TSNECI,TSNESI,
c TSNESV,TSNSTP,TSPRMV,TSRSLT,TSQ1P1,TSQFCN,TSQLFC,TSQMLV,TSQMTS,TSQMUV,
c TSQRFC,TSRSID,TSSCLF,TSSCLJ,TSSCLX,TSSLCT,TSSMIN,TSSMRD,TSSQP1,TSSSTP,
c TSSTMX,TSTRUD,TSUDQV,TSUNSF,TSUNSX,TSUPSF,TSUTMD.
c
c Packages called by TENSOLVE:
c
c UNCMIN (R. B. Schnabel, J. E. Koontz, and B. E. Weiss,
c "A Modular System of Algorithms of Unconstrained Minimization",
c Acm Trans. Math. Softw., 11 (1985), 419-440).
c
c BLAS called by TENSOLVE:
c
c LEVEL 1 BLAS: DASUM,DAXPY,DCOPY,DDOT,DNRM2,DLOAD,DSCAL,DSWAP,IDAMAX
c LEVEL 2 BLAS: DGEMV
c
c Parameters and Default Values:
c ==============================
c
c Following each variable name in the list below appears a one- or
c two-headed arrow symbol of the form ->, <-, and <-->.
c These symbols signify that the variable is for input, output, and
c input-output, respectively.
c The symbol EPSM in some parts of this section designates the machine
c precision.
c MAXM->: A positive integer specifying the row dimension of the work
c array WRKNEM in the user's calling program. It must satisfy
c MAXM >= M+N+2. The provision of MAXM, MAXN, and PMAX allows
c the user the flexibility of solving several problems with different
c values of M and N one after the other, with the same work arrays.
c MAXN->: A positive integer specifying the row dimension of the work
c array WRKNEN in the user's calling program. It must satisfy
c MAXN >= N+2.  
c PMAX->: A positive integer specifying the row dimension of the work
c array WRKUNC in the user's calling program.  It must satisfy
c PMAX >= NINT(sqrt(N)), where NINT is a function that rounds to the
c nearest integer.
c X0->: An array of length N that contains an initial estimate
c of the solution x*.
c M->: A positive integer specifying the number of nonlinear equations.
c N->: A positive integer specifying the number of variables in the
c problem.  
c TYPX->:  An array of length N in which the typical size of the
C components of X is specified. The typical component sizes should be
c positive real scalars. If a negative value is specified, its absolute
c value will be used. If 0.0 is specified, 1.0 will be used. This
c vector is used to determine the scaling matrix, Dx. Although the
c package may work reasonably well in a large number of instances without
c scaling, it may fail when the components of x* are of radically
c different magnitude and scaling is not invoked. If the sizes
c of the parameters are known to differ by many orders of magnitude, then
c the scale vector TYPX should definitely be used. For example, if
c it is anticipated that the range of values for the iterates xk would be
c                   x1 in [-10e+10,10e+10]
c                   x2 in [-10e+2,10e+4]
c                   x3 in [-6*10e-6,9*10e-6]
c then an appropriate choice would be TYPX = (1.0e+10,1.0e+3,7.0e-6).
c Module TSDFLT returns TYPX = (1.0,...,1.0).  
c TYPF->: An array of length M in which the typical size of the components
c of F is specified. The typical component sizes should be positive real
c scalars.  If a negative value is specified, its absolute value will be
c used. If 0.0 is specified, 1.0 will be used. This vector is used to
c determine the scaling matrix DF. TYPF should be chosen so that all
c the components of DF(x) have similar typical magnitudes at points not
c too near a root, and should be chosen in conjunction with FTOL.  It is
c important to supply values of TYPF when the magnitudes of the components
c of F(x) are expected to be very different.  If the magnitudes of the
c components of F(x) are similar, the choice DF = I suffices.  Module
c TSDFLT returns TYPF = (1.0,...,1.0).  
c ITNLIM->:  Positive integer specifying the maximum number of iterations
c to be performed before the program is terminated. Module TSDFLT returns
c ITNLIM = 150. If the user specifies ITNLIM <= 0, the module TSCHKI will
c supply the value 150.
c JACFLG->: Integer designating whether or not an analytic Jacobian has
c been supplied by the user.
c JACFLG = 0 : No analytic Jacobian supplied.  The Jacobian is obtained
c by finite differences.
c JACFLG = 1 : Analytic Jacobian supplied.
c The module TSDFLT returns the value 0.  If the user specifies an illegal
c value, the module TSCHKI will supply the value 0.  
c GRADTL->: Positive scalar giving the tolerance at which the scaled
c gradient of f(x) = 0.5*F(x)-trans*F(x) is considered close enough to
c zero to terminate the algorithm. The scaled gradient is a measure of
c the relative change in F in each direction xj divided by the relative
c change in xj. The module TSDFLT returns the value EPSM**(1/3).  If the
c user specifies a negative value, the module TSCHKI will supply
c the value EPSM**(1/3).
c STEPTL->: A positive scalar providing the minimum allowable relative
c step length. STEPTL should be at least as small as 10**(-d), where d
c is the number of accurate digits the user desires in the solution x*.
c The program may terminate prematurely if STEPTL is too large.  Module
c TSDFLT returns the value EPSM**(2/3).  If the user specifies a negative
c value, the module TSCHKI will supply the value EPSM**(2/3).
c FTOL->: A positive scalar giving the tolerance at which the scaled
c function DF*F(x) is considered close enough to zero to terminate the
c algorithm. The program is halted if ||DF*F(x)|| (in the infinity norm)
c is <= FTOL. This is the primary stopping condition for nonlinear
c equations; the values of TYPF and FTOL should be chosen so that this
c test reflects the user's idea of what constitutes a solution to the
c problem. The module TSDFLT returns the value EPSM**(2/3). If the
c user specifies a negative value, the module TSCHKI will supply the
c value EPSM**(2/3).
c METHOD->: An integer designating which method to use.
c METHOD = 0 : Newton or Gauss-Newton algorithm is used.
c METHOD = 1 : Tensor algorithm is used.  
c Module TSDFLT returns value 1. If the user specifies an illegal value,
c module TSCHKI will reset METHOD to 1.
c GLOBAL->: An integer designating which global strategy to use.
c GLOBAL = 0 : Line search is used.
c GLOBAL = 1 : Two-dimensional trust region is used.
c Module TSDFLT returns value of 0. If the user specifies an illegal
c value, module TSCHKI will reset GLOBAL to 0.
c STEPMX->: A positive scalar providing the maximum allowable scaled step
c length ||Dx*(x+ - xc)||2, where Dx = diag(1/TYPX_j). STEPMX is used to
c prevent steps that would cause the nonlinear equations problem to
c overflow, and to prevent the algorithm from leaving the area of
c interest in parameter space.  STEPMX should be chosen small enough
c to prevent these occurrences but should be larger than any anticipated
c "reasonable" step. Module TSDFLT returns the value STEPMX = 10e+3.
c If the user specifies a nonpositive value, module TSCHKI sets STEPMX
c to 10e+3.
c DLT->: A positive scalar giving the initial trust region radius. When
c the line search strategy is used, this parameter is ignored. For the
c trust region algorithm, if DLT is supplied, its value should reflect
c what the user considers a maximum reasonable scaled step length at
c the first iteration. If DLT = -1.0, the routine uses the length of
c the Cauchy step at the initial iterate instead. The module TSDFLT
c returns the value -1.0. If the user specifies a nonpositive value,
c module TSCHKI sets DLT = -1.0.
c IPR->: The unit on which the package outputs information. TSDFLT returns
c the value 6.
c WRKUNC->: Workspace used by UNCMIN. The user must declare this
c array to have dimensions PMAX*LUNC in the calling routine.
c LUNC->: A positive integer specifying the column dimension of the work
c array WRKUNC in the user's calling program. It must satisfy
c LUNC >= 2*NINT(sqrt(N))+4.
c WRKNEM->: Workspace used to store the Jacobian matrix, the function
c values matrix FV, the tensor matrix ANLS, and working vectors. The
c user must declare this array to have dimensions MAXM*LNEM in the
c calling routine.  
c LNEM->: A positive integer specifying the column dimension of the work
c array WRKNEM in the user's calling program. It must satisfy
c LNEM >= N+2*NINT(sqrt(N))+11.
c WRKNEN->: Workspace used to store the matrix S of previous
c directions, the matrix SHAT of linearly independent directions, and
c working vectors. The user must declare this array to have dimensions
c MAXN*LNEN in the calling routine.
c LNEN->: A positive integer specifying the column dimension of the work
c array WRKNEN in the user's calling program. It must satisfy
c LNEN >= 2*NINT(sqrt(N))+9.
c IWRKN->: Workspace used to store the integer working vectors. The user
c must declare this array to have dimensions at least MAXN*LIN in the
c calling routine.
c LIN->: A positive integer specifying the column dimension of the work
c array IWRKN in the user's calling program. It must satisfy
c LIN >= 3.
c TSANJA->: The name of a user-supplied subroutine that evaluates the first
c derivative (Jacobian) of the function F(x). The subroutine must be
c declared EXTERNAL in the user's program and must conform to the usage
c                      CALL TSANJA(JAC, X, MAXM, M, N)
c where X is a vector of length N and the 2-dimensional array JAC of row
c dimension MAXM and column dimension N is the analytic Jacobian of F at
c X. When using the interface TSNECI, if no analytic Jacobian is supplied
c (JACFLG = 0), the user must use the dummy name TSDUMJ as the value of
c this parameter.
c TSFVEC->: The name of a user-supplied subroutine that evaluates the
c function F at an arbitrary vector X.  The subroutine must
c be declared EXTERNAL in the user's calling program and must conform
c to the usage
c                      CALL TSFVEC(X, F, M, N),
c where X is a vector of length N and F is a vector of length M. The
c subroutine must not alter the values of X.
c MSG<-->: An integer variable that the user may set on input to inhibit
c certain automatic checks or to override certain default characteristics
c of the package. (For the short call it should be set to 0.) There are
c four "message" features that can be used individually or in combination
c as discussed below.
c MSG = 0 : Values of input parameters, final results, and termination code
c are printed.
c MSG = 2 : Do not check user's analytic Jacobian routine against its
c finite difference estimate.  This may be necessary if the user knows the
c Jacobian is properly coded, but the program aborts because the comparative
c tolerance is too tight.  Do not use MSG = 2 if the analytic acobian is
c not supplied.
c MSG = 8 : Suppress printing of the input state, the final results, and
c the stopping condition.
c MSG = 16 : Print the intermediate results; that is, the input state,
c each iteration including the current iterate xk, 0.5*||DF*F(xk)||2**2,
c and grad(f(x)) = J(x)-trans*DF**2 F(x), and the final results including
c the stopping conditions.
c The user may specify a combination of features by setting MSG to
c the sum of the individual components. The module TSDFLT returns a value
c of 0. On exit, if the program has terminated because of erroneous
c input, MSG contains an error code indicating the reason.
c MSG = 0   : No error.
c MSG = -1  : Illegal dimension, M <= 0.
c MSG = -2  : Illegal dimension, N <= 0.
c MSG = -3  : Illegal dimension, MAXM < M+N+2.  
c MSG = -4  : Illegal dimension, MAXN < N+2.  
c MSG = -5  : Illegal dimension, PMAX < NINT(sqrt(N)).
c MSG = -6  : Illegal dimension, LUNC < 2*NINT(sqrt(N))+4.
c MSG = -7  : Illegal dimension, LNEM < N+2*NINT(sqrt(N))+11.
c MSG = -8  : Illegal dimension, LNEN < 2*NINT(sqrt(N))+9.
c MSG = -9  : Illegal dimension, LIN  < 3.
c MSG = -10 : Program asked to override check of analytic Jacobian
c against finite difference estimate, but routine TSANJA not
c supplied (incompatible input).
c MSG = -11  : Probable coding error in the user's analytic Jacobian
c routine TSANJA. Analytic and finite difference Jacobian do not agree
c within the assigned tolerance.
c XP<-: An array of length N containing the best approximation
c to the solution x*. (If the algorithm has not converged, the final
c iterate is returned).
c FP<-: An array of length M containing the function value F(XP).
c GP<-: An array of length N containing the gradient of the
c function 0.5*||F(x)||2**2 at XP.
c TERMCD<-:  An integer specifying the reason for termination.
c TERMCD = 0 : No termination criterion satisfied (occurs if package
c terminates because of illegal input).
c TERMCD = 1 : function tolerance reached.  The current iteration is
c probably a solution.
c TERMCD = 2 : gradient tolerance reached.  For nonlinear least
c squares, the current iteration is probably a solution; for nonlinear
c equations, it could be a solution or a local minimizer.
c TERMCD = 3 : Successive iterates within step tolerance.  The
c current iterate may be a solution, or the algorithm is making very slow
c progress and is not near a solution.
c TERMCD = 4 : Last global step failed to locate a point lower
c than XP. It is likely that either XP is an approximate solution
c of the problem or STEPTL is too large.
c TERMCD = 5 : Iteration limit exceeded.
c TERMCD = 6 : Five consecutive steps of length STEPMX have been taken.
        SUBROUTINE TS2DTR(AJA,SHAT,ANLS,DT,G,GBAR,XC,FC,METHOD,NWTAKE,  TS2DTR
     +                    STEPMX,STEPTL,EPSM,MXTAKE,DLT,FQ,MAXM,MAXN,   TS2DTR
     +                    M,N,P,CURPOS,PIVOT,PBAR,ITN,IERR,FLAG,DXN,    TS2DTR
     +                    DFN,TSFVEC,D,XPLSP,ADT,AG,TEMP,VN,VNP,VNS,    TS2DTR
     +                    WRK1,CONST1,CONST2,FNORM,XPLS,FP,FPLS,RETCD)  TS2DTR
                                                                        TS2DTR
        INTEGER MAXM,MAXN,M,N,P,ITN,METHOD,IERR,FLAG                    TS2DTR
        DOUBLE PRECISION STEPMX,STEPTL,EPSM,DLT,FPLS                    TS2DTR
        INTEGER CURPOS(N),PIVOT(N),PBAR(N),RETCD                        TS2DTR
        DOUBLE PRECISION DT(N),G(N),GBAR(N),XC(N),FC(M)                 TS2DTR
        DOUBLE PRECISION XPLS(N),FP(M),XPLSP(N),AJA(MAXM,N),D(M)        TS2DTR
        DOUBLE PRECISION TEMP(M),SHAT(MAXN,P),ANLS(MAXM,P),VNS(M)       TS2DTR
        DOUBLE PRECISION VN(M),VNP(M),FQ(M),DXN(N),DFN(M)               TS2DTR
        DOUBLE PRECISION ADT(N),AG(N),WRK1(M),CONST1(P),CONST2(P)       TS2DTR
        LOGICAL NWTAKE,MXTAKE                                           TS2DTR
                                                                        TS2DTR
C********************************************************************** TS2DTR
C THIS ROUTINE FINDS A NEXT ITERATE BY A 2-DIMENSIONAL TRUST REGION.    TS2DTR
C********************************************************************** TS2DTR
C                                                                       TS2DTR
C                                                                       TS2DTR
C       INPUT PARAMETERS :                                              TS2DTR
C       -----------------                                               TS2DTR
C                                                                       TS2DTR
C       AJA    : JACOBIAN AT THE CURRENT ITERATE                        TS2DTR
C       SHAT   : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS         TS2DTR
C                AFTER A QL FACTORIZATION                               TS2DTR
C       ANLS   : TENSOR TERM MATRIX                                     TS2DTR
C       DT     : CURRENT STEP                                           TS2DTR
C       G      : GRADIENT AT CURRENT ITERATE                            TS2DTR
C       GBAR   : STEEPEST DESCENT DIRECTION (= -G)                      TS2DTR
C       XC     : CURRENT ITERATE                                        TS2DTR
C       FC     : FUNCTION VALUE AT CURRENT ITERATE                      TS2DTR
C       METHOD : METHOD TO USE                                          TS2DTR
C                  =  0  : STANDARD METHOD USED                         TS2DTR
C                  =  1  : TENSOR METHOD USED                           TS2DTR
C       NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS:          TS2DTR
C                NWTAKE  =  .TRUE.  : STANDARD STEP TAKEN               TS2DTR
C                NWTAKE  =  .FALSE. : TENSOR STEP TAKEN                 TS2DTR
C       STEPMX : MAXIMUM STEP ALLOWED                                   TS2DTR
C       STEPTL : STEP TOLERANCE                                         TS2DTR
C       EPSM   : MACHINE PRECISION                                      TS2DTR
C       MXTAKE : BOOLEAN FLAG INDICATING STEP OF MAXIMUM LENGTH USED    TS2DTR
C       FQ     : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY        TS2DTR
C                ORTHOGONAL MATRICES                                    TS2DTR
C       MAXM   : LEADING DIMENSION OF AJA AND ANLS                      TS2DTR
C       MAXN   : LEADING DIMENSION OF SHAT                              TS2DTR
C       M,N    : DIMENSIONS OF PROBLEM                                  TS2DTR
C       P      : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS         TS2DTR
C       CURPOS : PIVOT VECTOR (USED DURING THE FACTORIZATION OF THE     TS2DTR
C                JACOBIAN FROM COLUMN 1 TO N-P)                         TS2DTR
C       PIVOT  : PIVOT VECTOR ( USED DURING THE FACTORIZATION OF THE    TS2DTR
C                JACOBIAN FROM COLUMN N-P+1 TO N)                       TS2DTR
C       PBAR   : PIVOT VECTOR (USED DURING THE FACTORIZATION OF THE     TS2DTR
C                JACOBIAN IF IT IS SINGULAR                             TS2DTR
C       FNORM  :  0.5 * || FC ||**2                                     TS2DTR
C       ITN    : ITERATION NUMBER                                       TS2DTR
C       IERR   : RETURN CODE FROM THE QRP FACTORIZATION ROUTINE:        TS2DTR
C                IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED         TS2DTR
C                IERR = 1 : SINGULARITY OF JACOBIAN DETECTED            TS2DTR
C       FLAG   : RETURN CODE WITH THE FOLLOWING MEANINGS :              TS2DTR
C                FLAG  =  0 : NO SINGULARITY DETECTED DURING            TS2DTR
C                             FACTORIZATION OF THE JACOBIAN FROM        TS2DTR
C                             COLUMN 1 TO N                             TS2DTR
C                FLAG  =  1 : SINGULARITY DETECTED DURING FACTORIZATION TS2DTR
C                           OF THE JACOBIAN FROM COLUMN 1 TO N-P        TS2DTR
C                FLAG  =  2 : SINGULARITY DETECTED DURING FACTORIZATION TS2DTR
C                           OF THE JACOBIAN FROM COLUMN N-P+1 TO N      TS2DTR
C        DXN   : DIAGONAL SCALING MATRIX FOR X                          TS2DTR
C        DFN   : DIAGONAL SCALING MATRIX FOR F                          TS2DTR
C        TSFVEC  : SUBROUTINE TO EVALUATE THE USER'S FUNCTION           TS2DTR
C        D,XPLSP,ADT,AG,TEMP,VN,VNP,VNS : WORKING VECTORS               TS2DTR
C        WRK1,CONST1,CONST2,X: WORKING VECTORS                          TS2DTR
C                                                                       TS2DTR
C       INPUT-OUTPUT PARAMETERS :                                       TS2DTR
C       ------------------------                                        TS2DTR
C                                                                       TS2DTR
C       DLT    : INITIAL TRUST RADIUS (= -1.0D0) IF IT IS NOT SUPPLIED  TS2DTR
C                BY THE USER ON ENTRY AND CURRENT TRUST RADIUS ON EXIT  TS2DTR
C                                                                       TS2DTR
C       OUTPUT PARAMETERS :                                             TS2DTR
C       -------------------                                             TS2DTR
C                                                                       TS2DTR
C       FNORM  : NORM OF THE FUNCTION VALUE AT CURRENT ITERATE          TS2DTR
C       XPLS   : NEXT ITERATE                                           TS2DTR
C       FP     : FUNCTION VALUE AT NEXT ITERATE                         TS2DTR
C       FPLS   : 0.5 * || FP ||**2                                      TS2DTR
C       RETCD  :  RETURN CODE FROM SUBROUTINE   (SEE SUBROUTINE TSTRUD  TS2DTR
C                 FOR MEANING )                                         TS2DTR
C                                                                       TS2DTR
C       SUBPROGRAMS CALLED:                                             TS2DTR
C                                                                       TS2DTR
C       LEVEL 1 BLAS  ...  DAXPY,DCOPY,DDOT,DNRM2,DSCAL                 TS2DTR
C       TENSOLVE      ...  TSPRMV,TSUTMD,TSJMUV,TSUDQV,TSSMIN,TSRSID,   TS2DTR
C       TENSOLVE      ...  TSTRUD                                       TS2DTR
C                                                                       TS2DTR
C***********************************************************************TS2DTR
                                                                        TS2DTR
        INTEGER I                                                       TS2DTR
        DOUBLE PRECISION FNORM,RES,ALPH,SUM,RESG,OPTIM                  TS2DTR
        DOUBLE PRECISION SCRES,FPLSP,RRES,RRESG                         TS2DTR
        DOUBLE PRECISION DNRM2,DDOT                                     TS2DTR
        DOUBLE PRECISION ZERO,HALF,ONE                                  TS2DTR
        LOGICAL DTAKEN                                                  TS2DTR
        INTRINSIC SQRT                                                  TS2DTR
        EXTERNAL TSFVEC                                                 TS2DTR
        DATA ZERO,HALF,ONE/0.0D0,0.50D0,1.0D0/                          TS2DTR
                                                                        TS2DTR
        DTAKEN = .FALSE.                                                TS2DTR
        RETCD = 4                                                       TS2DTR
        IF(DLT.EQ.-ONE) THEN                                            TS2DTR
                                                                        TS2DTR
c set DLT to length of Cauchy step                                      TS2DTR
                                                                        TS2DTR
          ALPH = DNRM2(N,G,1)                                           TS2DTR
          ALPH = ALPH**2                                                TS2DTR
          CALL TSPRMV(VN,G,PIVOT,N,1)                                   TS2DTR
          IF(IERR.EQ.0) THEN                                            TS2DTR
             CALL TSUTMD(AJA,VN,MAXM,M,N,VNP)                           TS2DTR
          ELSE                                                          TS2DTR
             CALL TSPRMV(VNS,VN,PBAR,N,1)                               TS2DTR
             CALL TSUTMD(AJA,VNS,MAXM,M+N,N,VNP)                        TS2DTR
          ENDIF                                                         TS2DTR
          DLT = ALPH*SQRT(ALPH)/DNRM2(N,VNP,1)**2                       TS2DTR
          IF(DLT.GT.STEPMX) THEN                                        TS2DTR
             DLT = STEPMX                                               TS2DTR
          ENDIF                                                         TS2DTR
        ENDIF                                                           TS2DTR
                                                                        TS2DTR
c form an orthonormal basis for the two-dimensional subspace            TS2DTR
                                                                        TS2DTR
        CALL DCOPY(N,G,1,GBAR,1)                                        TS2DTR
        CALL DSCAL(N,-ONE,GBAR,1)                                       TS2DTR
        RES = DNRM2(N,DT,1)                                             TS2DTR
        SUM = -DDOT(N,GBAR,1,DT,1)/RES**2                               TS2DTR
        CALL DAXPY(N,SUM,DT,1,GBAR,1)                                   TS2DTR
        RESG = DNRM2(N,GBAR,1)                                          TS2DTR
        IF(RESG.GT.ZERO) THEN                                           TS2DTR
           RRESG = ONE/RESG                                             TS2DTR
           CALL DSCAL(N,RRESG,GBAR,1)                                   TS2DTR
        ENDIF                                                           TS2DTR
        RRES = ONE/RES                                                  TS2DTR
        CALL DSCAL(N,RRES,DT,1)                                         TS2DTR
                                                                        TS2DTR
c compute Jacobian times DT                                             TS2DTR
                                                                        TS2DTR
        CALL TSJMUV(ITN,METHOD,DT,CURPOS,PIVOT,PBAR,AJA,SHAT,           TS2DTR
     +              FLAG,IERR,MAXM,MAXN,M,N,P,D,TEMP,VN,ADT)            TS2DTR
                                                                        TS2DTR
c compute Jacobian times GBAR                                           TS2DTR
                                                                        TS2DTR
        CALL TSJMUV(ITN,METHOD,GBAR,CURPOS,PIVOT,PBAR,AJA,SHAT,         TS2DTR
     +              FLAG,IERR,MAXM,MAXN,M,N,P,D,TEMP,VNP,AG)            TS2DTR
                                                                        TS2DTR
        IF(.NOT. NWTAKE) THEN                                           TS2DTR
                                                                        TS2DTR
c compute SHAT times VN                                                 TS2DTR
                                                                        TS2DTR
            CALL TSUDQV(SHAT,VN,MAXN,N,P,CONST1)                        TS2DTR
                                                                        TS2DTR
c compute SHAT times VNP                                                TS2DTR
                                                                        TS2DTR
            CALL TSUDQV(SHAT,VNP,MAXN,N,P,CONST2)                       TS2DTR
        ENDIF                                                           TS2DTR
                                                                        TS2DTR
                                                                        TS2DTR
70     CONTINUE                                                        TS2DTR
                                                                        TS2DTR
c normalize DT                                                          TS2DTR
                                                                        TS2DTR
        IF(RES.LE.DLT) THEN                                             TS2DTR
           DTAKEN = .TRUE.                                              TS2DTR
           DO 80 I = 1,N                                                TS2DTR
              D(I) = DT(I)*RES                                          TS2DTR
80        CONTINUE                                                     TS2DTR
           DLT = RES                                                    TS2DTR
                                                                        TS2DTR
        ELSE                                                            TS2DTR
                                                                        TS2DTR
c find the global minimizer of one-variable function in the             TS2DTR
c interval (-dlt, dlt)                                                  TS2DTR
                                                                        TS2DTR
           CALL TSSMIN(ANLS,FQ,ADT,AG,CONST1,CONST2,DLT,MAXM,M,N,       TS2DTR
     +                P,NWTAKE,IERR,EPSM,VN,VNP,VNS,OPTIM)              TS2DTR
                                                                        TS2DTR
c compute the global step                                               TS2DTR
                                                                        TS2DTR
           DO 90 I = 1,N                                                TS2DTR
              D(I) = OPTIM*DT(I)+SQRT(DLT**2-OPTIM**2)*GBAR(I)          TS2DTR
90        CONTINUE                                                     TS2DTR
                                                                        TS2DTR
        ENDIF                                                           TS2DTR
                                                                        TS2DTR
c compute the tensor model residual                                     TS2DTR
                                                                        TS2DTR
        CALL TSRSID(ITN,METHOD,FQ,D,CURPOS,PIVOT,PBAR,AJA,ANLS,         TS2DTR
     +              SHAT,FLAG,NWTAKE,IERR,MAXM,MAXN,M,N,P,WRK1,VN,      TS2DTR
     +              VNP,VNS,SCRES)                                      TS2DTR
                                                                        TS2DTR
c check whether the global step is acceptable                           TS2DTR
                                                                        TS2DTR
        CALL TSTRUD(M,N,XC,FNORM,G,D,DTAKEN,STEPMX,STEPTL,DLT,          TS2DTR
     +              MXTAKE,DXN,DFN,TSFVEC,SCRES,RETCD,XPLSP,FPLSP,      TS2DTR
     +              TEMP,XPLS,FP,FPLS)                                  TS2DTR
                                                                        TS2DTR
        IF(RETCD.GE.2) GO TO 70                                         TS2DTR
                                                                        TS2DTR
       END                                                              TS2DTR
       SUBROUTINE TSBSLV(R,NR,M,N,B,Y)                                  TSBSLV
                                                                        TSBSLV
       INTEGER NR,M,N                                                   TSBSLV
       DOUBLE PRECISION R(NR,N),B(N),Y(N)                               TSBSLV
                                                                        TSBSLV
C*********************************************************************  TSBSLV
C THIS ROUTINE DOES A BACKWARD SOLVE.                                   TSBSLV
C*********************************************************************  TSBSLV
C                                                                       TSBSLV
C       INPUT PARAMETERS :                                              TSBSLV
C       -----------------                                               TSBSLV
C                                                                       TSBSLV
C       R  : UPPER TRIANGULAR MATRIX OBTAINED FROM A QR FACTORIZATION   TSBSLV
C            OF AN M BY N MATRIX A. DIAG(R) IS STORED IN ROW M+2. THIS  TSBSLV
C            IS THE STORAGE SCHEME USED IN STEWART, G. W., III(1973)    TSBSLV
C            "INTRODUCTION TO MATRIX COMPUTATION", ACADEMIC PRESS,      TSBSLV
C             NEW YORK                                                  TSBSLV
C       NR : LEADING DIMENSION OF MATRIX A                              TSBSLV
C       M  : ROW DIMENSION OF MATRIX A                                  TSBSLV
C       N  : COLUMN DIMENSION OF MATRIX A                               TSBSLV
C       B  : RIGHT HAND SIDE                                            TSBSLV
C                                                                       TSBSLV
C       OUTPUT PARAMETERS :                                             TSBSLV
C       -----------------                                               TSBSLV
C                                                                       TSBSLV
C       Y :  VECTOR SOLUTION ON EXIT                                    TSBSLV
C                                                                       TSBSLV
C       SUBPROGRAMS CALLED:                                             TSBSLV
C                                                                       TSBSLV
C       LEVEL 1 BLAS  ...  DAXPY,DLOAD                                  TSBSLV
C                                                                       TSBSLV
C*********************************************************************  TSBSLV
                                                                        TSBSLV
       INTEGER J                                                        TSBSLV
       DOUBLE PRECISION ZERO                                            TSBSLV
       DATA ZERO/0.0D0/                                                 TSBSLV
                                                                        TSBSLV
c solve R Y = B                                                         TSBSLV
                                                                        TSBSLV
       Y(N) = B(N) / R(M+2,N)                                           TSBSLV
                                                                        TSBSLV
       IF(N .GT. 2) THEN                                                TSBSLV
          CALL DLOAD(N-1,ZERO,Y,1)                                      TSBSLV
          DO 20 J = N-1,2,-1                                            TSBSLV
             CALL DAXPY(J,Y(J+1),R(1,J+1),1,Y,1)                        TSBSLV
             Y(J) = (B(J)-Y(J))/R(M+2,J)                                TSBSLV
20       CONTINUE                                                      TSBSLV
          Y(1) = Y(1) + R(1,2) * Y(2)                                   TSBSLV
          Y(1) = (B(1) - Y(1)) / R(M+2,1)                               TSBSLV
       ELSEIF(N .EQ. 2) THEN                                            TSBSLV
          Y(1) = (B(1) - (R(1,2) * Y(2))) / R(M+2,1)                    TSBSLV
       ENDIF                                                            TSBSLV
                                                                        TSBSLV
       RETURN                                                           TSBSLV
       END                                                              TSBSLV
       SUBROUTINE TSCHKI(MAXM,MAXN,MAXP,M,N,LUNC,LNEM,LNEN,LIN,GRADTL,  TSCHKI
     +                   STEPTL,FTOL,ITNLIM,JACFLG,METHOD,GLOBAL,       TSCHKI
     +                   STEPMX,DLT,EPSM,MSG,TYPX,TYPF,DXN,DFN,         TSCHKI
     +                   SQRN,TERMCD,IPR)                               TSCHKI
                                                                        TSCHKI
       INTEGER MAXM,MAXN,MAXP,M,N,LUNC,LNEM,LNEN,LIN,IPR,MSG,JACFLG     TSCHKI
       INTEGER METHOD,GLOBAL,ITNLIM,SQRN,TERMCD                         TSCHKI
       DOUBLE PRECISION GRADTL,STEPTL,FTOL,STEPMX,DLT,EPSM              TSCHKI
       DOUBLE PRECISION TYPX(N),TYPF(M),DXN(N),DFN(M)                   TSCHKI
                                                                        TSCHKI
C*********************************************************************  TSCHKI
C THIS ROUTINE CHECKS INPUT FOR REASONABLENESS.                         TSCHKI
C*********************************************************************  TSCHKI
C                                                                       TSCHKI
C       INPUT PARAMETERS :                                              TSCHKI
C       -----------------                                               TSCHKI
C                                                                       TSCHKI
C       MAXM : LEADING DIMENSION OF WORKSPACE WRKNEM (SEE TSNECI)       TSCHKI
C       MAXN : LEADING DIMENSION OF WORKSPACE WRKNEN (SEE TSNECI)       TSCHKI
C       MAXP : LEADING DIMENSION OF WORKSPACE WRKUNC (SEE TSNECI)       TSCHKI
C       M,N  : DIMENSIONS OF PROBLEM                                    TSCHKI
C       IPR  : DEVICE TO WHICH TO SEND OUTPUT                           TSCHKI
C                                                                       TSCHKI
C       INPUT-OUTPUT PARAMETERS :                                       TSCHKI
C       ------------------------                                        TSCHKI
C                                                                       TSCHKI
C       GRADTL : TOLERANCE AT WHICH GRADIENT CONSIDERED CLOSE           TSCHKI
C                ENOUGH TO ZERO TO TERMINATE ALGORITHM                  TSCHKI
C       STEPTL : TOLERANCE AT WHICH SUCCESSIVE ITERATES                 TSCHKI
C                CONSIDERED CLOSE ENOUGH TO TERMINATE ALGORITHM         TSCHKI
C       FTOL   : TOLERANCE AT WHICH FUNCTION VALUE CONSIDERED           TSCHKI
C                CLOSE ENOUGH TO ZERO                                   TSCHKI
C       ITNLIM : MAXIMUM NUMBER OF ALLOWABLE ITERATIONS                 TSCHKI
C       STEPMX : MAXIMUM STEP ALLOWED IN TRUST REGION                   TSCHKI
C       DLT    : TRUST RADIUS                                           TSCHKI
C       JACFLG : JACOBIAN FLAG WITH THE FOLLOWING MEANINGS :            TSCHKI
C                JACFLG = 1 : ANALYTIC JACOBIAN SUPPLIED                TSCHKI
C                JACFLG = 0 : ANALYTIC JACOBIAN NOT SUPPLIED            TSCHKI
C       METHOD : METHOD TO USE                                          TSCHKI
C                METHOD = 0 : STANDARD METHOD IS USED                   TSCHKI
C                METHOD = 1 : TENSOR METHOD IS USED                     TSCHKI
C       GLOBAL : GLOBAL STRATEGY USED                                   TSCHKI
C                GLOBAL = 0 : LINE SEARCH USED                          TSCHKI
C                GLOBAL = 1 : 2-DIMENSIONAL TRUST REGION USED           TSCHKI
C       TYPX   : TYPICAL SIZE FOR EACH COMPONENT OF X                   TSCHKI
C       TYPF   : TYPICAL SIZE FOR EACH COMPONENT OF F                   TSCHKI
C       MSG    : MESSAGE TO INHIBIT CERTAIN AUTOMATIC CHECKS + OUTPUT   TSCHKI
C                                                                       TSCHKI
C       OUTPUT PARAMETERS :                                             TSCHKI
C       -------------------                                             TSCHKI
C                                                                       TSCHKI
C       TERMCD: TERMINATION CODE                                        TSCHKI
C       DXN   : DIAGONAL SCALING MATRIX FOR X                           TSCHKI
C       DFN   : DIAGONAL SCALING MATRIX FOR F                           TSCHKI
C       SQRN  : MAXIMUM COLUMN DIMENSION OF S AND FV                    TSCHKI
C                                                                       TSCHKI
C       SUBPROGRAMS CALLED:                                             TSCHKI
C                                                                       TSCHKI
C       UNCMIN        ...  DPMEPS                                       TSCHKI
C                                                                       TSCHKI
C*********************************************************************  TSCHKI
                                                                        TSCHKI
       INTEGER I,LEN                                                    TSCHKI
       DOUBLE PRECISION DPMEPS,ZERO,ONE,TWO,THREE,THOUS,TEMP            TSCHKI
       INTRINSIC MOD,NINT,SQRT                                          TSCHKI
       DATA ZERO,ONE,TWO,THREE,THOUS/0.0D0,1.0D0,2.0D0,3.0D0,1000.0D0/  TSCHKI
                                                                        TSCHKI
c check that parameters only take on acceptable values                  TSCHKI
c if not, set them to default values                                    TSCHKI
                                                                        TSCHKI
c set TERMCD to zero in case we abort prematuraly                       TSCHKI
                                                                        TSCHKI
       TERMCD = 0                                                       TSCHKI
                                                                        TSCHKI
c compute machine precision                                             TSCHKI
                                                                        TSCHKI
       EPSM = DPMEPS()                                                  TSCHKI
                                                                        TSCHKI
c check dimensions of the problem                                       TSCHKI
                                                                        TSCHKI
       IF(M.LE.0) THEN                                                  TSCHKI
          WRITE(IPR,601) M                                              TSCHKI
          MSG = -1                                                      TSCHKI
          RETURN                                                        TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
       IF(N.LE.0) THEN                                                  TSCHKI
          WRITE(IPR,602) N                                              TSCHKI
          MSG = -2                                                      TSCHKI
          RETURN                                                        TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
c check leading dimensions of the problem                               TSCHKI
                                                                        TSCHKI
        LEN = M+N+2                                                     TSCHKI
        IF(MAXM .LT. LEN) THEN                                          TSCHKI
           WRITE(IPR,603) MAXM,LEN                                      TSCHKI
           MSG = -3                                                     TSCHKI
           RETURN                                                       TSCHKI
        ENDIF                                                           TSCHKI
                                                                        TSCHKI
        LEN = N+2                                                       TSCHKI
        IF(MAXN .LT. LEN) THEN                                          TSCHKI
           WRITE(IPR,604) MAXN,LEN                                      TSCHKI
           MSG = -4                                                     TSCHKI
           RETURN                                                       TSCHKI
        ENDIF                                                           TSCHKI
                                                                        TSCHKI
        TEMP = SQRT(DBLE(N))                                            TSCHKI
        SQRN = NINT(TEMP)                                               TSCHKI
                                                                        TSCHKI
        IF(MAXP .LT. SQRN) THEN                                         TSCHKI
           WRITE(IPR,605) MAXP,SQRN                                     TSCHKI
           MSG = -5                                                     TSCHKI
           RETURN                                                       TSCHKI
        ENDIF                                                           TSCHKI
                                                                        TSCHKI
c check column dimensions of workspace arrays                           TSCHKI
                                                                        TSCHKI
       LEN = 2*SQRN+4                                                   TSCHKI
       IF(LUNC.LT.LEN) THEN                                             TSCHKI
          WRITE(IPR,606) LUNC,LEN                                       TSCHKI
          MSG = -6                                                      TSCHKI
          RETURN                                                        TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
       LEN = N+2*SQRN+11                                                TSCHKI
       IF(LNEM.LT.LEN) THEN                                             TSCHKI
          WRITE(IPR,607) LNEM,LEN                                       TSCHKI
          MSG = -7                                                      TSCHKI
          RETURN                                                        TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
       LEN = 2*SQRN+9                                                   TSCHKI
       IF(LNEN.LT.LEN) THEN                                             TSCHKI
          WRITE(IPR,608) LNEN,LEN                                       TSCHKI
          MSG = -8                                                      TSCHKI
          RETURN                                                        TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
       IF(LIN.LT.3) THEN                                                TSCHKI
          WRITE(IPR,609) LIN                                            TSCHKI
          MSG = -9                                                      TSCHKI
          RETURN                                                        TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
c check JACFLG, METHOD, and GLOBAL                                      TSCHKI
                                                                        TSCHKI
       IF(JACFLG.NE.1) JACFLG = 0                                       TSCHKI
                                                                        TSCHKI
       IF(METHOD.NE.0 .AND. METHOD.NE.1) METHOD = 1                     TSCHKI
                                                                        TSCHKI
       IF(GLOBAL.NE.0 .AND. GLOBAL.NE.1) GLOBAL = 0                     TSCHKI
                                                                        TSCHKI
       IF(MOD(MSG/2,2).EQ.1 .AND. JACFLG.EQ.0) THEN                     TSCHKI
          WRITE(IPR,610) MSG,JACFLG                                     TSCHKI
          MSG = -10                                                     TSCHKI
          RETURN                                                        TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
c check scale matrices                                                  TSCHKI
                                                                        TSCHKI
       DO 10 I = 1,N                                                    TSCHKI
          IF(TYPX(I).EQ.ZERO) TYPX(I) = ONE                             TSCHKI
          IF(TYPX(I).LT.ZERO) TYPX(I) = -TYPX(I)                        TSCHKI
          DXN(I) = ONE/TYPX(I)                                          TSCHKI
10    CONTINUE                                                         TSCHKI
                                                                        TSCHKI
       DO 20 I = 1,M                                                    TSCHKI
          IF(TYPF(I).EQ.ZERO) TYPF(I) = ONE                             TSCHKI
          IF(TYPF(I).LT.ZERO) TYPF(I) = -TYPF(I)                        TSCHKI
          DFN(I) = ONE/TYPF(I)                                          TSCHKI
20    CONTINUE                                                         TSCHKI
                                                                        TSCHKI
c check gradient, step, and function tolerances                         TSCHKI
                                                                        TSCHKI
       TEMP = ONE/THREE                                                 TSCHKI
       IF(GRADTL.LT.ZERO) THEN                                          TSCHKI
          GRADTL = EPSM**TEMP                                           TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
       IF(STEPTL.LT.ZERO) THEN                                          TSCHKI
          STEPTL = EPSM**(TWO*TEMP)                                     TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
       IF(FTOL.LT.ZERO) THEN                                            TSCHKI
          FTOL = EPSM**(TWO*TEMP)                                       TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
c check iteration limit                                                 TSCHKI
                                                                        TSCHKI
       IF(ITNLIM.LE.0) THEN                                             TSCHKI
          ITNLIM = 150                                                  TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
c check STEPMX and DLT                                                  TSCHKI
                                                                        TSCHKI
       IF(STEPMX.LT.ZERO) STEPMX = THOUS                                TSCHKI
                                                                        TSCHKI
       IF(DLT.LE.ZERO) THEN                                             TSCHKI
          DLT = -ONE                                                    TSCHKI
          IF(DLT.GT.STEPMX) DLT = STEPMX                                TSCHKI
       ENDIF                                                            TSCHKI
                                                                        TSCHKI
601  FORMAT('  TSCHKI     ILLEGAL DIMENSION M =',I5)                   TSCHKI
602  FORMAT('  TSCHKI     ILLEGAL DIMENSION N =',I5)                   TSCHKI
603  FORMAT('  TSCHKI     ILLEGAL DIMENSION MAXM =',I5,' < M+N+2 =',I5)TSCHKI
604  FORMAT('  TSCHKI     ILLEGAL DIMENSION MAXN =',I5,' < N+2 =',I5)  TSCHKI
605  FORMAT('  TSCHKI     ILLEGAL DIMENSION MAXP =',I5,' <',           TSCHKI
     +       '  NINT(SQRT (N)) =',I5)                                   TSCHKI
606  FORMAT('  TSCHKI     ILLEGAL DIMENSION LUNC =',I5,' <',           TSCHKI
     +       '  2*NINT(SQRT (N))+4 =',I5)                               TSCHKI
607  FORMAT('  TSCHKI     ILLEGAL DIMENSION LNEM =',I5,' <',           TSCHKI
     +       '  N+2*NINT(SQRT (N))+11 =',I5)                            TSCHKI
608  FORMAT('  TSCHKI     ILLEGAL DIMENSION LNEN =',I5,' <',           TSCHKI
     +       '  2*NINT(SQRT (N))+9 =',I5)                               TSCHKI
609  FORMAT('  TSCHKI     ILLEGAL DIMENSION LIN =',I5,' < 3')          TSCHKI
610  FORMAT('  TSCHKI     USER REQUESTS THAT ANALYTIC JACOBIAN BE',    TSCHKI
     +       ' ACCEPTED AS PROPERLY CODED (MSG =',I5,')'/               TSCHKI
     +       '  TSCHKI     BUT ANALYTIC JACOBIAN NOT SUPPLIED',         TSCHKI
     +       ' (JACFLG =',I5,')')                                       TSCHKI
      END                                                               TSCHKI
       SUBROUTINE TSCHKJ(AJANAL,XC,FC,NR,M,N,EPSM,DFN,DXN,              TSCHKJ
     +                   TYPX,IPR,FHAT,WRK1,TSFVEC,MSG)                 TSCHKJ
                                                                        TSCHKJ
       INTEGER NR,M,N,IPR,MSG                                           TSCHKJ
       DOUBLE PRECISION AJANAL(NR,N),XC(N),FC(M)                        TSCHKJ
       DOUBLE PRECISION EPSM,DFN(M),DXN(N),TYPX(N)                      TSCHKJ
       DOUBLE PRECISION FHAT(M),WRK1(M)                                 TSCHKJ
       EXTERNAL TSFVEC                                                  TSCHKJ
                                                                        TSCHKJ
C*********************************************************************  TSCHKJ
C THIS ROUTINE CHECKS THE ANALYTIC JACOBIAN AGAINST ITS FINITE          TSCHKJ
C DIFFERENCE APPROXIMATION.                                             TSCHKJ
C*********************************************************************  TSCHKJ
C                                                                       TSCHKJ
C       INPUT PARAMETERS :                                              TSCHKJ
C       -----------------                                               TSCHKJ
C                                                                       TSCHKJ
C       AJANAL : ANALYTIC JACOBIAN AT XC                                TSCHKJ
C       XC   : CURRENT ITERATE                                          TSCHKJ
C       FC   : FUNCTION VALUE AT XC                                     TSCHKJ
C       NR   : LEADING DIMENSION OF AJANAL                              TSCHKJ
C       M,N  : DIMENSIONS OF PROBLEM                                    TSCHKJ
C       EPSM : MACHINE PRECISION                                        TSCHKJ
C       DFN  : DIAGONAL SCALING MATRIX FOR F                            TSCHKJ
C       DXN  : DIAGONAL SCALING MATRIX FOR X                            TSCHKJ
C       TYPX : TYPICAL SIZE FOR EACH COMPONENT OF X                     TSCHKJ
C       IPR  : DEVICE TO WHICH TO SEND OUTPUT                           TSCHKJ
C       FHAT,WRK1 : WORKSPACE                                           TSCHKJ
C       TSFVEC  : SUBROUTINE TO EVALUATE THE USER'S FUNCTION            TSCHKJ
C                                                                       TSCHKJ
C       INPUT-OUTPUT PARAMETERS :                                       TSCHKJ
C       ------------------------                                        TSCHKJ
C                                                                       TSCHKJ
C       MSG : MESSAGE TO INHIBIT CERTAIN AUTOMATIC CHECKS + OUTPUT      TSCHKJ
C                                                                       TSCHKJ
C       SUBPROGRAMS CALLED:                                             TSCHKJ
C                                                                       TSCHKJ
C       LEVEL 1 BLAS  ...  IDAMAX                                       TSCHKJ
C       TENSOLVE      ...  TSUNSX,TSUNSF,TSSCLX,TSSCLF                  TSCHKJ
C       USER          ...  TSFVEC                                       TSCHKJ
C                                                                       TSCHKJ
C*********************************************************************  TSCHKJ
                                                                        TSCHKJ
       INTEGER I,J                                                      TSCHKJ
       DOUBLE PRECISION NDIGIT,RNOISE,SQRNS,STEPSZ,XTMPJ,DINF,RSTPSZ    TSCHKJ
       DOUBLE PRECISION TOL,QUART,ONE,TEN                               TSCHKJ
       INTEGER IDAMAX                                                   TSCHKJ
       INTRINSIC ABS,MAX,SQRT                                           TSCHKJ
       DATA QUART,ONE,TEN/0.250D0,1.0D0,10.0D0/                         TSCHKJ
                                                                        TSCHKJ
c unscale XC and FC                                                     TSCHKJ
                                                                        TSCHKJ
       CALL TSUNSX(XC,DXN,N)                                            TSCHKJ
       CALL TSUNSF(FC,DFN,M)                                            TSCHKJ
                                                                        TSCHKJ
c compute the finite difference Jacobian and check it against           TSCHKJ
c the analytic one                                                      TSCHKJ
                                                                        TSCHKJ
       NDIGIT = -LOG10(EPSM)                                            TSCHKJ
       RNOISE = MAX(TEN**(-NDIGIT),EPSM)                                TSCHKJ
       SQRNS  = SQRT(RNOISE)                                            TSCHKJ
       TOL = EPSM**QUART                                                TSCHKJ
       DO 40 J = 1,N                                                    TSCHKJ
          STEPSZ = SQRNS*MAX(ABS(XC(J)),ONE)                            TSCHKJ
          XTMPJ = XC(J)                                                 TSCHKJ
          XC(J) = XTMPJ+STEPSZ                                          TSCHKJ
          CALL TSFVEC(XC,FHAT,M,N)                                      TSCHKJ
          XC(J) = XTMPJ                                                 TSCHKJ
          RSTPSZ = ONE/STEPSZ                                           TSCHKJ
          DO 10 I = 1,M                                                 TSCHKJ
             WRK1(I) = (FHAT(I)-FC(I))*RSTPSZ                           TSCHKJ
10       CONTINUE                                                      TSCHKJ
          DO 20 I = 1,M                                                 TSCHKJ
             WRK1(I) = WRK1(I)*DFN(I)*TYPX(J)                           TSCHKJ
20       CONTINUE                                                      TSCHKJ
          DINF = ABS(WRK1(IDAMAX(M,WRK1,1)))                            TSCHKJ
          DO 30 I = 1,M                                                 TSCHKJ
             IF(ABS(AJANAL(I,J)-WRK1(I)).GT.TOL*DINF) THEN              TSCHKJ
          PRINT *, TOL*DINF                                             TSCHKJ
          PRINT *, AJANAL(I,J)                                          TSCHKJ
          PRINT *, WRK1(I)                                              TSCHKJ
          PRINT *, ABS(AJANAL(I,J)-WRK1(I))                             TSCHKJ
          PRINT *, I                                                    TSCHKJ
          PRINT *, J                                                    TSCHKJ
                WRITE(IPR,50)                                           TSCHKJ
                MSG = -11                                               TSCHKJ
                RETURN                                                  TSCHKJ
             ENDIF                                                      TSCHKJ
30       CONTINUE                                                      TSCHKJ
40    CONTINUE                                                         TSCHKJ
                                                                        TSCHKJ
c scale back XC and FC                                                  TSCHKJ
                                                                        TSCHKJ
       CALL TSSCLX(XC,DXN,N)                                            TSCHKJ
       CALL TSSCLF(FC,DFN,M)                                            TSCHKJ
                                                                        TSCHKJ
50    FORMAT(/,'  TSCHKJ      PROBABLE ERROR IN CODING OF ANALYTIC',   TSCHKJ
     +        ' JACOBIAN')                                              TSCHKJ
                                                                        TSCHKJ
       RETURN                                                           TSCHKJ
       END                                                              TSCHKJ
       SUBROUTINE TSCPMU(R,NR,N,EPSM,MU)                                TSCPMU
                                                                        TSCPMU
       INTEGER NR,N                                                     TSCPMU
       DOUBLE PRECISION R(NR,N),EPSM,MU                                 TSCPMU
                                                                        TSCPMU
C*********************************************************************  TSCPMU
C THIS ROUTINE COMPUTES A SMALL PERTURBATION MU. MU IS USED IN THE      TSCPMU
C COMPUTATION OF THE LEVENBERG-MARQUARDT STEP.                          TSCPMU
C*********************************************************************  TSCPMU
C                                                                       TSCPMU
C       INPUT PARAMETERS :                                              TSCPMU
C       -----------------                                               TSCPMU
C                                                                       TSCPMU
C       R  : UPPER TRIANGULAR MATRIX                                    TSCPMU
C       NR : LEADING DIMENSION OF R                                     TSCPMU
C       N  : COLUMN DIMENSION OF R                                      TSCPMU
C       EPSM :  MACHINE PRECISION                                       TSCPMU
C                                                                       TSCPMU
C       OUTPUT PARAMETERS :                                             TSCPMU
C       ------------------                                              TSCPMU
C                                                                       TSCPMU
C       MU = SQRT(L1 NORM OF R * INFINITY NORM OF R * N * EPSM * 100)   TSCPMU
C                                                                       TSCPMU
C       SUBPROGRAMS CALLED:                                             TSCPMU
C                                                                       TSCPMU
C       LEVEL 1 BLAS  ...  DASUM                                        TSCPMU
C                                                                       TSCPMU
C*********************************************************************  TSCPMU
                                                                        TSCPMU
       INTEGER I,J                                                      TSCPMU
       DOUBLE PRECISION AIFNRM,SUM,AL1NRM,ZERO,HUND                     TSCPMU
       DOUBLE PRECISION DASUM                                           TSCPMU
       INTRINSIC ABS,MAX,SQRT                                           TSCPMU
       DATA ZERO,HUND/0.0D0,100.0D0/                                    TSCPMU
                                                                        TSCPMU
c compute the infinity norm of R                                        TSCPMU
                                                                        TSCPMU
       AIFNRM = ZERO                                                    TSCPMU
       DO 20 I = 1,N                                                    TSCPMU
          SUM = ZERO                                                    TSCPMU
          DO 10 J = I,N                                                 TSCPMU
             SUM = SUM+ABS(R(I,J))                                      TSCPMU
  10      CONTINUE                                                      TSCPMU
          AIFNRM = MAX(AIFNRM,SUM)                                      TSCPMU
  20   CONTINUE                                                         TSCPMU
                                                                        TSCPMU
c compute the l1 norm of R                                              TSCPMU
                                                                        TSCPMU
       AL1NRM = ZERO                                                    TSCPMU
       DO 40 J = 1,N                                                    TSCPMU
          SUM = DASUM(J,R(1,J),1)                                       TSCPMU
          AL1NRM = MAX(AL1NRM,SUM)                                      TSCPMU
40    CONTINUE                                                         TSCPMU
                                                                        TSCPMU
c compute MU                                                            TSCPMU
                                                                        TSCPMU
       MU = SQRT(AIFNRM*AL1NRM*N*EPSM*HUND)                             TSCPMU
                                                                        TSCPMU
       RETURN                                                           TSCPMU
       END                                                              TSCPMU
       SUBROUTINE TSCPSS(S,MAXM,MAXN,M,N,P,METHOD,GLOBAL,EPSM,FCQ,      TSCPSS
     +                   Y,W,FQT,AL2NRM,QHAT,ANLS,DN,FQQ,PTILDA,        TSCPSS
     +                   CURPOS,PBAR,ZERO1,IERR,RESNEW,FLAG)            TSCPSS
                                                                        TSCPSS
       INTEGER MAXM,MAXN,M,N,P,FLAG,ZERO1,GLOBAL,IERR                   TSCPSS
       DOUBLE PRECISION EPSM,RESNEW                                     TSCPSS
       INTEGER METHOD,PTILDA(N),CURPOS(N),PBAR(N)                       TSCPSS
       DOUBLE PRECISION S(MAXN,P),FCQ(M)                                TSCPSS
       DOUBLE PRECISION Y(N),W(M),FQT(M),AL2NRM(N)                      TSCPSS
       DOUBLE PRECISION QHAT(MAXM,N),ANLS(MAXM,P)                       TSCPSS
       DOUBLE PRECISION DN(N),FQQ(M)                                    TSCPSS
                                                                        TSCPSS
C********************************************************************** TSCPSS
C THIS ROUTINE COMPUTES THE STANDARD STEP.  NOTE THAT AT THIS STAGE     TSCPSS
C THE JACOBIAN MATRIX (QHAT) HAS ALREADY BEEN FACTORED FROM COLUMNS 1   TSCPSS
C TO N-P DURING THE TENSOR STEP COMPUTATION.  THIS ROUTINE FACTORS      TSCPSS
C THE MATRIX QHAT FROM COLUMN N-P+1 TO N, THEREBY OBTAINING A QR        TSCPSS
C FACTORIZATION OF THE FULL MATRIX QHAT, THEN COMPUTES THE STANDARD     TSCPSS
C STEP BY PREMULTIPLYING THE RIGH-HAND SIDE FCQ BY AN ORTHOGONAL        TSCPSS
C MATRIX AND BY PERFORMING A BACKWARD SOLVE.                            TSCPSS
C********************************************************************** TSCPSS
C                                                                       TSCPSS
C                                                                       TSCPSS
C       INPUT PARAMETERS :                                              TSCPSS
C       -----------------                                               TSCPSS
C                                                                       TSCPSS
C       S    : FACTORED MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS  TSCPSS
C             (OBTAINED FROM TSQLFC SUBROUTINE)                         TSCPSS
C       MAXM : LEADING DIMENSION OF QHAT AND ANLS                       TSCPSS
C       MAXN : LEADING DIMENSION OF S                                   TSCPSS
C       M,N  : DIMENSIONS OF PROBLEM                                    TSCPSS
C       P    : COLUMN DIMENSION OF MATRIX S                             TSCPSS
C       METHOD : METHOD USED :                                          TSCPSS
C                METHOD = 0 : STANDARD METHOD IS USED                   TSCPSS
C                METHOD = 1 : TENSOR METHOD IS USED                     TSCPSS
C       GLOBAL : GLOBAL STRATEGY USED                                   TSCPSS
C                GLOBAL = 0 : LINE SEARCH IS USED                       TSCPSS
C                GLOBAL = 1 : 2-DIMENSIONAL TRUST REGION IS USED        TSCPSS
C       EPSM   : MACHINE PRECISION                                      TSCPSS
C       FCQ    : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY AN     TSCPSS
C                ORTHOGONAL MATRIX                                      TSCPSS
C       CURPOS : PIVOT VECTOR FOR THE FACTORIZATION OF QHAT FROM COLUMN TSCPSS
C                1 TO N-P                                               TSCPSS
C       Y,W,FQT,AL2NRM : WORKING VECTORS                                TSCPSS
C                                                                       TSCPSS
C                                                                       TSCPSS
C       INPUT-OUTPUT PARAMETERS :                                       TSCPSS
C       ------------------------                                        TSCPSS
C                                                                       TSCPSS
C       QHAT  : FACTORED MATRIX FROM COLUMN 1 TO N-P                    TSCPSS
C               ON ENTRY AND FACTORED MATRIX FROM 1 TO N ON EXIT        TSCPSS
C       ANLS  : TENSOR TERM MATRIX ON ENTRY AND ANLS MULTIPLIED BY      TSCPSS
C               ORTHOGONAL MATRICES ON EXIT (THIS IS PERFORMED IN THE   TSCPSS
C               CASE WHERE THE GLOBAL STRATEGY USED IS THE 2-DIMENSIONALTSCPSS
C               TRUST REGION)                                           TSCPSS
C                                                                       TSCPSS
C       OUTPUT PARAMETERS :                                             TSCPSS
C       -------------------                                             TSCPSS
C                                                                       TSCPSS
C       DN    : STANDARD STEP                                           TSCPSS
C       FQQ   : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY         TSCPSS
C               ORTHOGONAL MATRICES (THIS IS USED IN THE CASE WHERE     TSCPSS
C               THE GLOBAL STRATEGY USED IS THE 2-DIMENSIONAL           TSCPSS
C               TRUST REGION)                                           TSCPSS
C       PTILDA: PIVOT VECTOR FOR THE FACTORIZATION OF THE               TSCPSS
C               MATRIX QHAT FROM N-P+1 TO N                             TSCPSS
C       PBAR  : PIVOT VECTOR FOR THE FACTORIZATION OF THE               TSCPSS
C               TRANSFORMED MATRIX QHAT FROM 1 TO N                     TSCPSS
C               IN CASE OF SINGULARITY                                  TSCPSS
C       ZERO1 : FIRST ZERO COLUMN OF MATRIX QHAT IN CASE OF SINGULARITY TSCPSS
C       IERR  : RETURNED CODE WITH THE FOLLOWING MEANING :              TSCPSS
C               IERR = 1 : SINGULARITY OF JACOBIAN DETECTED             TSCPSS
C               IERR = 0 : OTHERWISE                                    TSCPSS
C       RESNEW: RESIDUAL OF THE STANDARD MODEL                          TSCPSS
C       FLAG  : RETURNED CODE WITH THE FOLLOWING MEANINGS :             TSCPSS
C               FLAG = 0 : NO SINGULARITY DETECTED                      TSCPSS
C               FLAG = 1 : SINGULARITY DETECTED DURING QR FACTORIZATION TSCPSS
C                          OF QHAT FROM COLUMN 1 TO N-P                 TSCPSS
C               FLAG = 2 : SINGULARITY DETECTED DURING QR FACTORIZATION TSCPSS
C                          OF QHAT FROM COLUMN N-P+1 TO N               TSCPSS
C                                                                       TSCPSS
C       SUBPROGRAMS CALLED:                                             TSCPSS
C                                                                       TSCPSS
C       LEVEL 1 BLAS  ...  DCOPY,DLOAD,DSCAL                            TSCPSS
C       TENSOLVE      ...  TSQRFC,TSQMUV,TSQMTS,TSSMRD,TSBSLV,TSPRMV    TSCPSS
C       TENSOLVE      ...  TSQMLV,TSCPMU                                TSCPSS
C                                                                       TSCPSS
C **********************************************************************TSCPSS
                                                                        TSCPSS
       INTEGER ZEROTM,I,J                                               TSCPSS
       DOUBLE PRECISION MU,ZERO,ONE                                     TSCPSS
       DATA ZERO,ONE/0.0D0,1.0D0/                                       TSCPSS
                                                                        TSCPSS
       FLAG = 0                                                         TSCPSS
                                                                        TSCPSS
c initialization                                                        TSCPSS
                                                                        TSCPSS
       CALL DLOAD (M+N,ZERO,FQQ,1)                                      TSCPSS
                                                                        TSCPSS
       CALL DCOPY(M,FCQ,1,W,1)                                          TSCPSS
       CALL DSCAL(M,-ONE,W,1)                                           TSCPSS
                                                                        TSCPSS
c if the Jacobian is singular then compute the Levenberg-Marquardt      TSCPSS
c step (label 20)                                                       TSCPSS
                                                                        TSCPSS
       IF(IERR.EQ.1) THEN                                               TSCPSS
          FLAG = 1                                                      TSCPSS
          GO TO 20                                                      TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
c factor the matrix QHAT from column n-p+1 to n                         TSCPSS
                                                                        TSCPSS
       CALL TSQRFC(QHAT,MAXM,N,M,N-P+1,N,IERR,EPSM,AL2NRM,PTILDA,ZERO1) TSCPSS
                                                                        TSCPSS
       IF((M.EQ.N).AND.(IERR.EQ.0)) THEN                                TSCPSS
           ZEROTM = ZERO1-1                                             TSCPSS
       ELSE                                                             TSCPSS
           ZEROTM = ZERO1                                               TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
c premultiply W by the orthogonal matrix resulting from the QR          TSCPSS
c factorization of QHAT                                                 TSCPSS
                                                                        TSCPSS
       CALL TSQMUV(QHAT,W,FQQ,MAXM,M,N-P+1,ZEROTM,.FALSE.)              TSCPSS
                                                                        TSCPSS
       IF(METHOD.EQ.1 .AND. GLOBAL.EQ.1) THEN                           TSCPSS
                                                                        TSCPSS
c premultiply ANLS by the orthogonal matrix resulting from the QR       TSCPSS
c factorization of QHAT                                                 TSCPSS
                                                                        TSCPSS
          CALL TSQMTS(ANLS,QHAT,MAXM,M,N,M,P,N-P+1,FCQ,ZEROTM)          TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
       IF(IERR.EQ.1) THEN                                               TSCPSS
          FLAG = 2                                                      TSCPSS
          GO TO 20                                                      TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
c computate the residual of the standard model                          TSCPSS
                                                                        TSCPSS
       CALL TSSMRD(FQQ,RESNEW,DN,MU,IERR,M,N)                           TSCPSS
                                                                        TSCPSS
c if QHAT is nonsingular perform a backward solve to obtain Y           TSCPSS
                                                                        TSCPSS
       CALL TSBSLV(QHAT,MAXM,M,N,FQQ,Y)                                 TSCPSS
                                                                        TSCPSS
c pivot Y                                                               TSCPSS
                                                                        TSCPSS
       CALL TSPRMV(DN,Y,PTILDA,N,0)                                     TSCPSS
                                                                        TSCPSS
       IF(N .NE. 1) THEN                                                TSCPSS
                                                                        TSCPSS
          CALL TSPRMV(Y,DN,CURPOS,N,0)                                  TSCPSS
                                                                        TSCPSS
c premultiply Y by the orthogonal matrix resulting from the QL          TSCPSS
c factorization of S                                                    TSCPSS
                                                                        TSCPSS
          CALL TSQMLV(MAXN,N,P,S,Y,DN,.TRUE.)                           TSCPSS
                                                                        TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
       IF(GLOBAL.EQ.1) THEN                                             TSCPSS
          IERR = 0                                                      TSCPSS
          CALL DSCAL(M,-ONE,FQQ,1)                                      TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
       RETURN                                                           TSCPSS
                                                                        TSCPSS
20    CONTINUE                                                         TSCPSS
                                                                        TSCPSS
c                    @   SINGULAR CASE   @                              TSCPSS
                                                                        TSCPSS
c solve ( QHAT-trans QHAT + MU I ) DN = -QHAT-trans W                   TSCPSS
                                                                        TSCPSS
c put the diagonal elements stored in row m+2 of QHAT into their        TSCPSS
c propre positions and zero out the unwanted portions of QHAT           TSCPSS
                                                                        TSCPSS
       DO 30 J = 1, ZERO1-1                                             TSCPSS
          QHAT(J,J) = QHAT(M+2,J)                                       TSCPSS
          CALL DLOAD (M+N-J,ZERO,QHAT(J+1,J),1)                         TSCPSS
30    CONTINUE                                                         TSCPSS
                                                                        TSCPSS
       DO 40 J = ZERO1, N                                               TSCPSS
          CALL DLOAD (M+N-ZERO1+1,ZERO,QHAT(ZERO1,J),1)                 TSCPSS
40    CONTINUE                                                         TSCPSS
                                                                        TSCPSS
c compute a small perturbation MU                                       TSCPSS
                                                                        TSCPSS
       CALL TSCPMU(QHAT,MAXM,N,EPSM,MU)                                 TSCPSS
                                                                        TSCPSS
c form the augmented matrix QHAT by adding an (n*n) diag(MU) in         TSCPSS
c the bottom                                                            TSCPSS
                                                                        TSCPSS
       DO 50 I = M+1,M+N                                                TSCPSS
          QHAT(I,I-M) = MU                                              TSCPSS
50    CONTINUE                                                         TSCPSS
                                                                        TSCPSS
c factor the transformed matrix QHAT from 1 to n                        TSCPSS
                                                                        TSCPSS
       CALL TSQRFC(QHAT,MAXM,N,M+N,1,N,IERR,EPSM,AL2NRM,PBAR,ZERO1)     TSCPSS
                                                                        TSCPSS
       IF(METHOD.EQ.1 .AND. GLOBAL.EQ.1) THEN                           TSCPSS
                                                                        TSCPSS
c premultiply ANLS by the orthogonal matrix resulting from the QR       TSCPSS
c factorization of QHAT                                                 TSCPSS
                                                                        TSCPSS
         CALL TSQMTS(ANLS,QHAT,MAXM,M+N,N,M,P,1,FCQ,ZERO1)              TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
c compute the Levenberg-Marquardt step and the residual of the          TSCPSS
c standard model                                                        TSCPSS
                                                                        TSCPSS
       IF(FLAG.EQ.1) THEN                                               TSCPSS
          CALL TSQMUV(QHAT,W,FQQ,MAXM,M+N,1,N+1,.FALSE.)                TSCPSS
          CALL TSBSLV(QHAT,MAXM,M+N,N,FQQ,Y)                            TSCPSS
          CALL TSPRMV(DN,Y,PBAR,N,0)                                    TSCPSS
          CALL TSPRMV(Y,DN,CURPOS,N,0)                                  TSCPSS
          CALL TSQMLV(MAXN,N,P,S,Y,DN,.TRUE.)                           TSCPSS
          CALL TSSMRD(FQQ,RESNEW,DN,MU,IERR,M,N)                        TSCPSS
          IF(GLOBAL.EQ.1) THEN                                          TSCPSS
             IERR = 1                                                   TSCPSS
             CALL DSCAL(M+N,-ONE,FQQ,1)                                 TSCPSS
          ENDIF                                                         TSCPSS
          RETURN                                                        TSCPSS
       ELSE                                                             TSCPSS
          CALL TSQMUV(QHAT,FQQ,FQT,MAXM,M+N,1,N+1,.FALSE.)              TSCPSS
          CALL TSBSLV(QHAT,MAXM,M+N,N,FQT,DN)                           TSCPSS
          CALL TSPRMV(Y,DN,PBAR,N,0)                                    TSCPSS
          CALL TSPRMV(DN,Y,PTILDA,N,0)                                  TSCPSS
          CALL TSPRMV(Y,DN,CURPOS,N,0)                                  TSCPSS
          CALL TSQMLV(MAXN,N,P,S,Y,DN,.TRUE.)                           TSCPSS
          CALL TSSMRD(FQT,RESNEW,DN,MU,IERR,M,N)                        TSCPSS
          IF(GLOBAL.EQ.1) THEN                                          TSCPSS
             IERR = 1                                                   TSCPSS
             CALL DCOPY(M+N,FQT,1,FQQ,1)                                TSCPSS
             CALL DSCAL(M+N,-ONE,FQQ,1)                                 TSCPSS
          ENDIF                                                         TSCPSS
       ENDIF                                                            TSCPSS
                                                                        TSCPSS
       END                                                              TSCPSS
       SUBROUTINE TSD1SV(AJA,S,ANLS,FN,X,MAXM,MAXN,M,N,P,Q,EPSM,        TSD1SV
     +                   WRK1,WRK2,WRK3,PIVOT,D1)                       TSD1SV
                                                                        TSD1SV
       INTEGER MAXM,MAXN,M,N,P,Q                                        TSD1SV
       INTEGER PIVOT(N)                                                 TSD1SV
       DOUBLE PRECISION EPSM                                            TSD1SV
       DOUBLE PRECISION AJA(MAXM,N),S(MAXN,P),ANLS(MAXM,P),FN(M),X(P)   TSD1SV
       DOUBLE PRECISION WRK1(N),WRK2(N),WRK3(N),D1(N)                   TSD1SV
                                                                        TSD1SV
C*********************************************************************  TSD1SV
C THIS ROUTINE SOLVES THE FIRST N-Q LINEAR EQUATIONS IN N-P UNKNOWNS    TSD1SV
C OF THE TENSOR MODEL.                                                  TSD1SV
C*********************************************************************  TSD1SV
C                                                                       TSD1SV
C       INPUT PARAMETERS :                                              TSD1SV
C       ----------------                                                TSD1SV
C                                                                       TSD1SV
C       AJA : JACOBIAN MATRIX AT CURRENT ITERATE                        TSD1SV
C       S   : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS            TSD1SV
C       ANLS: TENSOR TERM MATRIX AT CURRENT ITERATE                     TSD1SV
C       FN  : FUNCTION VALUE AT CURRENT ITERATE                         TSD1SV
C        X  : SOLUTION OF THE LOWER M-N+Q QUADRATIC EQUATIONS IN P      TSD1SV
C             UNKNOWNS OF THE TENSOR MODEL                              TSD1SV
C       MAXM: LEADING DIMENSION OF AJA AND ANLS                         TSD1SV
C       MAXN: LEADING DIMENSION OF S                                    TSD1SV
C       M,N : DIMENSIONS OF PROBLEM                                     TSD1SV
C       P   : COLUMN DIMENSION OF S AND ANLS                            TSD1SV
C       Q   : NUMERICAL RANK OF JACOBIAN :                              TSD1SV
C             Q > P : JACOBIAN IS SINGULAR                              TSD1SV
C             Q = P : OTHERWISE                                         TSD1SV
C       EPSM: MACHINE PRECISION                                         TSD1SV
C       WRK1,WRK2,WRK3 : WORKSPACE                                      TSD1SV
C                                                                       TSD1SV
C                                                                       TSD1SV
C       OUTPUT PARAMETERS :                                             TSD1SV
C       ------------------                                              TSD1SV
CTSD1SV
C        PIVOT : PIVOT VECTOR                                           TSD1SV
C        D1 : SOLUTION OF THE N-Q LINEAR EQUATIONS IN N-P UNKNOWNS OF   TSD1SV
C             THE TENSOR MODEL                                          TSD1SV
C    TSD1SV
C       SUBPROGRAMS CALLED:                                             TSD1SV
C    TSD1SV
C       LEVEL 1 BLAS  ...  DCOPY,DLOAD                                  TSD1SV
C       LEVEL 2 BLAS  ...  DGEMV                                        TSD1SV
C       TENSOLVE      ...  TSSTMX,TSBSLV,TSQRFC,TSPRMV,TSFSLV,TSQMUV    TSD1SV
C    TSD1SV
C*********************************************************************  TSD1SV
                                                                        TSD1SV
       INTEGER ZERO1,I,J,IERR,ICOL                                      TSD1SV
       DOUBLE PRECISION EPSM1,ZERO,HALF,ALPHA,ONE                       TSD1SV
       DATA ZERO,ALPHA,HALF,ONE/0.0D0,1.0D-4,0.50D0,1.0D0/              TSD1SV
                                                                        TSD1SV
c compute the top right (n-q) x p submatrix of AJA times X              TSD1SV
                                                                        TSD1SV
       CALL DGEMV('N',N-Q,P,ONE,AJA(1,N-P+1),MAXM,                      TSD1SV
     +            X,1,ZERO,D1,1)                                        TSD1SV
                                                                        TSD1SV
c compute S-trans times X                                               TSD1SV
                                                                        TSD1SV
       CALL TSSTMX(S,X,MAXN,N,P,WRK3,WRK2)                              TSD1SV
                                                                        TSD1SV
c compute 0.5 * (S-trans times X)**2                                    TSD1SV
                                                                        TSD1SV
       DO 10 I = 1, P                                                   TSD1SV
          WRK1(I) = HALF * WRK2(I)**2                                   TSD1SV
  10   CONTINUE                                                         TSD1SV
                                                                        TSD1SV
c compute 0.5 * (top (n-q) x p submatrix of ANLS) *                     TSD1SV
c (S-trans times X)**2                                                  TSD1SV
                                                                        TSD1SV
       CALL DGEMV('N',N-Q,P,ONE,ANLS(1,1),MAXM,WRK1,1,ZERO,WRK2,1)      TSD1SV
                                                                        TSD1SV
       DO 20 I = 1,N-Q                                                  TSD1SV
          WRK1(I) = -FN(I)-D1(I)-WRK2(I)                                TSD1SV
20    CONTINUE                                                         TSD1SV
                                                                        TSD1SV
c if the Jacobian is nonsingular then solve for the first               TSD1SV
c n-p components of the tensor step and return                          TSD1SV
                                                                        TSD1SV
       IF(P.EQ.Q) THEN                                                  TSD1SV
          CALL TSBSLV(AJA,MAXM,M,N-P,WRK1,D1)                           TSD1SV
          RETURN                                                        TSD1SV
       ENDIF                                                            TSD1SV
                                                                        TSD1SV
       CALL DLOAD(Q-P,ZERO,WRK2(N-Q+1),1)                               TSD1SV
                                                                        TSD1SV
c copy top left (n-q) x (n-p) submatrix of AJA into bottom of AJA       TSD1SV
                                                                        TSD1SV
       DO 30 J = 1,N-P                                                  TSD1SV
          CALL DCOPY(N-Q,AJA(1,J),1,AJA(M+3,J),1)                       TSD1SV
30    CONTINUE                                                         TSD1SV
                                                                        TSD1SV
c copy the transpose of the top left (n-q) x (n-p) submatrix of AJA     TSD1SV
c into top of AJA                                                       TSD1SV
                                                                        TSD1SV
       DO 50 J = 1,N-Q                                                  TSD1SV
          AJA(J,J) = AJA(M+2,J)                                         TSD1SV
          DO 40 I = J+1,N-P                                             TSD1SV
            AJA(I,J) = AJA(J,I)                                         TSD1SV
40       CONTINUE                                                      TSD1SV
50    CONTINUE                                                         TSD1SV
                                                                        TSD1SV
c zero out the upper triangular (n-q) x (n-q) triangular part of        TSD1SV
c the transpose of the top left (n-q) x (n-p) submatrix of AJA          TSD1SV
                                                                        TSD1SV
       DO 60 J = 1,N-Q                                                  TSD1SV
          CALL DLOAD(J-1,ZERO,AJA(1,J),1)                               TSD1SV
60    CONTINUE                                                         TSD1SV
                                                                        TSD1SV
c factor the transpose of the top left (n-q) x (n-p) submatrix of AJA   TSD1SV
                                                                        TSD1SV
       EPSM1 = EPSM*ALPHA                                               TSD1SV
                                                                        TSD1SV
       CALL TSQRFC(AJA,MAXM,N-Q,N-P,1,N-Q,IERR,EPSM1,WRK3,PIVOT,ZERO1)  TSD1SV
                                                                        TSD1SV
       IF(IERR .EQ. 0) THEN                                             TSD1SV
          ICOL = N-Q                                                    TSD1SV
       ELSE                                                             TSD1SV
          ICOL = ZERO1-1                                                TSD1SV
       ENDIF                                                            TSD1SV
                                                                        TSD1SV
       CALL TSPRMV(D1,WRK1,PIVOT,N-Q,0)                                 TSD1SV
                                                                        TSD1SV
c solve for the first n-p components of the tensor step                 TSD1SV
                                                                        TSD1SV
       CALL TSFSLV(AJA,D1,MAXM,N-P,ICOL,WRK2)                           TSD1SV
                                                                        TSD1SV
       CALL TSQMUV(AJA,WRK2,D1,MAXM,N-P,1,ZERO1,.TRUE.)                 TSD1SV
                                                                        TSD1SV
c copy the (n-q) x (n-p) submatrix of AJA from bottom back to           TSD1SV
c top of AJA                                                            TSD1SV
                                                                        TSD1SV
       DO 70 J = 1,N-P                                                  TSD1SV
          CALL DCOPY(N-Q,AJA(M+3,J),1,AJA(1,J),1)                       TSD1SV
70    CONTINUE                                                         TSD1SV
                                                                        TSD1SV
       RETURN                                                           TSD1SV
       END                                                              TSD1SV
       SUBROUTINE TSDFCN(P,X,G,AJA,ANLS,S,FN,WRK1,WRK2,                 TSDFCN
     +                   WRK3,WRK4,WRK5,MAXM,MAXN,M,N,Q)                TSDFCN
                                                                        TSDFCN
       INTEGER P,MAXM,MAXN,M,N,Q                                        TSDFCN
       DOUBLE PRECISION X(P),G(P),AJA(MAXM,N),ANLS(MAXM,P),S(MAXN,P)    TSDFCN
       DOUBLE PRECISION FN(M),WRK1(M),WRK2(P),WRK3(P),WRK4(M),WRK5(M)   TSDFCN
                                                                        TSDFCN
C*********************************************************************  TSDFCN
C THIS ROUTINE COMPUTES THE ANALYTIC GRADIENT OF THE FUNCTION GIVEN     TSDFCN
C BY SUBROUTINE TSQFCN.                                                 TSDFCN
C*********************************************************************  TSDFCN
C                                                                       TSDFCN
C       INPUT PARAMETERS :                                              TSDFCN
C       -----------------                                               TSDFCN
C                                                                       TSDFCN
C       P  : COLUMN DIMENSION OF ANLS AND S                             TSDFCN
C       X  : POINT AT WHICH GRADIENT IS EVALUATED                       TSDFCN
C       AJA: JACOBIAN MATRIX AT CURRENT ITERATE                         TSDFCN
C       ANLS : TENSOR TERM MATRIX AT CURRENT ITERATE                    TSDFCN
C       S  : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS             TSDFCN
C       FN : FUNCTION VALUE AT CURRENT ITERATE                          TSDFCN
C       WRK1,WRK2,WRK3,WRK4,WRK5 : WORKSPACE                            TSDFCN
C       MAXM : LEADING DIMENSION OF AJA AND ANLS                        TSDFCN
C       MAXN : LEADING DIMENSION OF S                                   TSDFCN
C       M,N  : DIMENSIONS OF PROBLEM                                    TSDFCN
C       Q : NUMERICAL RANK OF JACOBIAN :                                TSDFCN
C           Q > P : JACOBIAN IS SINGULAR                                TSDFCN
C           Q = P : OTHERWISE                                           TSDFCN
C                                                                       TSDFCN
C                                                                       TSDFCN
C       OUTPUT PARAMETERS :                                             TSDFCN
C       -----------------                                               TSDFCN
C                                                                       TSDFCN
C       G : GRADIENT AT X                                               TSDFCN
C                                                                       TSDFCN
C       SUBPROGRAMS CALLED:                                             TSDFCN
C                                                                       TSDFCN
C       LEVEL 1 BLAS  ...  DAXPY,DDOT,DLOAD                             TSDFCN
C       LEVEL 2 BLAS  ...  DGEMV                                        TSDFCN
C       TENSOLVE      ...  TSSTMX                                       TSDFCN
C                                                                       TSDFCN
C*********************************************************************  TSDFCN
                                                                        TSDFCN
       INTEGER I,J,K,L                                                  TSDFCN
       DOUBLE PRECISION ZERO,HALF,ONE                                   TSDFCN
       DOUBLE PRECISION DDOT                                            TSDFCN
       DATA ZERO,HALF,ONE/0.0D0,0.50D0,1.0D0/                           TSDFCN
                                                                        TSDFCN
c compute the lower right (m-n+q) x p submatrix of AJA times X          TSDFCN
                                                                        TSDFCN
       CALL DGEMV('N',M-N+Q,P,ONE,AJA(N-Q+1,N-P+1),MAXM,                TSDFCN
     +            X,1,ZERO,WRK1,1)                                      TSDFCN
                                                                        TSDFCN
c compute S-trans times X                                               TSDFCN
                                                                        TSDFCN
       CALL TSSTMX(S,X,MAXN,N,P,WRK2,WRK3)                              TSDFCN
                                                                        TSDFCN
c compute 0.5 * (S-trans times X)**2                                    TSDFCN
                                                                        TSDFCN
       DO 10 I = 1, P                                                   TSDFCN
          WRK2(I) = HALF * WRK3(I)**2                                   TSDFCN
10    CONTINUE                                                         TSDFCN
                                                                        TSDFCN
c compute 0.5 * (lower (m-n+q) x p submatrix of ANLS) *                 TSDFCN
c (S-trans times X)**2                                                  TSDFCN
                                                                        TSDFCN
       CALL DGEMV('N',M-N+Q,P,ONE,ANLS(N-Q+1,1),MAXM,                   TSDFCN
     +            WRK2,1,ZERO,WRK4,1)                                   TSDFCN
                                                                        TSDFCN
       DO 20 I = 1,M-N+Q                                                TSDFCN
          WRK4(I) = WRK4(I)+FN(N-Q+I)+WRK1(I)                           TSDFCN
20    CONTINUE                                                         TSDFCN
                                                                        TSDFCN
c compute AJA-trans * WRK4                                              TSDFCN
                                                                        TSDFCN
       CALL DGEMV('T',M-N+Q,P,ONE,AJA(N-Q+1,N-P+1),MAXM,                TSDFCN
     +            WRK4,1,ZERO,WRK1,1)                                   TSDFCN
                                                                        TSDFCN
c compute ANLS-trans * WRK4                                             TSDFCN
                                                                        TSDFCN
       CALL DGEMV('T',M-N+Q,P,ONE,ANLS(N-Q+1,1),MAXM,                   TSDFCN
     +            WRK4,1,ZERO,WRK5,1)                                   TSDFCN
                                                                        TSDFCN
c compute S * diag(S-trans * WRK3) * WRK5                               TSDFCN
                                                                        TSDFCN
       CALL DLOAD(P,ZERO,WRK2,1)                                        TSDFCN
                                                                        TSDFCN
       L = P+1                                                          TSDFCN
       DO 50 J = 1,P                                                    TSDFCN
          L = L-1                                                       TSDFCN
          WRK2(L) = S(N+2,L)                                            TSDFCN
          DO 30 I = L+1,P                                               TSDFCN
             WRK2(I) = S(N-P+J,I)                                       TSDFCN
30       CONTINUE                                                      TSDFCN
          DO 40 K = 1,P                                                 TSDFCN
             WRK2(K) = WRK2(K)*WRK3(K)                                  TSDFCN
40       CONTINUE                                                      TSDFCN
          G(J) = DDOT(P,WRK2,1,WRK5,1)                                  TSDFCN
50    CONTINUE                                                         TSDFCN
                                                                        TSDFCN
       CALL DAXPY(P,ONE,WRK1,1,G,1)                                     TSDFCN
                                                                        TSDFCN
       RETURN                                                           TSDFCN
       END                                                              TSDFCN
       SUBROUTINE TSDFLT(M,N,ITNLIM,JACFLG,GRADTL,STEPTL,FTOL,METHOD,   TSDFLT
     +                   GLOBAL,STEPMX,DLT,TYPX,TYPF,IPR,MSG)           TSDFLT
                                                                        TSDFLT
       INTEGER M,N,ITNLIM,JACFLG,METHOD,GLOBAL,MSG,IPR                  TSDFLT
       DOUBLE PRECISION GRADTL,STEPTL,FTOL,STEPMX,DLT                   TSDFLT
       DOUBLE PRECISION TYPX(N),TYPF(M)                                 TSDFLT
                                                                        TSDFLT
C*********************************************************************  TSDFLT
C THIS ROUTINE SETS DEFAULT VALUES FOR EACH INPUT VARIABLE TO THE       TSDFLT
C NONLINEAR EQUATION ALGORITHM.                                         TSDFLT
C*********************************************************************  TSDFLT
C                                                                       TSDFLT
C       SUBPROGRAMS CALLED:                                             TSDFLT
C                                                                       TSDFLT
C       LEVEL 1 BLAS  ...  DLOAD                                        TSDFLT
C       UNCMIN        ...  DPMEPS                                       TSDFLT
C                                                                       TSDFLT
C********************************************************************** TSDFLT
                                                                        TSDFLT
       DOUBLE PRECISION EPS,DPMEPS,ONE,TWO,THREE,THOUS                  TSDFLT
       DATA ONE,TWO,THREE,THOUS/1.0D0,2.0D0,3.0D0,1000.0D0/             TSDFLT
                                                                        TSDFLT
       JACFLG = 0                                                       TSDFLT
       EPS = DPMEPS()                                                   TSDFLT
       GRADTL = EPS**(ONE/THREE)                                        TSDFLT
       STEPTL = EPS**(TWO/THREE)                                        TSDFLT
       FTOL = EPS**(TWO/THREE)                                          TSDFLT
       ITNLIM = 150                                                     TSDFLT
       METHOD = 1                                                       TSDFLT
       GLOBAL = 0                                                       TSDFLT
       STEPMX = THOUS                                                   TSDFLT
       DLT = -ONE                                                       TSDFLT
       MSG = 0                                                          TSDFLT
       IPR = 6                                                          TSDFLT
       CALL DLOAD(N,ONE,TYPX,1)                                         TSDFLT
       CALL DLOAD(M,ONE,TYPF,1)                                         TSDFLT
                                                                        TSDFLT
       RETURN                                                           TSDFLT
       END                                                              TSDFLT
       SUBROUTINE TSDUMJ(AJA,X,NR,N)                                    TSDUMJ
                                                                        TSDUMJ
       INTEGER NR, N                                                    TSDUMJ
       DOUBLE PRECISION AJA(NR,N),X(N)                                  TSDUMJ
                                                                        TSDUMJ
C*********************************************************************  TSDUMJ
C THIS IS A DUMMY ROUTINE TO PREVENT UNSATISFIED EXTERNAL DIAGNOSTIC    TSDUMJ
C WHEN SPECIFIC ANALYTIC JACOBIAN IS NOT SUPPLIED.                      TSDUMJ
C*********************************************************************  TSDUMJ
C                                                                       TSDUMJ
C      INPUT PARAMETERS:                                                TSDUMJ
C      -----------------                                                TSDUMJ
C                                                                       TSDUMJ
C      AJA : JACOBIAN MATRIX                                            TSDUMJ
C      X   : POINT AT WHICH JACOBIAN IS EVALUATED                       TSDUMJ
C      NR  : LEADING DIMENSION OF AJA                                   TSDUMJ
C      N   : DIMENSION OF PROBLEM                                       TSDUMJ
C                                                                       TSDUMJ
C***********************************************************************TSDUMJ
                                                                        TSDUMJ
       RETURN                                                           TSDUMJ
       END                                                              TSDUMJ
       FUNCTION TSFAFA(ANLS,FQ,ADT,AG,CONST1,CONST2,ALPHA,DLT,          TSFAFA
     +                 NR,M,N,P,NWTAKE,IERR,VN)                         TSFAFA
                                                                        TSFAFA
       INTEGER NR,M,N,P,IERR                                            TSFAFA
       DOUBLE PRECISION ALPHA,DLT,TSFAFA                                TSFAFA
       DOUBLE PRECISION ADT(N),AG(N),CONST1(P),CONST2(P)                TSFAFA
       DOUBLE PRECISION FQ(M),VN(M),ANLS(NR,P)                          TSFAFA
       LOGICAL NWTAKE                                                   TSFAFA
                                                                        TSFAFA
C********************************************************************   TSFAFA
C THIS FUNCTION COMPUTES || F + J*D + 0.5*A*D**2 ||**2 IN THE           TSFAFA
C L2 NORM SENS, WHERE D = ALPHA*DT + SQRT(DLT**2-ALPHA**2).             TSFAFA
C********************************************************************   TSFAFA
C                                                                       TSFAFA
C                                                                       TSFAFA
C   INPUT PARAMETERS                                                    TSFAFA
C   ----------------                                                    TSFAFA
C                                                                       TSFAFA
C       ANLS   : TENSOR TERM MATRIX                                     TSFAFA
C       FQ     : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY        TSFAFA
C                ORTHOGONAL MATRICES                                    TSFAFA
C       ADT    : JACOBIAN MATRIX TIMES DT                               TSFAFA
C        AG    : JACOBIAN MATRIX TIMES GBAR (SEE SUBROUTINE TS2DTR)     TSFAFA
C       CONST1 : SHAT-TRANS TIMES DT                                    TSFAFA
C       CONST2 : SHAT-TRANS TIMES GBAR                                  TSFAFA
C       ALPHA  : POINT AT WHICH TO EVALUATE THE FUNCTION TSFAFA         TSFAFA
C       DLT    : CURRENT TRUST RADIUS                                   TSFAFA
C       NR     : LEADING DIMENSION OF THE JACOBIAN                      TSFAFA
C       M,N    : DIMENSIONS OF THE PROBLEM                              TSFAFA
C       P      : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS         TSFAFA
C       NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS:          TSFAFA
C                NWTAKE = .TRUE.  : STANDARD STEP TAKEN                 TSFAFA
C                NWTAKE = .FALSE. : TENSOR STEP TAKEN                   TSFAFA
C       IERR   : RETURN CODE FROM QRP FACTORIZATION ROUTINE:            TSFAFA
C                IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED         TSFAFA
C                IERR = 1 : SINGULARITY OF JACOBIAN DETECTED            TSFAFA
C                                                                       TSFAFA
C                                                                       TSFAFA
C       OUTPUT PARAMETERS                                               TSFAFA
C       -----------------                                               TSFAFA
C                                                                       TSFAFA
C       VN     : F + J*D + 0.5*A*D**2                                   TSFAFA
C       TSFAFA :  || F + J*D + 0.5*A*D**2 ||**2                         TSFAFA
C                WHERE D = ALPHA*DT + SQRT(DLT**2-ALPHA**2)             TSFAFA
C                                                                       TSFAFA
C       SUBPROGRAMS CALLED:                                             TSFAFA
C                                                                       TSFAFA
C       LEVEL 1 BLAS  ...  DDOT                                         TSFAFA
C       TENSOLVE      ...  TSMAFA                                       TSFAFA
C                                                                       TSFAFA
C********************************************************************   TSFAFA
                                                                        TSFAFA
        INTEGER LEN                                                     TSFAFA
        DOUBLE PRECISION DDOT                                           TSFAFA
        DOUBLE PRECISION HALF                                           TSFAFA
        DATA HALF/0.50D0/                                               TSFAFA
                                                                        TSFAFA
        CALL TSMAFA(ANLS,FQ,ADT,AG,CONST1,CONST2,ALPHA,DLT,             TSFAFA
     +              NR,M,N,P,NWTAKE,IERR,VN)                            TSFAFA
                                                                        TSFAFA
        LEN = M                                                         TSFAFA
        IF(IERR.GT.0) LEN = M + N                                       TSFAFA
                                                                        TSFAFA
        TSFAFA = HALF*DDOT(LEN,VN,1,VN,1)                               TSFAFA
                                                                        TSFAFA
        RETURN                                                          TSFAFA
        END                                                             TSFAFA
       SUBROUTINE TSFDFJ(XC,FC,NR,M,N,EPSM,TSFVEC,FHAT,AJA)             TSFDFJ
                                                                        TSFDFJ
       INTEGER NR,M,N                                                   TSFDFJ
       DOUBLE PRECISION EPSM                                            TSFDFJ
       DOUBLE PRECISION AJA(NR,N),FHAT(M),XC(N),FC(M)                   TSFDFJ
       EXTERNAL TSFVEC                                                  TSFDFJ
                                                                        TSFDFJ
C***********************************************************************TSFDFJ
C THIS ROUTINE COMPUTES THE FINITE DIFFERENCE JACOBIAN AT THE CURRENT   TSFDFJ
C ITERATE XC.                                                           TSFDFJ
C***********************************************************************TSFDFJ
C                                                                       TSFDFJ
C    INPUT PARAMETERS :                                                 TSFDFJ
C    ----------------                                                   TSFDFJ
C                                                                       TSFDFJ
C    XC   : CURRENT ITERATE                                             TSFDFJ
C    FC   : FUNCTION VALUE AT XC                                        TSFDFJ
C    NR   : LEADING DIMENSION OF AJA                                    TSFDFJ
C    M,N  : DIMENSIONS OF PROBLEM                                       TSFDFJ
C    EPSM : MACHINE PRECISION                                           TSFDFJ
C    TSFVEC : SUBROUTINE TO EVALUATE THE USER'S FUNCTION                TSFDFJ
C    FHAT : WORKSPACE                                                   TSFDFJ
C                                                                       TSFDFJ
C    OUTPUT PARAMETERS :                                                TSFDFJ
C    --------------------                                               TSFDFJ
C                                                                       TSFDFJ
C    AJA : FINITE DIFFERENCE JACOBIAN AT XC                             TSFDFJ
C                                                                       TSFDFJ
C    SUBPROGRAMS CALLED:                                                TSFDFJ
C                                                                       TSFDFJ
C    USER   ...  TSFVEC                                                 TSFDFJ
C                                                                       TSFDFJ
C***********************************************************************TSFDFJ
                                                                        TSFDFJ
       INTEGER I,J                                                      TSFDFJ
       DOUBLE PRECISION NDIGIT,RNOISE,STEPSZ,XTMPJ                      TSFDFJ
       DOUBLE PRECISION SQRTR,RSTPSZ,ONE,TEN                            TSFDFJ
       INTRINSIC ABS,MAX,SQRT                                           TSFDFJ
       DATA ONE,TEN/1.0D0,10.0D0/                                       TSFDFJ
                                                                        TSFDFJ
       NDIGIT = -LOG10(EPSM)                                            TSFDFJ
       RNOISE = MAX(TEN**(-NDIGIT),EPSM)                                TSFDFJ
       SQRTR = SQRT(RNOISE)                                             TSFDFJ
                                                                        TSFDFJ
       DO 20 J = 1,N                                                    TSFDFJ
          STEPSZ = SQRTR*MAX(ABS(XC(J)),ONE)                            TSFDFJ
          XTMPJ = XC(J)                                                 TSFDFJ
          XC(J) = XTMPJ+STEPSZ                                          TSFDFJ
          CALL TSFVEC(XC,FHAT,M,N)                                      TSFDFJ
          XC(J) = XTMPJ                                                 TSFDFJ
          RSTPSZ = ONE/STEPSZ                                           TSFDFJ
          DO 10 I = 1,M                                                 TSFDFJ
             AJA(I,J) = (FHAT(I)-FC(I))*RSTPSZ                          TSFDFJ
10       CONTINUE                                                      TSFDFJ
20    CONTINUE                                                         TSFDFJ
                                                                        TSFDFJ
       RETURN                                                           TSFDFJ
       END                                                              TSFDFJ
       SUBROUTINE TSFRMT(SHAT,S,AJA,FV,FN,MAXM,MAXN,MAXP,M,N,P,IDP,     TSFRMT
     +                   AM,X,B,SCALE,A)                                TSFRMT
                                                                        TSFRMT
       INTEGER MAXM,MAXN,MAXP,M,N,P                                     TSFRMT
       INTEGER IDP(P)                                                   TSFRMT
       DOUBLE PRECISION A(MAXM,P),SHAT(MAXN,P),S(MAXN,P),AJA(MAXM,N)    TSFRMT
       DOUBLE PRECISION FV(MAXM,P),FN(M),AM(MAXP,P),X(P),B(P),SCALE(P)  TSFRMT
                                                                        TSFRMT
C*********************************************************************  TSFRMT
C THIS ROUTINE FORM THE TENSOR TERM MATRIX OF THE TENSOR MODEL.         TSFRMT
C*********************************************************************  TSFRMT
C                                                                       TSFRMT
C       INPUT PARAMETERS :                                              TSFRMT
C       ----------------                                                TSFRMT
C                                                                       TSFRMT
C       SHAT: MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS            TSFRMT
C       S   : MATRIX OF PREVIOUS DIRECTIONS                             TSFRMT
C       AJA : JACOBIAN MATRIX AT CURRENT ITERATE                        TSFRMT
C       FV  : MATRIX OF PAST FUNCTION VALUES                            TSFRMT
C       FN  : FUNCTION VALUE AT CURRENT ITERATE                         TSFRMT
C       MAXM: LEADING DIMENSION OF AJA, ANLS, AND FV                    TSFRMT
C       MAXN: LEADING DIMENSION OF S AND SHAT                           TSFRMT
C       MAXP: LEADING DIMENSION OF AM                                   TSFRMT
C       M   : ROW DIMENSION OF MATRICES A,FV,AND AJA                    TSFRMT
C       N   : COLUMN DIMENSION OF JACOBIAN MATRIX                       TSFRMT
C       P   : COLUMN DIMENSION OF MATRIX SHAT                           TSFRMT
C       IDP : VECTOR WHICH KEEPS TRACK OF LINEARLY INDEPENDENT          TSFRMT
C             DIRECTION POSITIONS WITHIN THE MATRIX S                   TSFRMT
C       AM,X,B,SCALE,: WORKSPACE                                        TSFRMT
C                                                                       TSFRMT
C       OUTPUT PARAMETERS :                                             TSFRMT
C       ------------------                                              TSFRMT
C                                                                       TSFRMT
C       A   : TENSOR TERM MATRIX                                        TSFRMT
C                                                                       TSFRMT
C       SUBPROGRAMS CALLED:                                             TSFRMT
C                                                                       TSFRMT
C       LEVEL 1 BLAS  ...  DDOT,DNRM2,DSCAL                             TSFRMT
C       UNCMIN        ...  CHOLDC,LLTSLV                                TSFRMT
C                                                                       TSFRMT
C*********************************************************************  TSFRMT
                                                                        TSFRMT
       INTEGER I,J,JJ                                                   TSFRMT
       DOUBLE PRECISION SUM,SC,TOL,DIAGMX,ADDMAX                        TSFRMT
       DOUBLE PRECISION ZERO,ONE,TWO                                    TSFRMT
       DOUBLE PRECISION DDOT,DNRM2                                      TSFRMT
       DATA ZERO,ONE,TWO/0.0D0,1.0D0,2.0D0/                             TSFRMT
                                                                        TSFRMT
c scale the matrix SHAT and save scaling in SCALE                       TSFRMT
                                                                        TSFRMT
       DO 10 J = 1,P                                                    TSFRMT
          SC = ONE/DNRM2(N,SHAT(1,J),1)                                 TSFRMT
          CALL DSCAL(N,SC,SHAT(1,J),1)                                  TSFRMT
          SCALE(J) = SC**2                                              TSFRMT
10    CONTINUE                                                         TSFRMT
                                                                        TSFRMT
c form the matrix AM = (Si Sj)**2                                       TSFRMT
                                                                        TSFRMT
       DO 30 J = 1,P                                                    TSFRMT
          JJ = IDP(J)                                                   TSFRMT
          DO 20 I = 1,P                                                 TSFRMT
             AM(I,J) = DDOT(N,S(1,IDP(I)),1,S(1,JJ),1)**2               TSFRMT
20      CONTINUE                                                       TSFRMT
30   CONTINUE                                                          TSFRMT
                                                                        TSFRMT
c scale the matrix AM                                                   TSFRMT
                                                                        TSFRMT
       DO 50 I = 1,P                                                    TSFRMT
          DO 40 J = 1,P                                                 TSFRMT
             AM(I,J) = SCALE(I)*SCALE(J)*AM(I,J)                        TSFRMT
40      CONTINUE                                                       TSFRMT
50   CONTINUE                                                          TSFRMT
                                                                        TSFRMT
c perform a Cholesky decomposition of AM                                TSFRMT
                                                                        TSFRMT
       TOL = ZERO                                                       TSFRMT
       DIAGMX = ZERO                                                    TSFRMT
       CALL CHOLDC(MAXP,P,AM,DIAGMX,TOL,ADDMAX)                         TSFRMT
                                                                        TSFRMT
c form the tensor term matrix A                                         TSFRMT
                                                                        TSFRMT
       DO 70 I = 1,M                                                    TSFRMT
          DO 60 J = 1,P                                                 TSFRMT
             JJ = IDP(J)                                                TSFRMT
             SUM = DDOT(N,AJA(I,1),MAXM,S(1,JJ),1)                      TSFRMT
             B(J) = TWO*(FV(I,JJ) - FN(I) - SUM)                        TSFRMT
             B(J) = SCALE(J)*B(J)                                       TSFRMT
60       CONTINUE                                                      TSFRMT
                                                                        TSFRMT
c solve AM*X = B                                                        TSFRMT
                                                                        TSFRMT
          CALL LLTSLV(MAXP,P,AM,X,B)                                    TSFRMT
                                                                        TSFRMT
c copy X into row i of A                                                TSFRMT
                                                                        TSFRMT
          CALL DCOPY(P,X,1,A(I,1),MAXM)                                 TSFRMT
                                                                        TSFRMT
70    CONTINUE                                                         TSFRMT
                                                                        TSFRMT
       RETURN                                                           TSFRMT
       END                                                              TSFRMT
       SUBROUTINE TSFSCL(X,DX,DF,M,N,TSFVEC,F)                          TSFSCL
                                                                        TSFSCL
       INTEGER M,N                                                      TSFSCL
       DOUBLE PRECISION X(N),DX(N),F(M),DF(M)                           TSFSCL
       EXTERNAL TSFVEC                                                  TSFSCL
                                                                        TSFSCL
C********************************************************************   TSFSCL
C THIS ROUTINE EVALUATES THE FUNCTION AT THE CURRENT ITERATE X THEN     TSFSCL
C SCALES ITS VALUE.                                                     TSFSCL
C********************************************************************   TSFSCL
C                                                                       TSFSCL
C       INPUT PARAMETERS :                                              TSFSCL
C       -----------------                                               TSFSCL
C                                                                       TSFSCL
C       X  : CURRENT ITERATE                                            TSFSCL
C       DX : DIAGONAL SCALING MATRIX FOR X                              TSFSCL
C       DF : DIAGONAL SCALING MATRIX FOR F                              TSFSCL
C       M,N :  DIMENSIONS OF PROBLEM                                    TSFSCL
C       TSFVEC : SUBROUTINE TO EVALUATE FUNCTION                        TSFSCL
C                                                                       TSFSCL
C                                                                       TSFSCL
C       OUTPUT PARAMETERS :                                             TSFSCL
C       -----------------                                               TSFSCL
C                                                                       TSFSCL
C       F  : SCALED FUNCTION VALUE AT CURRENT ITERATE X                 TSFSCL
C                                                                       TSFSCL
C       SUBPROGRAMS CALLED:                                             TSFSCL
C                                                                       TSFSCL
C       TENSOLVE      ...  TSUNSX,TSSCLF,TSSCLX                         TSFSCL
C       USER          ...  TSFVEC                                       TSFSCL
C                                                                       TSFSCL
C********************************************************************   TSFSCL
                                                                        TSFSCL
       CALL TSUNSX(X,DX,N)                                              TSFSCL
       CALL TSFVEC(X,F,M,N)                                             TSFSCL
       CALL TSSCLF(F,DF,M)                                              TSFSCL
       CALL TSSCLX(X,DX,N)                                              TSFSCL
                                                                        TSFSCL
       RETURN                                                           TSFSCL
       END                                                              TSFSCL
       SUBROUTINE TSFSLV(L,B,NR,M,N,Y)                                  TSFSLV
                                                                        TSFSLV
       INTEGER NR,M,N                                                   TSFSLV
       DOUBLE PRECISION B(N),L(NR,N),Y(N)                               TSFSLV
                                                                        TSFSLV
C********************************************************************   TSFSLV
C THIS ROUTINE DOES A FORWARD SOLVE.                                    TSFSLV
C********************************************************************   TSFSLV
C                                                                       TSFSLV
C       INPUT PARAMETERS :                                              TSFSLV
C       -----------------                                               TSFSLV
C                                                                       TSFSLV
C       L   : THE TRANSPOSE OF THE UPPER TRIANGULAR MATRIX OBTAINED     TSFSLV
C             FROM A QR FACTORIZATION OF AN M BY N MATRIX A. DIAG(L)    TSFSLV
C             IS STORED IN ROW M+2. THIS IS THE STORAGE SCHEME USED     TSFSLV
C             IN STEWART, G. W., III(1973) "INTRODUCTION TO MATRIX      TSFSLV
C             COMPUTATION", ACADEMIC PRESS,NEW YORK                     TSFSLV
C       B   : RIGHT HAND SIDE                                           TSFSLV
C       NR  : LEADING DIMENSION OF MATRIX A                             TSFSLV
C        M  : ROW DIMENSION OF MATRIX A                                 TSFSLV
C        N  : COLUMN DIMENSION OF MATRIX A                              TSFSLV
C                                                                       TSFSLV
C       OUTPUT PARAMETERS :                                             TSFSLV
C       ------------------                                              TSFSLV
C                                                                       TSFSLV
C        Y  : VECTOR SOLUTION ON EXIT                                   TSFSLV
C                                                                       TSFSLV
C       SUBPROGRAMS CALLED:                                             TSFSLV
C                                                                       TSFSLV
C       LEVEL 1 BLAS  ...  DDOT                                         TSFSLV
C                                                                       TSFSLV
C*********************************************************************  TSFSLV
                                                                        TSFSLV
       INTEGER J                                                        TSFSLV
       DOUBLE PRECISION S                                               TSFSLV
       DOUBLE PRECISION DDOT                                            TSFSLV
                                                                        TSFSLV
c solve L Y = B                                                         TSFSLV
                                                                        TSFSLV
       Y(1) = B(1) / L(M+2,1)                                           TSFSLV
       IF(N .GT. 1) THEN                                                TSFSLV
          S = L(1,2) * Y(1)                                             TSFSLV
          Y(2) = (B(2) - S) / L(M+2,2)                                  TSFSLV
          DO 10 J = 3,N                                                 TSFSLV
             S = DDOT(J-1,L(1,J),1,Y,1)                                 TSFSLV
             Y(J) = (B(J) - S) / L(M+2,J)                               TSFSLV
10       CONTINUE                                                      TSFSLV
       ENDIF                                                            TSFSLV
                                                                        TSFSLV
       RETURN                                                           TSFSLV
       END                                                              TSFSLV
      SUBROUTINE TSJMUV(ITN,METHOD,V,CURPOS,PIVOT,PBAR,AJA,SHAT,        TSJMUV
     +                  FLAG,IERR,MAXM,MAXN,M,N,P,WRK1,WRK2,VN,AV)      TSJMUV
                                                                        TSJMUV
      INTEGER MAXM,MAXN,M,N,P,IERR,ITN,METHOD,FLAG                      TSJMUV
      INTEGER CURPOS(N),PIVOT(N),PBAR(N)                                TSJMUV
      DOUBLE PRECISION V(N),WRK1(N),WRK2(N),VN(M),AJA(MAXM,N)           TSJMUV
      DOUBLE PRECISION AV(N),SHAT(MAXN,P)                               TSJMUV
                                                                        TSJMUV
C****************************************************************       TSJMUV
C THIS ROUTINE CALCULATES THE PRODUCT JACOBIAN TIMES A VECTOR.          TSJMUV
C****************************************************************       TSJMUV
C                                                                       TSJMUV
C       INPUT PARAMETERS                                                TSJMUV
C       ----------------                                                TSJMUV
C                                                                       TSJMUV
C        ITN    : CURRENT ITERATION NUMBER                              TSJMUV
C        METHOD : METHOD TO BE USED                                     TSJMUV
C        V      : VECTOR TO BE MULTIPLIED BY AJA                        TSJMUV
C        CURPOS : PIVOT VECTOR (USED DURING THE FACTORIZATION OF AJA    TSJMUV
C                 FROM COLUMN 1 TO N-P)                                 TSJMUV
C        PIVOT  : PIVOT VECTOR (USED DURING THE FACTORIZATION OF AJA    TSJMUV
C                 FROM COLUMN N-P+1 TO N)                               TSJMUV
C        PBAR   : PIVOT VECTOR (USED DURING THE FACTORIZATION OF AJA    TSJMUV
C                 IF IT IS SINGULAR                                     TSJMUV
C        AJA    : JACOBIAN MATRIX AT CURRENT ITERATE                    TSJMUV
C        SHAT   : MATRIX OF LINEARLY INDEPENDENT DIRECTIONS AFTER       TSJMUV
C                 A QL FACTORIZATION                                    TSJMUV
C        FLAG   : RETURN CODE WITH THE FOLLOWING MEANINGS:              TSJMUV
C                FLAG = 0 : NO SINGULARITY DETECTED DURING FACTORIZATIONTSJMUV
C                           OF THE JACOBIAN FROM COLUMN 1 TO N          TSJMUV
C                FLAG = 1 : SINGULARITY DETECTED DURING FACTORIZATION   TSJMUV
C                           OF THE JACOBIAN FROM COLUMN 1 TO N-P        TSJMUV
C                FLAG = 2 : SINGULARITY DETECTED DURING FACTORIZATION   TSJMUV
C                           OF THE JACOBIAN FROM COLUMN N-P+1 TO N      TSJMUV
C        IERR   : RETURN CODE FROM QRP FACTORIZATION ROUTINE:           TSJMUV
C                IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED         TSJMUV
C                IERR = 1 : SINGULARITY OF JACOBIAN DETECTED            TSJMUV
C        MAXM   : LEADING DIMENSION OF AJA                              TSJMUV
C        MAXN   : LEADING DIMENSION OF SHAT                             TSJMUV
C        M,N    : DIMENSIONS OF THE PROBLEM                             TSJMUV
C        P      : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS        TSJMUV
C        WRK1,WRK2,VN : WORKSPACE VECTORS                               TSJMUV
C                                                                       TSJMUV
C       OUTPUT PARAMETERS                                               TSJMUV
C       -----------------                                               TSJMUV
C                                                                       TSJMUV
C        AV     : JACOBIAN TIMES V                                      TSJMUV
C                                                                       TSJMUV
C       SUBPROGRAMS CALLED:                                             TSJMUV
C                                                                       TSJMUV
C       LEVEL 1 BLAS  ...  DCOPY                                        TSJMUV
C       TENSOLVE      ...  TSPRMV,TSQMLV,TSUTMD                         TSJMUV
C                                                                       TSJMUV
C **********************************************************************TSJMUV
                                                                        TSJMUV
      INTEGER LEN                                                       TSJMUV
      IF(ITN .EQ. 1 .OR. METHOD .EQ. 0) THEN                            TSJMUV
         CALL TSPRMV(WRK1,V,PIVOT,N,1)                                  TSJMUV
         IF(IERR .EQ. 1) THEN                                           TSJMUV
           CALL TSPRMV(WRK2,WRK1,PBAR,N,1)                              TSJMUV
           CALL DCOPY(N,WRK2,1,WRK1,1)                                  TSJMUV
         ENDIF                                                          TSJMUV
      ELSEIF(N .EQ. 1) THEN                                             TSJMUV
           VN(1) = V(1)                                                 TSJMUV
      ELSE                                                              TSJMUV
           CALL TSQMLV(MAXN,N,P,SHAT,V,VN,.FALSE.)                      TSJMUV
           CALL TSPRMV(WRK2,VN,CURPOS,N,1)                              TSJMUV
           IF(FLAG .EQ. 0) THEN                                         TSJMUV
              CALL TSPRMV(WRK1,WRK2,PIVOT,N,1)                          TSJMUV
           ELSEIF(FLAG .EQ. 1) THEN                                     TSJMUV
              CALL TSPRMV(WRK1,WRK2,PBAR,N,1)                           TSJMUV
           ELSEIF(FLAG .EQ. 2 ) THEN                                    TSJMUV
              CALL TSPRMV(WRK1,WRK2,PIVOT,N,1)                          TSJMUV
              CALL TSPRMV(WRK2,WRK1,PBAR,N,1)                           TSJMUV
              CALL DCOPY(N,WRK2,1,WRK1,1)                               TSJMUV
           ENDIF                                                        TSJMUV
      ENDIF                                                             TSJMUV
                                                                        TSJMUV
      LEN = M                                                           TSJMUV
      IF(IERR .GT. 0) LEN = M + N                                       TSJMUV
                                                                        TSJMUV
      CALL TSUTMD(AJA,WRK1,MAXM,LEN,N,AV)                               TSJMUV
                                                                        TSJMUV
      RETURN                                                            TSJMUV
      END                                                               TSJMUV
       SUBROUTINE TSJQTP(Q,MAXM,MAXN,N,M,P,WRK1,WRK2,AJA)               TSJQTP
                                                                        TSJQTP
       INTEGER MAXM,MAXN,N,M,P                                          TSJQTP
       DOUBLE PRECISION AJA(MAXM,N),Q(MAXN,P),WRK1(N),WRK2(N)           TSJQTP
                                                                        TSJQTP
C********************************************************************** TSJQTP
C THIS ROUTINE GETS J*(Q-TRANS) BY COMPUTING EACH ROW OF THE            TSJQTP
C RESULTING MATRIX AS FOLLOWS : (J*Q-TRANS)I-TH ROW<--Q*(J)I-TH ROW.    TSJQTP
C********************************************************************** TSJQTP
C                                                                       TSJQTP
C       INPUT PARAMETERS :                                              TSJQTP
C       -----------------                                               TSJQTP
C                                                                       TSJQTP
C       Q    : RESULTING MATRIX FROM A QL FACTORIZATION                 TSJQTP
C       MAXM : LEADING DIMENSION OF AJA                                 TSJQTP
C       MAXN : LEADING DIMENSION OF Q                                   TSJQTP
C       M,N  : DIMENSIONS OF PROBLEM                                    TSJQTP
C       P    : COLUMN DIMENSION OF MATRIX Q                             TSJQTP
C       WRK1,WRK2: WORKING VECTOR                                       TSJQTP
C                                                                       TSJQTP
C       INPUT-OUTPUT PARAMETERS :                                       TSJQTP
C       ------------------------                                        TSJQTP
C                                                                       TSJQTP
C       AJA : JACOBIAN MATRIX ON ENTRY AND JACOBIAN MULTIPLIED BY THE   TSJQTP
C             ORTHOGONAL MATRIX Q ON EXIT                               TSJQTP
C                                                                       TSJQTP
C       SUBPROGRAMS CALLED:                                             TSJQTP
C                                                                       TSJQTP
C       LEVEL 1 BLAS  ...  DCOPY                                        TSJQTP
C       TENSOLVE      ...  TSQMLV                                       TSJQTP
C                                                                       TSJQTP
C********************************************************************** TSJQTP
                                                                        TSJQTP
       INTEGER I                                                        TSJQTP
                                                                        TSJQTP
       DO 30 I = 1,M                                                    TSJQTP
                                                                        TSJQTP
c copy the i-th row of AJA into WRK1                                    TSJQTP
                                                                        TSJQTP
          CALL DCOPY(N,AJA(I,1),MAXM,WRK1,1)                            TSJQTP
                                                                        TSJQTP
          CALL TSQMLV(MAXN,N,P,Q,WRK1,WRK2,.FALSE.)                     TSJQTP
                                                                        TSJQTP
c form the i-th row of AJA*(Q-trans)                                    TSJQTP
                                                                        TSJQTP
          CALL DCOPY(N,WRK2,1,AJA(I,1),MAXM)                            TSJQTP
                                                                        TSJQTP
30    CONTINUE                                                         TSJQTP
                                                                        TSJQTP
       RETURN                                                           TSJQTP
       END                                                              TSJQTP
       SUBROUTINE TSLMIN(XC,XP,P1,Q,ANLS,FQ,ADT,AG,CONST1,CONST2,       TSLMIN
     +                   DLT,NR,M,N,P,NWTAKE,IERR,TOL,VN,VNP,VNS,XPLUS) TSLMIN
                                                                        TSLMIN
        INTEGER NR,M,N,P,IERR                                           TSLMIN
        DOUBLE PRECISION XC,XP,XPLUS,P1,Q,DLT,TOL                       TSLMIN
        DOUBLE PRECISION ADT(N),AG(N),VN(M),VNP(M),VNS(M)               TSLMIN
        DOUBLE PRECISION ANLS(NR,P),FQ(M),CONST1(P),CONST2(P)           TSLMIN
        LOGICAL NWTAKE                                                  TSLMIN
                                                                        TSLMIN
C***********************************************************************TSLMIN
C THIS ROUTINE FINDS A LOCAL MINIMIZER OF A ONE-VARIABLE FUNCTION IN AN TSLMIN
C INTERVAL [XC XP].                                                     TSLMIN
C***********************************************************************TSLMIN
C                                                                       TSLMIN
C       INPUT PARAMETERS :                                              TSLMIN
C       -----------------                                               TSLMIN
C                                                                       TSLMIN
C       XC,XP  : LOWER AND UPPER BOUND OF INTERVAL IN WHICH THE SEARCH  TSLMIN
C                IS PERFORMED                                           TSLMIN
C       P1,Q   : FIRST DERIVATIVES OF THE ONE-VARIABLE FUNCTION         TSLMIN
C       ANLS   : TENSOR TERM MATRIX                                     TSLMIN
C       FQ     : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY        TSLMIN
C                ORTHOGONAL MATRICES                                    TSLMIN
C       ADT    : JACOBIAN TIMES THE STEP DT (SEE SUBROUTINE TS2DTR)     TSLMIN
C       AG     : JACOBIAN TIMES THE GRADIENT G (SEE SUBROUTINE TS2DTR)  TSLMIN
C       CONST1 : SHAT-TRANS * DT  (SEE SUBROUTINE TS2DTR)               TSLMIN
C       CONST2 : SHAT-TRANS * GBAR (SEE SUBROUTINE TS2DTR)              TSLMIN
C       DLT    : TRUST RADIUS                                           TSLMIN
C       NR     : LEADING DIMENSION OF ANLS MATRIX                       TSLMIN
C       M,N    : DIMENSIONS OF PROBLEM                                  TSLMIN
C       P      : COLUMN DIMENSION OF MATRIX ANLS                        TSLMIN
C       NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS:          TSLMIN
C                NWTAKE = .TRUE.  : STANDARD STEP TAKEN                 TSLMIN
C                NWTAKE = .FALSE. : TENSOR STEP TAKEN                   TSLMIN
C       IERR   : RETURN CODE FROM QRP FACTORIZATION ROUTINE:            TSLMIN
C                IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED         TSLMIN
C                IERR = 1 : OTHERWISE                                   TSLMIN
C       TOL    : SMALL TOLERANCE                                        TSLMIN
C       VN,VNP,VNS : WORKING VECTORS                                    TSLMIN
C                                                                       TSLMIN
C                                                                       TSLMIN
C       OUTPUT PARAMETERS :                                             TSLMIN
C       -----------------                                               TSLMIN
C                                                                       TSLMIN
C       XPLUS  :  LOCAL MINIMIZER OF THE ONE-VARIABLE FUNCTION          TSLMIN
C                                                                       TSLMIN
C       SUBPROGRAMS CALLED :                                            TSLMIN
C                                                                       TSLMIN
C       TENSOLVE      ...  TSMSDA,TSFAFA,TSLMSP,TSMFDA                  TSLMIN
C                                                                       TSLMIN
C***********************************************************************TSLMIN
                                                                        TSLMIN
        INTEGER ITERCD,RETCD,ITNCNT                                     TSLMIN
        DOUBLE PRECISION ALEFT,ARIGHT,T,E,TSMSDA,S,SINIT,TSFAFA,TSMFDA  TSLMIN
        DOUBLE PRECISION ZERO,OTT,TWO,SMALL                             TSLMIN
        LOGICAL SKIP                                                    TSLMIN
        INTRINSIC ABS,MIN,MAX                                           TSLMIN
        DATA ZERO,OTT,TWO,SMALL/0.0D0,1.0D-4,2.0D0,2.0D-20/             TSLMIN
                                                                        TSLMIN
        ALEFT = MIN(XC,XP)                                              TSLMIN
        ARIGHT = MAX(XC,XP)                                             TSLMIN
        ITNCNT = 0                                                      TSLMIN
        T = ABS(XC-XP)                                                  TSLMIN
        SKIP = .FALSE.                                                  TSLMIN
                                                                        TSLMIN
c compute the second derivative value at the current point              TSLMIN
                                                                        TSLMIN
        E = TSMSDA(ANLS,FQ,ADT,AG,CONST1,CONST2,XC,DLT,                 TSLMIN
     +             NR,M,N,P,NWTAKE,IERR,SKIP,VN,VNP,VNS)                TSLMIN
                                                                        TSLMIN
10     IF(E.GT.ZERO) THEN                                              TSLMIN
           S = -P1/E                                                    TSLMIN
           IF(ABS(S).GT.TWO*T) THEN                                     TSLMIN
              IF (S.LT.ZERO) THEN                                       TSLMIN
                  S = -TWO*T                                            TSLMIN
              ELSE                                                      TSLMIN
                  S = TWO*T                                             TSLMIN
              ENDIF                                                     TSLMIN
           ENDIF                                                        TSLMIN
        ELSE                                                            TSLMIN
           IF (P1.GT.ZERO) THEN                                         TSLMIN
               S = -T                                                   TSLMIN
           ELSE                                                         TSLMIN
               S = T                                                    TSLMIN
           ENDIF                                                        TSLMIN
        ENDIF                                                           TSLMIN
                                                                        TSLMIN
        IF(XC+S.GT.ARIGHT) S = ARIGHT-XC                                TSLMIN
        IF(XC+S.LT.ALEFT)  S = ALEFT-XC                                 TSLMIN
        SINIT = ABS(S)                                                  TSLMIN
                                                                        TSLMIN
20     CONTINUE                                                        TSLMIN
                                                                        TSLMIN
c compute a next iterate XPLUS                                          TSLMIN
                                                                        TSLMIN
        IF (TSFAFA(ANLS,FQ,ADT,AG,CONST1,CONST2,XC+S,DLT,               TSLMIN
     +      NR,M,N,P,NWTAKE,IERR,VN).GT.Q + OTT*S*P1) THEN              TSLMIN
            S = S/2                                                     TSLMIN
            IF(ABS(S).LT.SMALL*SINIT.OR.S.EQ.ZERO) THEN                 TSLMIN
               RETCD = 1                                                TSLMIN
            ELSE                                                        TSLMIN
               GO TO 20                                                 TSLMIN
            ENDIF                                                       TSLMIN
        ENDIF                                                           TSLMIN
                                                                        TSLMIN
        XPLUS = XC+S                                                    TSLMIN
        ITNCNT = ITNCNT+1                                               TSLMIN
                                                                        TSLMIN
c check stopping criteria                                               TSLMIN
                                                                        TSLMIN
        CALL TSLMSP(XC,XPLUS,ITNCNT,RETCD,ITERCD,ANLS,ADT,AG,           TSLMIN
     +              CONST1,CONST2,DLT,NR,M,N,P,NWTAKE,IERR,TOL,VN,VNP)  TSLMIN
                                                                        TSLMIN
        IF(ITERCD.GT.0) RETURN                                          TSLMIN
                                                                        TSLMIN
c update XC                                                             TSLMIN
                                                                        TSLMIN
        XC = XPLUS                                                      TSLMIN
                                                                        TSLMIN
c compute function and derivative values at the new point               TSLMIN
                                                                        TSLMIN
        Q = TSFAFA(ANLS,FQ,ADT,AG,CONST1,CONST2,XC,DLT,                 TSLMIN
     +             NR,M,N,P,NWTAKE,IERR,VN)                             TSLMIN
        P1 = TSMFDA(ANLS,ADT,AG,CONST1,CONST2,XC,DLT,                   TSLMIN
     +              NR,M,N,P,NWTAKE,IERR,VN,VNP)                        TSLMIN
        SKIP = .TRUE.                                                   TSLMIN
        E = TSMSDA(ANLS,FQ,ADT,AG,CONST1,CONST2,XC,DLT,                 TSLMIN
     +             NR,M,N,P,NWTAKE,IERR,SKIP,VN,VNP,VNS)                TSLMIN
        GO TO 10                                                        TSLMIN
                                                                        TSLMIN
        END                                                             TSLMIN
       SUBROUTINE TSLMSP(XC,XP,ITNCNT,RETCD,ITERCD,ANLS,ADT,AG,CONST1,  TSLMSP
     +                  CONST2,DLT,NR,M,N,P,NWTAKE,IERR,TOL,VN,VNP)     TSLMSP
                                                                        TSLMSP
       INTEGER NR,M,N,P,IERR,RETCD,ITERCD,ITNCNT                        TSLMSP
       DOUBLE PRECISION XC,XP,DLT,TOL                                   TSLMSP
       DOUBLE PRECISION ADT(N),AG(N),CONST1(P)                          TSLMSP
       DOUBLE PRECISION CONST2(P),VN(M),VNP(M),ANLS(NR,P)               TSLMSP
       LOGICAL NWTAKE                                                   TSLMSP
                                                                        TSLMSP
C***********************************************************************TSLMSP
C THIS ROUTINE CHECKS THE STOPPING CRITERIA FOR A LOCAL MINIMIZER.      TSLMSP
C***********************************************************************TSLMSP
C                                                                       TSLMSP
C       INPUT PARAMETERS :                                              TSLMSP
C       -----------------                                               TSLMSP
C                                                                       TSLMSP
C       XC       : CURRENT ITERATE (FROM SEARCH SUBROUTINE)             TSLMSP
C       XP       : NEXT ITERATE (FROM SEARCH SUBROUTINE)                TSLMSP
C       ITNCNT   : ITERATION LIMIT                                      TSLMSP
C       RETCD    : RETURN CODE FROM LINE SEARCH                         TSLMSP
C       DLT      : TRUST RADIUS                                         TSLMSP
C       AJA      : JACOBIAN AT THE CURRENT ITERATE                      TSLMSP
C       NR       : LEADING DIMENSION OF THE JACOBIAN MATRIX             TSLMSP
C       M,N      : DIMENSIONS OF THE PROBLEM                            TSLMSP
C       P        : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS       TSLMSP
C       NWTAKE   : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS :       TSLMSP
C                  NWTAKE = .TRUE.  : STANDARD STEP TAKEN               TSLMSP
C                  NWTAKE = .FALSE. : TENSOR STEP TAKEN                 TSLMSP
C       IERR     : RETURN CODE FROM THE QRP FACTORIZATION ROUTINE :     TSLMSP
C                  IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED       TSLMSP
C                  IERR = 1 : OTHERWISE                                 TSLMSP
C       TOL      : SMALL TOLERANCE                                      TSLMSP
C       METHOD   : METHOD TO USE                                        TSLMSP
C                = 0   : STANDARD METHOD USED                           TSLMSP
C                = 1   : TENSOR METHOD USED                             TSLMSP
C       VN,VNP  : WORKING VECTORS                                       TSLMSP
C                                                                       TSLMSP
C                                                                       TSLMSP
C       OUTPUT PARAMETERS :                                             TSLMSP
C       ------------------                                              TSLMSP
C                                                                       TSLMSP
C       ITERCD  : RETURN CODE WITH FOLLOWING MEANINGS :                 TSLMSP
C                 ITERCD = 1 : FIRST DERIVATIVE AT THE CURRENT POINT    TSLMSP
C                              CLOSE TO 0                               TSLMSP
C                 ITERCD = 2 : SUCCESSIVE ITERATES WITHIN TOLERANCE     TSLMSP
C                 ITERCD = 3 : LINE SEARCH FAILED TO LOCATE A POINT     TSLMSP
C                              LOWER THAT THE CURRENT POINT             TSLMSP
C                 ITERCD = 4 : ITERATION LIMIT EXCEEDED                 TSLMSP
C                                                                       TSLMSP
C***********************************************************************TSLMSP
                                                                        TSLMSP
        DOUBLE PRECISION TSMFDA,GRDT,ZERO                               TSLMSP
        INTRINSIC DABS,SQRT                                             TSLMSP
        DATA ZERO/0.0D0/                                                TSLMSP
                                                                        TSLMSP
        GRDT = SQRT(TOL)                                                TSLMSP
        ITERCD = 0                                                      TSLMSP
                                                                        TSLMSP
        IF(RETCD.EQ.1) THEN                                             TSLMSP
           ITERCD = 3                                                   TSLMSP
        ELSEIF(DABS(TSMFDA(ANLS,ADT,AG,CONST1,CONST2,XP,DLT,            TSLMSP
     +         NR,M,N,P,NWTAKE,IERR,VN,VNP)) .LT. GRDT) THEN            TSLMSP
               ITERCD = 1                                               TSLMSP
        ELSEIF(XP.NE.ZERO .AND. DABS(XP-XC)/DABS(XP).LE.TOL) THEN       TSLMSP
               ITERCD = 2                                               TSLMSP
        ELSEIF(ITNCNT.GE.150) THEN                                      TSLMSP
               ITERCD = 4                                               TSLMSP
        ENDIF                                                           TSLMSP
                                                                        TSLMSP
        RETURN                                                          TSLMSP
        END                                                             TSLMSP
       SUBROUTINE TSLSCH(M,N,XC,FC,D,G,STEPTL,DX,DF,TSFVEC,             TSLSCH
     +                   MXTAKE,STEPMX,XP,FP,FCNORM,FPNORM,RETCD)       TSLSCH
                                                                        TSLSCH
       INTEGER M,N,RETCD                                                TSLSCH
       DOUBLE PRECISION STEPTL,FCNORM,FPNORM                            TSLSCH
       DOUBLE PRECISION XC(N),FC(M)                                     TSLSCH
       DOUBLE PRECISION D(N),G(N),XP(N),FP(M)                           TSLSCH
       DOUBLE PRECISION DX(N),DF(M),STEPMX                              TSLSCH
       LOGICAL MXTAKE                                                   TSLSCH
       EXTERNAL TSFVEC                                                  TSLSCH
                                                                        TSLSCH
C********************************************************************** TSLSCH
C THIS ROUTINE FINDS A NEXT ITERATE USING A STANDARD LINE SEARCH METHOD.TSLSCH
C********************************************************************** TSLSCH
C                                                                       TSLSCH
C       INPUT PARAMETERS :                                              TSLSCH
C       -----------------                                               TSLSCH
C                                                                       TSLSCH
C       M,N : DIMENSIONS OF PROBLEM                                     TSLSCH
C       XC  : CURRENT ITERATE                                           TSLSCH
C       FC  : FUNCTION VALUE AT CURRENT ITERATE                         TSLSCH
C       D   : SEARCH DIRECTION                                          TSLSCH
C       G   : GRADIENT AT CURRENT ITERATE                               TSLSCH
C       STEPTL : RELATIVE STEP SIZE AT WHICH SUCCESSIVE ITERATES        TSLSCH
C                ARE CONSIDERED CLOSE ENOUGH TO TERMINATE ALGORITHM     TSLSCH
C       DX  : DIAGONAL SCALING MATRIX FOR X                             TSLSCH
C       DF  : DIAGONAL SCALING MATRIX FOR F                             TSLSCH
C       TSFVEC: SUBROUTINE TO EVALUATE THE FUNCTION                     TSLSCH
C       STEPMX: MAXIMUM ALLOWABLE STEP SIZE                             TSLSCH
C                                                                       TSLSCH
C                                                                       TSLSCH
C       OUTPUT PARAMETERS :                                             TSLSCH
C       -----------------                                               TSLSCH
C                                                                       TSLSCH
C       MXTAKE: BOOLEAN FLAG INDICATING STEP OF MAXIMUM LENGTH USED     TSLSCH
C       XP : NEXT ITARATE                                               TSLSCH
C       FP : FUNCTION VALUE AT NEXT ITERATE                             TSLSCH
C       FCNORM : 0.5 * || F(XC) ||**2                                   TSLSCH
C       FPNORM : 0.5 * || F(XP) ||**2                                   TSLSCH
C       RETCD : RETURN CODE WITH THE FOLLOWING MEANING :                TSLSCH
C                RETCD = 0 : SATISFACTORY LOCATION OF A NEW ITERATE     TSLSCH
C                RETCD = 1 : NO SATISFACTORY POINT FOUND SUFFICIENTLY   TSLSCH
C                            DISTINCT FROM X                            TSLSCH
C  TSLSCH
C       SUBPROGRAMS CALLED:                                             TSLSCH
C  TSLSCH
C       LEVEL 1 BLAS  ...  DDOT,DNRM2                                   TSLSCH
C       TENSOLVE      ...  TSFSCL                                       TSLSCH
C       USER          ...  TSFVEC                                       TSLSCH
C                                                                TSLSCH
C********************************************************************** TSLSCH
                                                                        TSLSCH
       INTEGER I,COUNT                                                  TSLSCH
       DOUBLE PRECISION ALPHA,SLOPE,RELENG                              TSLSCH
       DOUBLE PRECISION TEMP1,TEMP2,ALMDA,TEMP,ALMDAT,ALMDAM            TSLSCH
       DOUBLE PRECISION SLN,SCL                                         TSLSCH
       DOUBLE PRECISION DDOT,DNRM2                                      TSLSCH
       DOUBLE PRECISION ZERO,TENTH,HALF,Z99,ONE,TWO,TEN                 TSLSCH
       INTRINSIC ABS                                                    TSLSCH
       PARAMETER (ALPHA = 1.0D-4)                                       TSLSCH
       DATA ZERO,TENTH,HALF,Z99,ONE,TWO,TEN/0.0D0,0.10D0,0.50D0,0.99D0, TSLSCH
     + 1.0D0,2.0D0,10.0D0/                                              TSLSCH
                                                                        TSLSCH
       MXTAKE = .FALSE.                                                 TSLSCH
       SLN = DNRM2(N,D,1)                                               TSLSCH
       IF(SLN .GT. STEPMX) THEN                                         TSLSCH
                                                                        TSLSCH
c step longer than maximum allowed                                      TSLSCH
                                                                        TSLSCH
          SCL = STEPMX/SLN                                              TSLSCH
          CALL DSCAL(N,SCL,D,1)                                         TSLSCH
          SLN = STEPMX                                                  TSLSCH
       ENDIF                                                            TSLSCH
                                                                        TSLSCH
c compute SLOPE  =  G-trans * D                                         TSLSCH
                                                                        TSLSCH
       SLOPE = DDOT(N,G,1,D,1)                                          TSLSCH
                                                                        TSLSCH
c initialization of RETCD                                               TSLSCH
                                                                        TSLSCH
       RETCD = 0                                                        TSLSCH
                                                                        TSLSCH
c compute the smallest value allowable for the damping                  TSLSCH
c parameter ALMDA, i.e, ALMDAM                                          TSLSCH
                                                                        TSLSCH
       RELENG = ZERO                                                    TSLSCH
       DO 20 I = 1,N                                                    TSLSCH
         TEMP1 = MAX(ABS(XC(I)), ONE)                                   TSLSCH
         TEMP2 = ABS(D(I))/TEMP1                                        TSLSCH
         RELENG = MAX(RELENG,TEMP2)                                     TSLSCH
20    CONTINUE                                                         TSLSCH
       ALMDAM = STEPTL/RELENG                                           TSLSCH
       ALMDA = ONE                                                      TSLSCH
                                                                        TSLSCH
       COUNT=0                                                          TSLSCH
                                                                        TSLSCH
40    CONTINUE                                                         TSLSCH
                                                                        TSLSCH
       COUNT=COUNT+1                                                    TSLSCH  
                                                                        TSLSCH
c compute the next iterate XP                                           TSLSCH
                                                                        TSLSCH
       DO 50 I = 1,N                                                    TSLSCH
          XP(I) = XC(I)+ALMDA*D(I)                                      TSLSCH
50    CONTINUE                                                         TSLSCH
                                                                        TSLSCH
c evaluate the objective function at XP and its residual                TSLSCH
                                                                        TSLSCH
       CALL TSFSCL(XP,DX,DF,M,N,TSFVEC,FP)                              TSLSCH
                                                                        TSLSCH
       FPNORM = HALF*DNRM2(M,FP,1)**2                                   TSLSCH
                                                                        TSLSCH
c test whether the full step produces enough decrease in                TSLSCH
c the l2 norm of the objective function. If not update ALMDA            TSLSCH
c and compute a new step                                                TSLSCH  
                                                                        TSLSCH
       IF (FPNORM.GT.(FCNORM + (ALPHA* ALMDA * SLOPE))) THEN            TSLSCH
          ALMDAT = ((-ALMDA**2)*SLOPE)/(TWO*(FPNORM-FCNORM-ALMDA*SLOPE))TSLSCH
          TEMP = ALMDA/TEN                                              TSLSCH
          IF (COUNT.GT.2000) THEN                                       TSLSCH
             RETCD = 1                                                  TSLSCH
             RETURN                                                     TSLSCH
          ENDIF                                                         TSLSCH
          IF (ALMDAT.GT.ONE) THEN                                       TSLSCH
             ALMDA=TEMP                                                 TSLSCH
             GO TO 40                                                   TSLSCH
          END IF                                                        TSLSCH
          ALMDA = MAX(TEMP,ALMDAT)                                      TSLSCH
          IF(ALMDA.LT.ALMDAM) THEN                                      TSLSCH
             RETCD = 1                                                  TSLSCH
             RETURN                                                     TSLSCH
          ENDIF                                                         TSLSCH
          GO TO 40                                                      TSLSCH
       ELSE                                                             TSLSCH
          IF(ALMDA.EQ.TENTH .AND. SLN.GT.Z99*STEPMX) MXTAKE=.TRUE.      TSLSCH
       ENDIF                                                            TSLSCH
                                                                        TSLSCH
       RETURN                                                           TSLSCH
       END                                                              TSLSCH
       SUBROUTINE TSMAFA(ANLS,F,ADT,AG,CONST1,CONST2,ALPHA,DLT,         TSMAFA
     +                   NR,M,N,P,NWTAKE,IERR,VN)                       TSMAFA
                                                                        TSMAFA
       INTEGER NR,M,N,P,IERR                                            TSMAFA
       DOUBLE PRECISION ALPHA,DLT                                       TSMAFA
       DOUBLE PRECISION ADT(N),AG(N),CONST1(P)                          TSMAFA
       DOUBLE PRECISION CONST2(P),F(M),VN(M),ANLS(NR,P)                 TSMAFA
       LOGICAL NWTAKE                                                   TSMAFA
                                                                        TSMAFA
C***********************************************************************TSMAFA
C THIS ROUTINE COMPUTES THE VECTOR VN = F(XC) + J(XC)*D + 0.5*A*D**2,   TSMAFA
C WHERE D = ALPHA*DT + SQRT(DLT**2-ALPHA**2).                           TSMAFA
C***********************************************************************TSMAFA
C                                                                       TSMAFA
C                                                                       TSMAFA
C      INPUT PARAMETERS :                                               TSMAFA
C      -----------------                                                TSMAFA
C                                                                       TSMAFA
C      ANLS  : TENSOR TERM MATRIX                                       TSMAFA
C       ADT  : JACOBIAN MATRIX TIMES DT (SEE SUBROUTINE TS2DTR)         TSMAFA
C        AG  : JACOBIAN MATRIX TIMES GBAR (SEE SUBROUTINE TS2DTR)       TSMAFA
C      CONST1: SHAT-TRANS * DT (SEE SUBROUTINE TS2DTR)                  TSMAFA
C      CONST2: SHAT-TRABS * GBAR (SEE SUBROUTINE TS2DTR)                TSMAFA
C      ALPHA : POINT AT WHICH DERIVATIVE IS EVALUATED                   TSMAFA
C        DLT : CURRENT TRUST RADIUS                                     TSMAFA
C        NR  : LEADING DIMENSION OF ANLS                                TSMAFA
C        M,N : DIMENSIONS OF THE PROBLEM                                TSMAFA
C        P   : COLUMN DIMENSION OF THE MATRIX ANLS                      TSMAFA
C        NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS          TSMAFA
C                 NWTAKE = .TRUE.  : STANDARD STEP TAKEN                TSMAFA
C                 NWTAKE = .FALSE. : TENSOR STEP TAKEN                  TSMAFA
C       IERR : RETURN CODE FROM THE QRP FACTORIZATION ROUTINE :         TSMAFA
C              IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED           TSMAFA
C              IERR = 1 : SINGULARITY OF JACOBIAN DETECTED              TSMAFA
C                                                                       TSMAFA
C       OUTPUT PARAMETERS :                                             TSMAFA
C       -------------------                                             TSMAFA
C                                                                       TSMAFA
C       VN  : F + J*D + 0.5*A*D**2, WHERE                               TSMAFA
C             D = ALPHA*DT + SQRT(DLT**2-ALPHA**2)                      TSMAFA
C                                                                       TSMAFA
C       SUBPROGRAMS CALLED:                                             TSMAFA
C                                                                       TSMAFA
C       LEVEL 1 BLAS  ...  DLOAD,DAXPY                                  TSMAFA
C                                                                       TSMAFA
C*******************************************************************    TSMAFA
                                                                        TSMAFA
       INTEGER I,J,LEN                                                  TSMAFA
       DOUBLE PRECISION EXPR,CONST,ZERO,HALF                            TSMAFA
       INTRINSIC SQRT                                                   TSMAFA
       DATA ZERO,HALF/0.0D0,0.50D0/                                     TSMAFA
                                                                        TSMAFA
       EXPR = SQRT(DLT**2 - ALPHA**2)                                   TSMAFA
       DO 10 I = 1,N                                                    TSMAFA
          VN(I) = ALPHA*ADT(I) + EXPR*AG(I)                             TSMAFA
10    CONTINUE                                                         TSMAFA
                                                                        TSMAFA
       CALL DLOAD (M,ZERO,VN(N+1),1)                                    TSMAFA
                                                                        TSMAFA
       LEN = M                                                          TSMAFA
       IF(IERR .GT. 0) LEN = M + N                                      TSMAFA
                                                                        TSMAFA
       DO 30 I = 1, LEN                                                 TSMAFA
          VN(I) = VN(I) + F(I)                                          TSMAFA
30    CONTINUE                                                         TSMAFA
                                                                        TSMAFA
       IF(NWTAKE) RETURN                                                TSMAFA
       DO 70 J = 1,P                                                    TSMAFA
          CONST = HALF*(ALPHA*CONST1(J) + EXPR*CONST2(J))**2            TSMAFA
          CALL DAXPY(LEN,CONST,ANLS(1,J),1,VN,1)                        TSMAFA
70    CONTINUE                                                         TSMAFA
                                                                        TSMAFA
       RETURN                                                           TSMAFA
       END                                                              TSMAFA
       SUBROUTINE TSMDLS(AJA,SHAT,ANLS,XC,FC,M,N,MAXM,MAXN,P,DT,G,      TSMDLS
     +                   DX,DF,TSFVEC,METHOD,STEPTL,GLOBAL,STEPMX,      TSMDLS
     +                   EPSM,FQ,WRK1,WRK2,WRK3,WRK4,DN,FQQ,PIVOT,      TSMDLS
     +                   CURPOS,PBAR,MXTAKE,XP,FP,FCNORM,FPNORM,        TSMDLS
     +                   ZERO1,RETCD,IERR)                              TSMDLS
                                                                        TSMDLS
        INTEGER M,N,MAXM,MAXN,P,METHOD,GLOBAL,ZERO1,RETCD,IERR          TSMDLS
        INTEGER PIVOT(N),PBAR(N),CURPOS(N)                              TSMDLS
        DOUBLE PRECISION STEPTL,STEPMX,EPSM,FCNORM,FPNORM               TSMDLS
        DOUBLE PRECISION AJA(MAXM,N),SHAT(MAXN,P),ANLS(MAXM,P)          TSMDLS
        DOUBLE PRECISION XC(N),FC(M),DT(N),G(N),DX(N),DF(M),FQ(M)       TSMDLS
        DOUBLE PRECISION WRK1(M),WRK2(M),WRK3(M),WRK4(N)                TSMDLS
        DOUBLE PRECISION DN(N),FQQ(M),XP(N),FP(M)                       TSMDLS
        LOGICAL MXTAKE                                                  TSMDLS
        EXTERNAL TSFVEC                                                 TSMDLS
                                                                        TSMDLS
C********************************************************************** TSMDLS
C THIS ROUTINE FINDS A NEXT ITERATE USING A LINE SEARCH METHOD.  IT     TSMDLS  
C TRIES THE FULL TENSOR STEP FIRST. IF THIS IS NOT SUCCESSFUL THEN      TSMDLS
C IT COMPUTES THE STANDARD DIRECTION AND COMPUTES A STEP IN THAT        TSMDLS
C DIRECTION. NEXT, IF THE TENSOR DIRECTION IS DESCENT, IT COMPUTES      TSMDLS
C A STEP IN THE TENSOR DIRECTION.  THE ITERATE THAT PRODUCES            TSMDLS
C THE LOWER RESIDUAL IS THE NEXT ITERATE FOR THE NONLINEAR ALGORITHM.   TSMDLS  
C********************************************************************** TSMDLS
C                                                                       TSMDLS
C   INPUT PARAMETERS                                                    TSMDLS
C   ----------------                                                    TSMDLS
C                                                                       TSMDLS
C       AJA    : JACOBIAN AT CURRENT ITERATE                            TSMDLS
C       SHAT   : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS         TSMDLS
C                AFTER A QL FACORIZATION                                TSMDLS
C       ANLS   : TENSOR TERM MATRIX                                     TSMDLS
C       XC     : CURRENT ITERATE                                        TSMDLS
C       FC     : FUNCTION VALUE AT CURRENT ITERATE                      TSMDLS
C       M,N    : DIMENSIONS OF THE PROBLEM                              TSMDLS
C       MAXM   : LEADING DIMENSION OF AJA AND ANLS                      TSMDLS
C       MAXN   : LEADING DIMENSION OF SHAT                              TSMDLS
C       P      : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS         TSMDLS
C       DT     : TENSOR STEP                                            TSMDLS
C       G      : GRADIENT AT CURRENT ITERATE                            TSMDLS
C       DX     : DIAGONAL SCALING MATRIX FOR X                          TSMDLS
C       DF     : DIAGONAL SCALING MATRIX FOR F                          TSMDLS
C       GBAR   : STEEPEST DESCENT DIRECTION (= -G)                      TSMDLS
C       METHOD : METHOD TO USE                                          TSMDLS
C                = 0  : STANDARD METHOD USED                            TSMDLS
C                = 1  : TENSOR METHOD USED                              TSMDLS
C       STEPTL : STEP TOLERANCE                                         TSMDLS
C       GLOBAL : GLOBAL STRATEGY USED                                   TSMDLS
C                   =  0 : LINE SEARCH IS USED                          TSMDLS
C                   =  1 : 2-DIMENSIONAL TRUST REGION IS USED           TSMDLS
C       STEPMX : MAXIMUM ALLOWABLE STEP SIZE                            TSMDLS
C       EPSM   : MACHINE PRECISION                                      TSMDLS
C       FQ     : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY AN     TSMDLS
C                ORTHOGOL MATRIX                                        TSMDLS
C       WRK1,WRK2,WRK3,WRK4 : WORKING VECTORS                           TSMDLS
C                                                                       TSMDLS
C                                                                       TSMDLS
C       OUTPUT PARAMETERS                                               TSMDLS
C       -----------------                                               TSMDLS
C                                                                       TSMDLS
C       DN     : NEWTON STEP                                            TSMDLS
C       FQQ    : FQ MULTIPLIED BY AN ORTHOGONAL MATRIX                  TSMDLS
C       CURPOS : PIVOT VECTOR (USED DURING THE FACTORIZATION OF THE     TSMDLS
C                JACOBIAN FROM COLUMN 1 TO N-P)                         TSMDLS
C       PIVOT  : PIVOT VECTOR (USED DURING THE FACTORIZATION OF THE     TSMDLS
C                JACOBIAN FROM COLUMN N-P+1 TO N)                       TSMDLS
C       PBAR   : PIVOT VECTOR (USED DURING THE FACTORIZATION OF THE     TSMDLS
C                JACOBIAN IF IT IS SINGULAR                             TSMDLS
C       MXTAKE : BOOLEAN FLAG INDICATING STEP OF MAXIMUM LENGTH USED    TSMDLS
C       XP     : NEXT ITERATE                                           TSMDLS
C       FP     : FUNCTION VALUE AT NEXT ITERATE                         TSMDLS
C       FCNORM :  0.5 * || F(XC) ||**2                                  TSMDLS
C       FPNORM :  0.5 * || F(XP) ||**2                                  TSMDLS
C        ZERO1 : FIRST ZERO COLUMN OF THE JACOBIAN IN CASE OF           TSMDLS
C                SINGULARITY                                            TSMDLS
C       RETCD  : RETURN CODE WITH THE FOLLOWING MEANING :               TSMDLS
C                RETCD  =  0 : SATISFACTORY LOCATION OF A NEW ITERATE   TSMDLS
C                RETCD  =  1 : NO SATISFACTORY POINT FOUND SUFFICIENTLY TSMDLS
C                              DISTINCT FROM X                          TSMDLS
C       IERR   : RETURN CODE FROM THE QRP FACTORIZATION ROUTINE         TSMDLS
C                IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED         TSMDLS
C                IERR = 1 : SINGULARITY OF JACOBIAN DETECTED            TSMDLS
C                                                                       TSMDLS
C       SUBPROGRAMS CALLED:                                             TSMDLS
C                                                                       TSMDLS
C       LEVEL 1 BLAS  ...  DCOPY,DDOT,DNRM2                             TSMDLS
C       TENSOLVE      ...  TSFSCL,TSCPSS,TSLSCH                         TSMDLS
C                                                                       TSMDLS
C***********************************************************************TSMDLS
                                                                        TSMDLS
        INTEGER I,FLAG,RETCD1                                           TSMDLS
        DOUBLE PRECISION ALPHA,SLOPE,RELENG                             TSMDLS
        DOUBLE PRECISION TEMP1,TEMP2,ALMDA,RESNEW,F1N,DTNORM,GNORM      TSMDLS
        DOUBLE PRECISION SLN,SCL                                        TSMDLS
        DOUBLE PRECISION BETA,TEMP,ALMDAT,ALMDAM                        TSMDLS
        DOUBLE PRECISION DDOT,DNRM2                                     TSMDLS
        DOUBLE PRECISION ZERO,TENTH,HALF,Z99,ONE,TWO,TEN                TSMDLS
        INTRINSIC ABS                                                   TSMDLS
        PARAMETER (ALPHA = 1.0D-4)                                      TSMDLS
        DATA ZERO,TENTH,HALF,Z99,ONE,TWO,TEN/0.0D0,0.10D0,0.50D0,0.99D0,TSMDLS
     +  1.0D0,2.0D0,10.0D0/                                             TSMDLS
                                                                        TSMDLS
        MXTAKE = .FALSE.                                                TSMDLS
        SLN = DNRM2(N,DT,1)                                             TSMDLS
        IF(SLN .GT. STEPMX) THEN                                        TSMDLS
                                                                        TSMDLS
c step longer than maximum allowed                                      TSMDLS
                                                                        TSMDLS
           SCL = STEPMX/SLN                                             TSMDLS
           CALL DSCAL(N,SCL,DT,1)                                       TSMDLS
           SLN = STEPMX                                                 TSMDLS
        ENDIF                                                           TSMDLS
                                                                        TSMDLS
c compute SLOPE = G-Trans * DT                                          TSMDLS
                                                                        TSMDLS
        SLOPE = DDOT(N,G,1,DT,1)                                        TSMDLS
                                                                        TSMDLS
c initialization of RETCD                                               TSMDLS
                                                                        TSMDLS
        RETCD = 0                                                       TSMDLS
                                                                        TSMDLS
c compute the smallest value allowable for the damping                  TSMDLS
c parameter ALMDA, i.e, ALMDAM                                          TSMDLS
                                                                        TSMDLS
        RELENG = ZERO                                                   TSMDLS
        DO 20 I = 1,N                                                   TSMDLS
           TEMP1 = MAX(ABS(XC(I)), ONE)                                 TSMDLS
           TEMP2 = ABS(DT(I))/TEMP1                                     TSMDLS
           RELENG = MAX(RELENG, TEMP2)                                  TSMDLS
20     CONTINUE                                                        TSMDLS
        ALMDAM = STEPTL/RELENG                                          TSMDLS
        ALMDA = ONE                                                     TSMDLS
                                                                        TSMDLS
c compute the next iterate XP                                           TSMDLS
                                                                        TSMDLS
        DO 30 I = 1,N                                                   TSMDLS
           XP(I) = XC(I)+ALMDA*DT(I)                                    TSMDLS
30     CONTINUE                                                        TSMDLS
                                                                        TSMDLS
c evaluate the objective function at XP and its residual                TSMDLS
                                                                        TSMDLS
        CALL TSFSCL(XP,DX,DF,M,N,TSFVEC,FP)                             TSMDLS
                                                                        TSMDLS
        FPNORM = HALF*DNRM2(M,FP,1)**2                                  TSMDLS
                                                                        TSMDLS
c test whether the full tensor step produces enough decrease in the     TSMDLS
c l2 norm of of the objective function                                  TSMDLS
                                                                        TSMDLS
        IF (FPNORM.LT.(FCNORM + (ALPHA* ALMDA * SLOPE))) RETURN         TSMDLS
                                                                        TSMDLS
c compute the standard direction                                        TSMDLS
                                                                        TSMDLS
        CALL TSCPSS(SHAT,MAXM,MAXN,M,N,P,METHOD,GLOBAL,EPSM,FQ,         TSMDLS
     +              WRK1,WRK2,WRK3,WRK4,AJA,ANLS,DN,FQQ,PIVOT,          TSMDLS
     +              CURPOS,PBAR,ZERO1,IERR,RESNEW,FLAG)                 TSMDLS
                                                                        TSMDLS
c compute a step in the standard direction                              TSMDLS
                                                                        TSMDLS
        CALL TSLSCH(M,N,XC,FC,DN,G,STEPTL,DX,DF,TSFVEC,                 TSMDLS
     +              MXTAKE,STEPMX,WRK1,WRK2,FCNORM,F1N,RETCD1)          TSMDLS
                                                                        TSMDLS
c test whether the tensor direction is descent                          TSMDLS
                                                                        TSMDLS
        DTNORM = DNRM2(N,DT,1)                                          TSMDLS
        GNORM = DNRM2(N,G,1)                                            TSMDLS
        IF(M.GT.N) THEN                                                 TSMDLS
           BETA = TENTH                                                 TSMDLS
        ELSE                                                            TSMDLS
           BETA = ALPHA                                                 TSMDLS
        ENDIF                                                           TSMDLS
        TEMP1 = -BETA*DTNORM*GNORM                                      TSMDLS
                                                                        TSMDLS
c compute a step in the tensor direction                                TSMDLS
                                                                        TSMDLS
        IF(SLOPE .LE. TEMP1) THEN                                       TSMDLS
50      CONTINUE                                                       TSMDLS
         ALMDAT = ((-ALMDA**2)*SLOPE)/(TWO*(FPNORM-FCNORM-ALMDA*SLOPE)) TSMDLS
           TEMP = ALMDA/TEN                                             TSMDLS
           ALMDA = MAX(TEMP, ALMDAT)                                    TSMDLS
           IF(ALMDA.LT.ALMDAM) THEN                                     TSMDLS
              IF(RETCD1. EQ. 1) THEN                                    TSMDLS
                 RETCD = 1                                              TSMDLS
                 GO TO 70                                               TSMDLS
              ENDIF                                                     TSMDLS
           ENDIF                                                        TSMDLS
           DO 60 I = 1,N                                                TSMDLS
              XP(I) = XC(I)+ALMDA*DT(I)                                 TSMDLS
60        CONTINUE                                                     TSMDLS
           CALL TSFSCL(XP,DX,DF,M,N,TSFVEC,FP)                          TSMDLS
           FPNORM = HALF*DNRM2(M,FP,1)**2                               TSMDLS
           IF (FPNORM .GT.(FCNORM + (ALPHA* ALMDA * SLOPE))) GO TO 50   TSMDLS
           IF(ALMDA.EQ.TENTH .AND. SLN.GT.Z99*STEPMX) MXTAKE=.TRUE.     TSMDLS
70        CONTINUE                                                     TSMDLS
                                                                        TSMDLS
c select the next iterate that produces the lower function value        TSMDLS
                                                                        TSMDLS
           IF(F1N .LT. FPNORM) THEN                                     TSMDLS
              CALL DCOPY(N,WRK1,1,XP,1)                                 TSMDLS
              CALL DCOPY(M,WRK2,1,FP,1)                                 TSMDLS
              FPNORM  =  F1N                                            TSMDLS
           ENDIF                                                        TSMDLS
        ELSE                                                            TSMDLS
           CALL DCOPY(N,WRK1,1,XP,1)                                    TSMDLS
           CALL DCOPY(M,WRK2,1,FP,1)                                    TSMDLS
           FPNORM = F1N                                                 TSMDLS
        ENDIF                                                           TSMDLS
                                                                        TSMDLS
        RETURN                                                          TSMDLS
        END                                                             TSMDLS
       FUNCTION TSMFDA(ANLS,ADT,AG,CONST1,CONST2,ALPHA,DLT,             TSMFDA
     +                 NR,M,N,P,NWTAKE,IERR,VN,VNP)                     TSMFDA
                                                                        TSMFDA
       INTEGER NR,M,N,P,IERR                                            TSMFDA
       DOUBLE PRECISION ALPHA,DLT,TSMFDA                                TSMFDA
       DOUBLE PRECISION ADT(N),AG(N),CONST1(P),CONST2(P),VN(M),VNP(M)   TSMFDA
       DOUBLE PRECISION ANLS(NR,P)                                      TSMFDA
       LOGICAL NWTAKE                                                   TSMFDA
                                                                        TSMFDA
C***********************************************************************TSMFDA
C THIS FUNCTION COMPUTES THE DERIVATIVE OF || F + J*D + 0.5*A*D**2 ||**2TSMFDA
C IN THE L2 NORM SENS, WHERE D = ALPHA*DT + SQRT(DLT**2-ALPHA**2).      TSMFDA
C***********************************************************************TSMFDA
C                                                                       TSMFDA
C                                                                       TSMFDA
C   INPUT PARAMETERS                                                    TSMFDA
C   ----------------                                                    TSMFDA
C                                                                       TSMFDA
C       ANLS   : TENSOR MATRIX                                          TSMFDA
C       FQ     : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY        TSMFDA
C                ORTHOGONAL MATRICES                                    TSMFDA
C       ADT    : JACOBIAN MATRIX TIMES DT (SEE SUBROUTINE TS2DTR)       TSMFDA
C       AG     : JACOBIAN MATRIX TIMES GBAR (SEE SUBROUTINE TS2DTR)     TSMFDA
C       CONST1 : SHAT-TRANS TIMES DT (SEE SUBROUTINE TS2DTR)            TSMFDA
C       CONST2 : SHAT-TRANS TIMES GBAR (SEE SUBROUTINE TS2DTR)          TSMFDA
C       ALPHA  : POINT AT WHICH TO EVALUATE THE DERIVATIVE OF FUNCTION  TSMFDA
C       DLT    : CURRENT TRUST RADIUS                                   TSMFDA
C       NR     : LEADING DIMENSION OF THE JACOBIAN                      TSMFDA
C       M,N    : DIMENSIONS OF THE PROBLEM                              TSMFDA
C       P      : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS         TSMFDA
C       NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS:          TSMFDA
C                NWTAKE = .TRUE.  : STANDARD STEP TAKEN                 TSMFDA
C                NWTAKE = .FALSE. : TENSOR STEP TAKEN                   TSMFDA
C       IERR   : RETURN CODE FROM QRP FACTORIZATION ROUTINE:            TSMFDA
C                IERR=0 : NO SINGULARITY OF JACOBIAN DETECTED           TSMFDA
C                IERR=1 : SINGULARITY OF JACOBIAN DETECTED              TSMFDA
C                                                                       TSMFDA
C                                                                       TSMFDA
C       OUTPUT PARAMETERS                                               TSMFDA
C       -----------------                                               TSMFDA
C                                                                       TSMFDA
C                                                                       TSMFDA
C       VN     : F + J*D + 0.5*A*D**2                                   TSMFDA
C       VNP    : DERIVATIVE IN ALPHA OF F + J*D + 0.5*A*D**2            TSMFDA
C       TSMFDA : DERIVATIVE IN ALPHA OF || F + J*D + 0.5*A*D**2 ||**2   TSMFDA
C                WHERE D = ALPHA*DT + SQRT(DLT**2-ALPHA**2)             TSMFDA
C                                                                       TSMFDA
C       SUBPROGRAMS CALLED:                                             TSMFDA
C                                                                       TSMFDA
C       LEVEL 1 BLAS  ...  DDOT                                         TSMFDA
C       TENSOLVE      ...  TSMFDV                                       TSMFDA
C                                                                       TSMFDA
C***********************************************************************TSMFDA
                                                                        TSMFDA
       INTEGER LEN                                                      TSMFDA
       DOUBLE PRECISION DDOT                                            TSMFDA
                                                                        TSMFDA
       CALL TSMFDV(ANLS,ADT,AG,CONST1,CONST2,ALPHA,DLT,                 TSMFDA
     +                   NR,M,N,P,NWTAKE,IERR,VNP)                      TSMFDA
                                                                        TSMFDA
       LEN = M                                                          TSMFDA
       IF(IERR.GT.0) LEN = M + N                                        TSMFDA
                                                                        TSMFDA
       TSMFDA = DDOT(LEN,VNP,1,VN,1)                                    TSMFDA
                                                                        TSMFDA
       RETURN                                                           TSMFDA
       END                                                              TSMFDA
       SUBROUTINE TSMFDV(ANLS,ADT,AG,CONST1,CONST2,ALPHA,DLT,           TSMFDV
     +                   NR,M,N,P,NWTAKE,IERR,VNP)                      TSMFDV
                                                                        TSMFDV
       INTEGER NR,M,N,P,IERR                                            TSMFDV
       DOUBLE PRECISION ALPHA,DLT                                       TSMFDV
       DOUBLE PRECISION ADT(N),AG(N),CONST1(P)                          TSMFDV
       DOUBLE PRECISION CONST2(P),VNP(M),ANLS(NR,P)                     TSMFDV
       LOGICAL NWTAKE                                                   TSMFDV
                                                                        TSMFDV
C***********************************************************************TSMFDV
C THIS ROUTINE COMPUTES THE DERIVATIVE IN ALPHA OF THE VECTOR           TSMFDV
C VN = F(XC) + J(XC)*D + 0.5*A*D**2, WHERE D = ALPHA*DT +               TSMFDV
C SQRT(DLT**2-ALPHA**2).                                                TSMFDV
C***********************************************************************TSMFDV
C                                                                       TSMFDV
C                                                                       TSMFDV
C      INPUT PARAMETERS :                                               TSMFDV
C      -----------------                                                TSMFDV
C                                                                       TSMFDV
C      ANLS  : TENSOR TERM MATRIX                                       TSMFDV
C       ADT  : JACOBIAN MATRIX TIMES DT (SEE SUBROUTINE TS2DTR)         TSMFDV
C        AG  : JACOBIAN MATRIX TIMES GBAR (SEE SUBROUTINE TS2DTR)       TSMFDV
C      CONST1: SHAT-TRANS TIMES DT (SEE SUBROUTINE TS2DTR)              TSMFDV
C      CONST2: SHAT-TRANS TIMES GBAR (SEE SUBROUTINE TS2DTR)            TSMFDV
C      ALPHA : POINT AT WHICH DERIVATIVE IS EVALUATED                   TSMFDV
C        DLT : CURRENT TRUST RADIUS                                     TSMFDV
C        NR  : LEADING DIMENSION OF ANLS                                TSMFDV
C        M,N : DIMENSIONS OF THE PROBLEM                                TSMFDV
C        P   : COLUMN DIMENSION OF THE MATRIX ANLS                      TSMFDV
C        NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS :        TSMFDV
C                NWTAKE = .TRUE.  : STANDARD STEP TAKEN                 TSMFDV
C                NWTAKE = .FALSE. : TENSOR STEP TAKEN                   TSMFDV
C        IERR : RETURN CODE FROM THE QRP FACTORIZATION ROUTINE          TSMFDV
C               IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED          TSMFDV
C               IERR = 1 : SINGULARITY OF JACOBIAN DETECTED             TSMFDV
C                                                                       TSMFDV
C                                                                       TSMFDV
C       OUTPUT PARAMETERS :                                             TSMFDV
C       -------------------                                             TSMFDV
C                                                                       TSMFDV
C       VNP  : THE DERIVATIVE IN ALPHA OF VN = F(XC) + J(XC)*D +        TSMFDV
C              0.5*A*D**2, WHERE D = ALPHA*DT +  SQRT(DLT**2-ALPHA**2)  TSMFDV
C                                                                       TSMFDV
C       SUBPROGRAMS CALLED:                                             TSMFDV
C                                                                       TSMFDV
C       LEVEL 1 BLAS  ...  DLOAD,DAXPY                                  TSMFDV
C                                                                       TSMFDV
C*******************************************************************    TSMFDV
                                                                        TSMFDV
       INTEGER I,J,LEN                                                  TSMFDV
       DOUBLE PRECISION QUANT1,QUANT2,EXPR,CONST                        TSMFDV
       DOUBLE PRECISION ZERO,HALF,TWO                                   TSMFDV
       INTRINSIC SQRT                                                   TSMFDV
       DATA ZERO,HALF,TWO/0.0D0,0.50D0,2.0D0/                           TSMFDV
                                                                        TSMFDV
       QUANT1 = SQRT(DLT**2 - ALPHA**2)                                 TSMFDV
       EXPR = - ALPHA/QUANT1                                            TSMFDV
                                                                        TSMFDV
       DO 10 I = 1,N                                                    TSMFDV
          VNP(I) = ADT(I) + EXPR*AG(I)                                  TSMFDV
10    CONTINUE                                                         TSMFDV
                                                                        TSMFDV
       CALL DLOAD (M,ZERO,VNP(N+1),1)                                   TSMFDV
                                                                        TSMFDV
       IF(NWTAKE) RETURN                                                TSMFDV
                                                                        TSMFDV
       QUANT2 = QUANT1 - ALPHA**2/QUANT1                                TSMFDV
                                                                        TSMFDV
       LEN = M                                                          TSMFDV
       IF(IERR.GT.0) LEN = M + N                                        TSMFDV
                                                                        TSMFDV
       DO 30 J = 1,P                                                    TSMFDV
           CONST = HALF*(TWO*ALPHA*(CONST1(J)**2 - CONST2(J)**2)        TSMFDV
     +             +TWO*CONST1(J)*CONST2(J)*QUANT2)                     TSMFDV
           CALL DAXPY(LEN,CONST,ANLS(1,J),1,VNP,1)                      TSMFDV
30    CONTINUE                                                         TSMFDV
                                                                        TSMFDV
       RETURN                                                           TSMFDV
       END                                                              TSMFDV
       SUBROUTINE TSMGSA(S,NR,N,SQRN,ITN,SHAT,P,IDP)                    TSMGSA
                                                                        TSMGSA
       INTEGER NR,N,SQRN,ITN,P                                          TSMGSA
       INTEGER IDP(SQRN)                                                TSMGSA
       DOUBLE PRECISION S(NR,SQRN),SHAT(NR,SQRN)                        TSMGSA
                                                                        TSMGSA
C*********************************************************************  TSMGSA
C THIS ROUTINE FINDS A SET OF LINEARLY INDEPENDENT DIRECTIONS USING     TSMGSA
C THE MODIFIED GRAM-SCHMIDT ALGORITHM.                                  TSMGSA
C*********************************************************************  TSMGSA
C                                                                       TSMGSA
C       INPUT PARAMETERS :                                              TSMGSA
C       ---------------                                                 TSMGSA
C                                                                       TSMGSA
C       S   : MATRIX OF PAST DIRECTIONS                                 TSMGSA
C       NR  : LEADING DIMENSION OF THE MATRICES S AND SHAT              TSMGSA
C       N   : ROW DIMENSION OF MATRIX S AND SHAT                        TSMGSA
C       SQRN: MAXIMUM COLUMN DIMENSION OF SHAT                          TSMGSA
C       ITN : CURRENT ITERATION NUMBER                                  TSMGSA
C                                                                       TSMGSA
C       OUTPUT PARAMETERS :                                             TSMGSA
C       -------------------                                             TSMGSA
C                                                                       TSMGSA
C       SHAT: MATRIX OF LINEARLY INDEPENDENT DIRECTIONS                 TSMGSA
C       P   : COLUMN DIMENSION OF THE MATRIX SHAT                       TSMGSA
C       IDP : VECTOR THAT KEEPS TRACK OF THE INDICES CORRESPONDING TO   TSMGSA
C             THE LINEARLY INDEPENDENT DIRECTIONS IN THE MATRIX S       TSMGSA
C                                                                       TSMGSA
C       SUBPROGRAMS CALLED:                                             TSMGSA
C                                                                       TSMGSA
C       LEVEL 1 BLAS  ...  DAXPY,DCOPY,DDOT,DNRM2                       TSMGSA
C                                                                       TSMGSA
C*********************************************************************  TSMGSA
                                                                        TSMGSA
       INTEGER J,K,L                                                    TSMGSA
       DOUBLE PRECISION TOL,TJ,SJ,SUM,RTJS,ONE,TWO                      TSMGSA
       DOUBLE PRECISION DNRM2,DDOT                                      TSMGSA
       INTRINSIC SQRT                                                   TSMGSA
       DATA ONE,TWO/1.0D0,2.0D0/                                        TSMGSA
                                                                        TSMGSA
       IF(SQRN.LT.ITN) THEN                                             TSMGSA
          K = SQRN                                                      TSMGSA
       ELSE                                                             TSMGSA
          K = ITN-1                                                     TSMGSA
       ENDIF                                                            TSMGSA
                                                                        TSMGSA
       TOL = SQRT(TWO)/TWO                                              TSMGSA
                                                                        TSMGSA
       DO 10 J = 1,K                                                    TSMGSA
         CALL DCOPY(N,S(1,J),1,SHAT(1,J),1)                             TSMGSA
10    CONTINUE                                                         TSMGSA
                                                                        TSMGSA
       P = 0                                                            TSMGSA
       DO 30 J = 1,K                                                    TSMGSA
          TJ = DNRM2(N,SHAT(1,J),1)                                     TSMGSA
          SJ = DNRM2(N,S(1,J),1)                                        TSMGSA
          IF(TJ/SJ.GT.TOL) THEN                                         TSMGSA
              P = P+1                                                   TSMGSA
              IDP(P) = J                                                TSMGSA
              RTJS = ONE/TJ**2                                          TSMGSA
              DO 20 L = J+1,K                                           TSMGSA
                 SUM = -RTJS*DDOT(N,SHAT(1,L),1,SHAT(1,J),1)            TSMGSA
                 CALL DAXPY(N,SUM,SHAT(1,J),1,SHAT(1,L),1)              TSMGSA
20           CONTINUE                                                  TSMGSA
           ENDIF                                                        TSMGSA
30    CONTINUE                                                         TSMGSA
                                                                        TSMGSA
       DO 40 J = 1,P                                                    TSMGSA
          CALL DCOPY(N,S(1,IDP(J)),1,SHAT(1,J),1)                       TSMGSA
40    CONTINUE                                                         TSMGSA
                                                                        TSMGSA
       RETURN                                                           TSMGSA
       END                                                              TSMGSA
       FUNCTION TSMSDA(ANLS,FQ,ADT,AG,CONST1,CONST2,ALPHA,              TSMSDA
     +                 DLT,NR,M,N,P,NWTAKE,IERR,SKIP,VN,VNP,VNS)        TSMSDA
                                                                        TSMSDA
       INTEGER NR,M,N,P,IERR                                            TSMSDA
       DOUBLE PRECISION ALPHA,DLT,TSMSDA                                TSMSDA
       DOUBLE PRECISION ADT(N),AG(N),VN(M),VNP(M)                       TSMSDA
       DOUBLE PRECISION VNS(M),ANLS(NR,P),FQ(M)                         TSMSDA
       DOUBLE PRECISION CONST1(P),CONST2(P)                             TSMSDA
       LOGICAL NWTAKE                                                   TSMSDA
                                                                        TSMSDA
C***********************************************************************TSMSDA
C THIS FUNCTION COMPUTES THE SECOND DERIVATIVE OF || F + J*D +          TSMSDA
C 0.5*A*D**2 ||**2 IN THE L2 NORM SENS, WHERE D = ALPHA*DT +            TSMSDA
C SQRT(DLT**2-ALPHA**2).                                                TSMSDA
C***********************************************************************TSMSDA
C                                                                       TSMSDA
C                                                                       TSMSDA
C   INPUT PARAMETERS                                                    TSMSDA
C   ----------------                                                    TSMSDA
C                                                                       TSMSDA
C       ANLS   : TENSOR TERM MATRIX AT CURRENT ITERATE                  TSMSDA
C       FQ     : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY        TSMSDA
C                ORTHOGONAL MATRICES                                    TSMSDA
C       ADT    : JACOBIAN MATRIX TIMES DT (SEE SUBROUTINE TS2DTR)       TSMSDA
C        AG    : JACOBIAN MATRIX TIMES GBAR (SEE SUBROUTINE TS2DTR)     TSMSDA
C       CONST1 : SHAT-TRANS TIMES DT (SEE SUBROUTINE TS2DTR)            TSMSDA
C       CONST2 : SHAT-TRANS TIMES GBAR (SEE SUBROUTINE TS2DTR)          TSMSDA
C       ALPHA  : POINT AT WHICH TO EVALUATE THE SECOND DERIVATIVE OF    TSMSDA
C                FUNCTION                                               TSMSDA
C       DLT    : CURRENT TRUST RADIUS                                   TSMSDA
C       NR     : LEADING DIMENSION OF THE JACOBIAN                      TSMSDA
C       M,N    : DIMENSIONS OF THE PROBLEM                              TSMSDA
C       P      : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS         TSMSDA
C       NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS:          TSMSDA
C                NWTAKE = .TRUE.  : STANDARD STEP TAKEN                 TSMSDA
C                NWTAKE = .FALSE. : TENSOR STEP TAKEN                   TSMSDA
C       IERR   : RETURN CODE FROM QRP FACTORIZATION ROUTINE             TSMSDA
C                IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED         TSMSDA
C                IERR = 1 : SINGULARITY OF JACOBIAN DETECTED            TSMSDA
C                                                                       TSMSDA
C                                                                       TSMSDA
C       OUTPUT PARAMETERS                                               TSMSDA
C       -----------------                                               TSMSDA
C                                                                       TSMSDA
C       VN     : F + J*D + 0.5*A*D**2                                   TSMSDA
C       VNP    : DERIVATIVE IN ALPHA OF F + J*D + 0.5*A*D**2            TSMSDA
C       VNS    : SECOND DERIVATIVE IN ALPHA OF F + J*D + 0.5*A*D**2     TSMSDA
C       TSMSDA : SECOND DERIVATIVE IN ALPHA OF || F + J*D +             TSMSDA
C                0.5*A*D**2 ||**2                                       TSMSDA
C                WHERE D=ALPHA*DT + SQRT(DLT**2-ALPHA**2)               TSMSDA
C                                                                       TSMSDA
C       SUBPROGRAMS CALLED:                                             TSMSDA
C                                                                       TSMSDA
C       LEVEL 1 BLAS  ...  DDOT                                         TSMSDA
C       TENSOLVE      ...  TSMAFA,TSMFDV,TSMSDV                         TSMSDA
C                                                                       TSMSDA
C***********************************************************************TSMSDA
                                                                        TSMSDA
       INTEGER LEN                                                      TSMSDA
       DOUBLE PRECISION DDOT                                            TSMSDA
       LOGICAL SKIP                                                     TSMSDA
                                                                        TSMSDA
       IF(.NOT. SKIP) THEN                                              TSMSDA
          CALL TSMAFA(ANLS,FQ,ADT,AG,CONST1,CONST2,ALPHA,DLT,           TSMSDA
     +                NR,M,N,P,NWTAKE,IERR,VN)                          TSMSDA
          CALL TSMFDV(ANLS,ADT,AG,CONST1,CONST2,ALPHA,DLT,              TSMSDA
     +                NR,M,N,P,NWTAKE,IERR,VNP)                         TSMSDA
       ENDIF                                                            TSMSDA
                                                                        TSMSDA
       CALL TSMSDV(ANLS,AG,CONST1,CONST2,ALPHA,DLT,                     TSMSDA
     +             NR,M,N,P,NWTAKE,IERR,VNS)                            TSMSDA
                                                                        TSMSDA
       LEN = M                                                          TSMSDA
       IF(IERR.GT.0) LEN = M + N                                        TSMSDA
                                                                        TSMSDA
       TSMSDA = DDOT(LEN,VNP,1,VNP,1)+DDOT(M,VNS,1,VN,1)                TSMSDA
                                                                        TSMSDA
       RETURN                                                           TSMSDA
       END                                                              TSMSDA
       SUBROUTINE TSMSDV(ANLS,AG,CONST1,CONST2,ALPHA,DLT,               TSMSDV
     +                   NR,M,N,P,NWTAKE,IERR,VNS)                      TSMSDV
                                                                        TSMSDV
       INTEGER NR,M,N,P,IERR                                            TSMSDV
       DOUBLE PRECISION ALPHA,DLT                                       TSMSDV
       DOUBLE PRECISION AG(N),CONST1(P)                                 TSMSDV
       DOUBLE PRECISION CONST2(P),VNS(M),ANLS(NR,P)                     TSMSDV
       LOGICAL NWTAKE                                                   TSMSDV
                                                                        TSMSDV
C***********************************************************************TSMSDV
C THIS ROUTINE COMPUTES THE SECOND DERIVATIVE IN ALPHA OF THE VECTOR    TSMSDV
C VN = F(XC) + J(XC)*D + 0.5*A*D**2, WHERE D = ALPHA*DT +               TSMSDV
C SQRT(DLT**2-ALPHA**2).                                                TSMSDV
C***********************************************************************TSMSDV
C                                                                       TSMSDV
C                                                                       TSMSDV
C      INPUT PARAMETERS :                                               TSMSDV
C      -----------------                                                TSMSDV
C                                                                       TSMSDV
C      ANLS  : TENSOR TERM MATRIX                                       TSMSDV
C       ADT  : JACOBIAN MATRIX TIMES DT (SEE SUBROUTINE TS2DTR)         TSMSDV
C        AG  : JACOBIAN MATRIX TIMES GBAR (SEE SUBROUTINE TS2DTR)       TSMSDV
C      CONST1: SHAT-TRANS * DT (SEE SUBROUTINE TS2DTR)                  TSMSDV
C      CONST2: SHAT-TRABS * GBAR (SEE SUBROUTINE TS2DTR)                TSMSDV
C      ALPHA : POINT AT WHICH DERIVATIVE IS EVALUATED                   TSMSDV
C        DLT : CURRENT TRUST RADIUS                                     TSMSDV
C        NR  : LEADING DIMENSION OF ANLS                                TSMSDV
C        M,N : DIMENSIONS OF THE PROBLEM                                TSMSDV
C        P   : COLUMN DIMENSION OF THE MATRIX ANLS                      TSMSDV
C        NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS :        TSMSDV
C                 NWTAKE = .TRUE.  : STANDARD STEP TAKEN                TSMSDV
C                 NWTAKE = .FALSE. : TENSOR STEP TAKEN                  TSMSDV
C        IERR : RETURN CODE FROM THE QRP FACTORIZATION ROUTINE :        TSMSDV
C               IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED          TSMSDV
C               IERR = 1 : SINGULARITY OF JACOBIAN DETECTED             TSMSDV
C                                                                       TSMSDV
C       OUTPUT PARAMETERS :                                             TSMSDV
C       -------------------                                             TSMSDV
C                                                                       TSMSDV
C       VNP  : THE SECOND DERIVATIVE IN ALPHA OF VN = F(XC) + J(XC)*D   TSMSDV
C              + 0.5*A*D**2, WHERE D = ALPHA*DT +  SQRT(DLT**2-ALPHA**2)TSMSDV
C                                                                       TSMSDV
C       SUBPROGRAMS CALLED:                                             TSMSDV
C                                                                       TSMSDV
C       LEVEL 1 BLAS  ...  DLOAD,DAXPY                                  TSMSDV
C                                                                       TSMSDV
C*******************************************************************    TSMSDV
                                                                        TSMSDV
       INTEGER I,J,LEN                                                  TSMSDV
       DOUBLE PRECISION QUANT1,EXPR,CONST,QUANT2                        TSMSDV
       DOUBLE PRECISION ZERO,HALF,ONEPF,TWO,THREE                       TSMSDV
       INTRINSIC SQRT                                                   TSMSDV
       DATA ZERO,HALF,ONEPF,TWO,THREE/0.0D0,0.50D0,1.50D0,2.0D0,3.0D0/  TSMSDV
                                                                        TSMSDV
       QUANT1 = DLT**2 - ALPHA**2                                       TSMSDV
       EXPR = -DLT**2 * SQRT(QUANT1) / QUANT1**2                        TSMSDV
       DO 10 I = 1,N                                                    TSMSDV
          VNS(I) =  EXPR*AG(I)                                          TSMSDV
10    CONTINUE                                                         TSMSDV
                                                                        TSMSDV
       CALL DLOAD (M,ZERO,VNS(N+1),1)                                   TSMSDV
                                                                        TSMSDV
       IF(NWTAKE) RETURN                                                TSMSDV
                                                                        TSMSDV
       QUANT2 = -THREE*ALPHA/SQRT(QUANT1)-ALPHA**3/QUANT1**ONEPF        TSMSDV
                                                                        TSMSDV
       LEN = M                                                          TSMSDV
       IF(IERR .GT. 0) LEN = M + N                                      TSMSDV
                                                                        TSMSDV
       DO 30 J = 1,P                                                    TSMSDV
          CONST = HALF*(TWO*(CONST1(J)**2 - CONST2(J)**2)               TSMSDV
     +            +TWO*CONST1(J)*CONST2(J)*QUANT2)                      TSMSDV
          CALL DAXPY(LEN,CONST,ANLS(1,J),1,VNS,1)                       TSMSDV
30    CONTINUE                                                         TSMSDV
                                                                        TSMSDV
       RETURN                                                           TSMSDV
       END                                                              TSMSDV
       SUBROUTINE TSMSLV(AJA,S,ANLS,FC,P,MAXM,MAXN,SQRN,M,N,EPSM,       TSMSLV
     +                   METHOD,GLOBAL,WRK1,WRK2,WRK3,WRK4,X,TYPXU,     TSMSLV
     +                   XPLS,GPLS,A,WRK,CURPOS,PBAR,PIVOT,FQ,FQQ,      TSMSLV
     +                   DN,DT,RESTNS,RESNEW,ITRMCD,FLAG,ZERO1,IERR)    TSMSLV
                                                                        TSMSLV
       INTEGER MAXM,MAXN,M,N,P,GLOBAL,ZERO1,FLAG                        TSMSLV
       INTEGER ITRMCD,IERR,MSG,ITNLIM,IPR,METHOD,SQRN                   TSMSLV
       INTEGER PIVOT(N),PBAR(N),CURPOS(N)                               TSMSLV
       DOUBLE PRECISION EPSM,RESTNS,RESNEW                              TSMSLV
       DOUBLE PRECISION AJA(MAXM,N),S(MAXN,P),ANLS(MAXM,P),FQ(M),FQQ(M) TSMSLV
       DOUBLE PRECISION WRK1(M),WRK2(M),WRK3(M),WRK4(M),DN(N),DT(N)     TSMSLV
       DOUBLE PRECISION FC(M),X(P),TYPXU(P),XPLS(P),GPLS(P),A(SQRN,P)   TSMSLV
       DOUBLE PRECISION WRK(SQRN,P)                                     TSMSLV
                                                                        TSMSLV
C********************************************************************** TSMSLV
C THIS ROUTINE FINDS THE TENSOR AND STANDARD STEPS.                     TSMSLV
C********************************************************************** TSMSLV
C                                                                       TSMSLV
C       INPUT PARAMETERS :                                              TSMSLV
C       ---------------                                                 TSMSLV
C                                                                       TSMSLV
C       S    : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS           TSMSLV
C       P    : COLUMN DIMENSION OF MATRICES ANLS AND S                  TSMSLV
C       MAXM : LEADING DIMENSION OF AJA AND ANLS                        TSMSLV
C       MAXN : LEADING DIMENSION OF S                                   TSMSLV
C       SQRN : LEADING DIMENSION OF MATRICES A AND WRK                  TSMSLV
C       M,N  : DIMENSIONS OF PROBLEM                                    TSMSLV
C       EPSM : MACHINE PRECISION                                        TSMSLV
C       AJA  : JACOBIAN AT CURRENT POINT XC                             TSMSLV
C       ANLS : TENSOR TERM MATRIX AT XC                                 TSMSLV
C       FC   : FUCTION VALUE XC                                         TSMSLV
C       X    : ESTIMATE TO A ROOT OF FCN (USED BY UNCMIN)               TSMSLV
C       TYPXU: TYPICAL SIZE FOR EACH COMPONENT OF X (USED BY UNCMIN)    TSMSLV
C       A    : WORKSPACE FOR HESSIAN (OR ESTIMATE) (USED BY UNCMIN)     TSMSLV
C       WRK  : WORKSPACE (USED BY UNCMIN)                               TSMSLV
C       METHOD : METHOD TO USE                                          TSMSLV
C                METHOD = 0 : STANDARD METHOD IS USED                   TSMSLV
C                METHOD = 1 : TENSOR METHOD IS USED                     TSMSLV
C       GLOBAL : GLOBAL STRATEGY USED                                   TSMSLV
C       WRK1,WRK2,WRK3,WRK4,FQ,FQQ,WRK3 : WORKSPACE                     TSMSLV
C                                                                       TSMSLV
C       OUTPUT PARAMETERS :                                             TSMSLV
C       ------------------                                              TSMSLV
C                                                                       TSMSLV
C       DN : STANDARD STEP                                              TSMSLV
C       DT : TENSOR STEP                                                TSMSLV
C       FLAG : RETURNED CODE WITH THE FOLLOWING MEANING :               TSMSLV
C              FLAG = 0 : NO SINGULARITY DETECTED WHEN FACTORIZING AJA  TSMSLV
C              FLAG = 1 : SINGULARITY DETECTED WHEN FACTORIZING AJA     TSMSLV
C                         FROM 1 TO N-P                                 TSMSLV
C              FLAG = 2 : SINGULARITY DETECTED WHEN FACTORIZING AJA     TSMSLV
C                         FROM N-P TO N                                 TSMSLV
C       IERR   : RETURNED CODE WITH THE FOLLOWING MEANING :             TSMSLV
C                IERR = 0 : NO SINGULARITY DETECTED WHEN FACTORIZING AJATSMSLV
C                IERR = 1 : SINGULARITY DETECTED WHEN FACTORIZING AJA   TSMSLV
C       XPLS : LOCAL MINIMUM OF OPTIMIZATION FUNCTION FCN (USED         TSMSLV
C              BY UNCMIN)                                               TSMSLV
C       FPLS : FUNCTION VALUE AT SOLUTION OF OPTIMIZATION FUNCTION FCN  TSMSLV
C              (USED IN UNCMIN)                                         TSMSLV
C       GPLS : GRADIENT AT SOLUTION XPLS (USED BY UNCMIN)               TSMSLV
C       CURPOS,PIVOT,PBAR : PIVOT VECTORS                               TSMSLV
C       RESTNS : TENSOR RESIDUAL                                        TSMSLV
C       RESNEW : STANDARD RESIDUAL                                      TSMSLV
C       ITRMCD : TERMINATION CODE (FOR UNCMIN)                          TSMSLV
C                                                                       TSMSLV
C       SUBPROGRAMS CALLED:                                             TSMSLV
C                                                                       TSMSLV
C       LEVEL 1 BLAS  ...  DCOPY,DLOAD                                  TSMSLV
C       TENSOLVE      ...  TSQLFC,QTRNS,TSQRFC,TSQMTS,TSQMUV,TSSQP1     TSMSLV
C       TENSOLVE      ...  TSQ1P1,TSD1SV,TSPRMV,TSQMLV,TSCPSS           TSMSLV
C       UNCMIN        ...  DFAUT,OPTIF9                                 TSMSLV
C                                                                       TSMSLV
C********************************************************************** TSMSLV
                                                                        TSMSLV
      INTEGER Q,METH,IEXP,NDIGIT,IAGFLG,IAHFLG                          TSMSLV
      DOUBLE PRECISION ROOT,TYPFU,DLT,GRADLT,STEPMX,STEPTL,FPLS         TSMSLV
      DOUBLE PRECISION ZERO,ONE,TWO                                     TSMSLV
      INTRINSIC SQRT                                                    TSMSLV
      EXTERNAL TSQFCN,TSDFCN,D2FCN                                      TSMSLV
      DATA ZERO,ONE,TWO/0.0D0,1.0D0,2.0D0/                              TSMSLV
                                                                        TSMSLV
      IF(N .EQ. 1) THEN                                                 TSMSLV
         S(2,1) = ONE                                                   TSMSLV
         S(3,1) = ONE                                                   TSMSLV
         CURPOS(1) = 1                                                  TSMSLV
         CALL DCOPY(M,FC,1,FQ,1)                                        TSMSLV
      ELSE                                                              TSMSLV
                                                                        TSMSLV
c perform a QL decomposition of S                                       TSMSLV
                                                                        TSMSLV
         CALL TSQLFC(S,MAXN,N,P,IERR)                                   TSMSLV
                                                                        TSMSLV
c compute AJA times Q-trans                                             TSMSLV
                                                                        TSMSLV
         CALL TSJQTP(S,MAXM,MAXN,N,M,P,WRK1,FQ,AJA)                     TSMSLV
                                                                        TSMSLV
c perform a QR factorization of AJA                                     TSMSLV
                                                                        TSMSLV
         CALL TSQRFC(AJA,MAXM,N,M,1,N-P,IERR,EPSM,WRK1,CURPOS,ZERO1)    TSMSLV
                                                                        TSMSLV
         IF(IERR.EQ.1) THEN                                             TSMSLV
            Q = N-ZERO1+1                                               TSMSLV
         ELSE                                                           TSMSLV
            Q = P                                                       TSMSLV
         ENDIF                                                          TSMSLV
         CALL TSQMTS(ANLS,AJA,MAXM,M,N,M,P,1,WRK1,ZERO1)                TSMSLV
                                                                        TSMSLV
         CALL TSQMUV(AJA,FC,FQ,MAXM,M,1,ZERO1,.FALSE.)                  TSMSLV
      ENDIF                                                             TSMSLV
                                                                        TSMSLV
c minimize the lower m-n+q quadratic equations in p unknowns            TSMSLV
c of the tensor model. The minimization is performed analytically       TSMSLV
c if p=1,q>1, or p=1,q=1,m>n, or n=1,m>n. Otherwise an unconstrained    TSMSLV
c minimization software, UNCMIN, is used.                               TSMSLV
                                                                        TSMSLV
      IF((P.EQ.1.AND.Q.GT.1).OR.(P.EQ.1 .AND. Q.EQ.1 .AND. M.GT.N)      TSMSLV
     +   .OR. (N .EQ. 1 .AND. M .GT. N)) THEN                           TSMSLV
         CALL TSSQP1(AJA,ANLS,S,FQ,MAXM,MAXN,M,N,Q,ROOT,RESTNS)         TSMSLV
         XPLS(1) = ROOT                                                 TSMSLV
      ELSEIF((M.EQ.N).AND.(P.EQ.1).AND.(Q.EQ.1) .OR.                    TSMSLV
     +      (M.EQ.1.AND.N.EQ.1)) THEN                                   TSMSLV
         CALL TSQ1P1(AJA,ANLS,S,FQ,MAXM,MAXN,N,ROOT,RESTNS)             TSMSLV
         XPLS(1) = ROOT                                                 TSMSLV
      ELSE                                                              TSMSLV
         CALL DFAUT(P,TYPXU,TYPFU,METH,IEXP,MSG,NDIGIT,ITNLIM,          TSMSLV
     +              IAGFLG,IAHFLG,IPR,DLT,GRADLT,STEPMX,STEPTL)         TSMSLV
                                                                        TSMSLV
         IAGFLG = 1                                                     TSMSLV
         IAHFLG = 0                                                     TSMSLV
         IEXP = 0                                                       TSMSLV
         METH = 2                                                       TSMSLV
         MSG = 9                                                        TSMSLV
                                                                        TSMSLV
         CALL DLOAD (P,ZERO,X,1)                                        TSMSLV
                                                                        TSMSLV
         CALL OPTIF9(SQRN,P,X,TSQFCN,TSDFCN,D2FCN,TYPXU,TYPFU,METH,IEXP,TSMSLV
     +               MSG,NDIGIT,ITNLIM,IAGFLG,IAHFLG,IPR,DLT,GRADLT,    TSMSLV
     +               STEPMX,STEPTL,XPLS,FPLS,GPLS,ITRMCD,A,WRK,AJA,     TSMSLV
     +               ANLS,S,FQ,WRK1,FQQ,WRK2,WRK3,WRK4,MAXM,MAXN,M,N,Q) TSMSLV
                                                                        TSMSLV
c compute the tensor residual                                           TSMSLV
                                                                        TSMSLV
         RESTNS = SQRT(TWO*FPLS)                                        TSMSLV
       ENDIF                                                            TSMSLV
                                                                        TSMSLV
       CALL DCOPY(P,XPLS,1,WRK4(N-P+1),1)                               TSMSLV
                                                                        TSMSLV
       IF(N .EQ. 1) THEN                                                TSMSLV
          DT(1) = WRK4(1)                                               TSMSLV
       ELSE                                                             TSMSLV
                                                                        TSMSLV
c compute the first n-p components of the tensor step                   TSMSLV
                                                                        TSMSLV
          CALL TSD1SV(AJA,S,ANLS,FQ,XPLS,MAXM,MAXN,M,N,P,Q,EPSM,        TSMSLV
     +                WRK1,FQQ,WRK2,PIVOT,WRK3)                         TSMSLV
          CALL TSPRMV(WRK4,WRK3,CURPOS,N-P,0)                           TSMSLV
                                                                        TSMSLV
c premultiply the tensor step by the orthogonal matrix resulting        TSMSLV
c from the QL factorization of S                                        TSMSLV
                                                                        TSMSLV
          CALL TSQMLV(MAXN,N,P,S,WRK4,DT,.TRUE.)                        TSMSLV
       ENDIF                                                            TSMSLV
                                                                        TSMSLV
c compute the standard step if needed                                   TSMSLV
                                                                        TSMSLV
       IF(GLOBAL .EQ. 1 .OR. (M .GT. N .AND. GLOBAL .EQ. 0)) THEN       TSMSLV
          CALL TSCPSS(S,MAXM,MAXN,M,N,P,METHOD,GLOBAL,EPSM,FQ,          TSMSLV
     +                WRK1,WRK2,WRK3,WRK4,AJA,ANLS,DN,FQQ,PIVOT,        TSMSLV
     +                CURPOS,PBAR,ZERO1,IERR,RESNEW,FLAG)               TSMSLV
       ENDIF                                                            TSMSLV
                                                                        TSMSLV
       RETURN                                                           TSMSLV
       END                                                              TSMSLV
       SUBROUTINE TSNECI(MAXM,MAXN,MAXP,X0,M,N,TYPX,TYPF,ITNLIM,        TSNECI
     +                   JACFLG,GRADTL,STEPTL,FTOL,METHOD,GLOBAL,       TSNECI
     +                   STEPMX,DLT,IPR,WRKUNC,LUNC,WRKNEM,LNEM,        TSNECI
     +                   WRKNEN,LNEN,IWRKN,LIN,TSANJA,TSFVEC,MSG,       TSNECI
     +                   XP,FP,GP,TERMCD)                               TSNECI
                                                                        TSNECI
       INTEGER MAXM,MAXN,M,N,MAXP,JACFLG,ITNLIM,TERMCD,METHOD           TSNECI
       INTEGER MSG,GLOBAL,IPR,LUNC,LNEM,LNEN,LIN                        TSNECI
       INTEGER IWRKN(MAXN,LIN)                                          TSNECI
       DOUBLE PRECISION STEPTL,GRADTL,FTOL,STEPMX,DLT                   TSNECI
       DOUBLE PRECISION XP(N),FP(M),GP(N),X0(N)                         TSNECI  
       DOUBLE PRECISION WRKUNC(MAXP,LUNC)                               TSNECI
       DOUBLE PRECISION WRKNEM(MAXM,LNEM)                               TSNECI
       DOUBLE PRECISION WRKNEN(MAXN,LNEN)                               TSNECI
       DOUBLE PRECISION TYPX(N),TYPF(M)                                 TSNECI
       EXTERNAL TSANJA,TSFVEC                                           TSNECI
                                                                        TSNECI
C                                                                       TSNECI
C********************************************************************** TSNECI
C THIS ROUTINE PROVIDES A COMPLETE INTERFACE TO THE NONLINEAR EQUATION/ TSNECI
C NONLINEAR LEAST SQUARES PACKAGE. THE USER HAS FULL CONTROL OVER       TSNECI
C THE OPTIONS.                                                          TSNECI
C********************************************************************** TSNECI
C                                                                       TSNECI
C       SUBPROGRAMS CALLED:                                             TSNECI
C                                                                       TSNECI
C       TENSOLVE      ...  TSCHKI,TSNESV                                TSNECI
C                                                                       TSNECI
C********************************************************************** TSNECI
                                                                        TSNECI
       INTEGER SQRN                                                     TSNECI
       DOUBLE PRECISION EPSM                                            TSNECI
                                                                        TSNECI
c check input parameters                                                TSNECI
                                                                        TSNECI
       CALL TSCHKI(MAXM,MAXN,MAXP,M,N,LUNC,LNEM,LNEN,LIN,GRADTL,STEPTL, TSNECI
     +            FTOL,ITNLIM,JACFLG,METHOD,GLOBAL,STEPMX,DLT,EPSM,     TSNECI
     +            MSG,TYPX,TYPF,WRKNEN(1,2),WRKNEM(1,2),SQRN,           TSNECI
     +            TERMCD,IPR)                                           TSNECI
       IF(MSG.LT.0) RETURN                                              TSNECI
                                                                        TSNECI
c call nonlinear equations/nonlinear least squares solver               TSNECI
                                                                        TSNECI
       CALL TSNESV(MAXM,MAXN,MAXP,X0,M,N,TYPX,TYPF,ITNLIM,JACFLG,       TSNECI
     +             GRADTL,STEPTL,FTOL,METHOD,GLOBAL,STEPMX,DLT,IPR,     TSNECI
     +             WRKUNC(1,1),WRKUNC(1,2),WRKUNC(1,3),WRKUNC(1,4),     TSNECI
     +             WRKUNC(1,5),WRKUNC(1,SQRN+5),WRKNEM(1,2),WRKNEM(1,3),TSNECI
     +             WRKNEM(1,4),WRKNEM(1,5),WRKNEM(1,6),WRKNEM(1,7),     TSNECI
     +             WRKNEM(1,8),WRKNEM(1,9),WRKNEM(1,10),WRKNEM(1,11),   TSNECI
     +             WRKNEM(1,12),WRKNEM(1,SQRN+12),WRKNEM(1,2*SQRN+12),  TSNECI
     +             WRKNEN(1,2),WRKNEN(1,3),WRKNEN(1,4),WRKNEN(1,5),     TSNECI
     +             WRKNEN(1,6),WRKNEN(1,7),WRKNEN(1,8),WRKNEN(1,9),     TSNECI
     +             WRKNEN(1,10),WRKNEN(1,SQRN+10),IWRKN(1,1),IWRKN(1,2),TSNECI
     +             IWRKN(1,3),EPSM,SQRN,TSANJA,TSFVEC,MSG,XP,FP,GP,     TSNECI
     +             TERMCD)                                              TSNECI
                                                                        TSNECI
       RETURN                                                           TSNECI
       END                                                              TSNECI
       SUBROUTINE TSNESI(MAXM,MAXN,MAXP,X0,M,N,WRKUNC,LUNC,WRKNEM,      TSNESI
     +                   LNEM,WRKNEN,LNEN,IWRKN,LIN,TSFVEC,MSG,XP,      TSNESI
     +                   FP,GP,TERMCD)                                  TSNESI
                                                                        TSNESI
       INTEGER MAXM,MAXN,M,N,MAXP,JACFLG,ITNLIM,TERMCD,METHOD           TSNESI
       INTEGER GLOBAL,MSG,IPR,LUNC,LNEM,LNEN,LIN                        TSNESI
       INTEGER IWRKN(MAXN,LIN)                                          TSNESI
       DOUBLE PRECISION STEPTL,GRADTL,FTOL,STEPMX,DLT                   TSNESI
       DOUBLE PRECISION XP(N),FP(M),GP(N),X0(N)                         TSNESI
       DOUBLE PRECISION WRKUNC(MAXP,LUNC)                               TSNESI
       DOUBLE PRECISION WRKNEM(MAXM,LNEM)                               TSNESI
       DOUBLE PRECISION WRKNEN(MAXN,LNEN)                               TSNESI
       EXTERNAL TSDUMJ,TSFVEC                                           TSNESI
                                                                        TSNESI
C********************************************************************** TSNESI
C THIS ROUTINE PROVIDES A SIMPLE INTERFACE TO THE NONLINEAR EQUATION/   TSNESI
C NONLINEAR LEAST SQUARES PROBLEMS PACKAGE.  THE USER HAS NO CONTROL    TSNESI
C OVER THE PACKAGE OPTIONS.                                             TSNESI
C********************************************************************** TSNESI
C                                                                       TSNESI
C       SUBPROGRAMS CALLED:                                             TSNESI
C                                                                       TSNESI
C       TENSOLVE      ...  TSDFLT,TSCHKI,TSNESV                         TSNESI
C                                                                       TSNESI
C********************************************************************** TSNESI
                                                                        TSNESI
       INTEGER SQRN                                                     TSNESI
       DOUBLE PRECISION EPSM                                            TSNESI
                                                                        TSNESI
c set default values for each variable to the nonlinear equations/      TSNESI
c nonlinear least squares solver                                        TSNESI
                                                                        TSNESI
       CALL TSDFLT(M,N,ITNLIM,JACFLG,GRADTL,STEPTL,FTOL,METHOD,GLOBAL,  TSNESI
     +             STEPMX,DLT,WRKNEN(1,1),WRKNEM(1,1),IPR,MSG)          TSNESI
                                                                        TSNESI
c check input parameters                                                TSNESI
                                                                        TSNESI
       CALL TSCHKI(MAXM,MAXN,MAXP,M,N,LUNC,LNEM,LNEN,LIN,GRADTL,STEPTL, TSNESI
     +             FTOL,ITNLIM,JACFLG,METHOD,GLOBAL,STEPMX,DLT,EPSM,    TSNESI
     +             MSG,WRKNEN(1,1),WRKNEM(1,1),WRKNEN(1,2),WRKNEM(1,2), TSNESI
     +             SQRN,TERMCD,IPR)                                     TSNESI
       IF(MSG.LT.0) RETURN                                              TSNESI
                                                                        TSNESI
c call nonlinear equations/nonlinear least squares solver               TSNESI
                                                                        TSNESI
       CALL TSNESV(MAXM,MAXN,MAXP,X0,M,N,WRKNEN(1,1),WRKNEM(1,1),ITNLIM,TSNESI
     +            JACFLG,GRADTL,STEPTL,FTOL,METHOD,GLOBAL,STEPMX,DLT,   TSNESI
     +            IPR,WRKUNC(1,1),WRKUNC(1,2),WRKUNC(1,3),WRKUNC(1,4),  TSNESI
     +            WRKUNC(1,5),WRKUNC(1,SQRN+5), WRKNEM(1,2),WRKNEM(1,3),TSNESI
     +            WRKNEM(1,4),WRKNEM(1,5),WRKNEM(1,6),WRKNEM(1,7),      TSNESI
     +            WRKNEM(1,8),WRKNEM(1,9),WRKNEM(1,10),WRKNEM(1,11),    TSNESI
     +            WRKNEM(1,12),WRKNEM(1,SQRN+12),WRKNEM(1,2*SQRN+12),   TSNESI
     +            WRKNEN(1,2),WRKNEN(1,3),WRKNEN(1,4),WRKNEN(1,5),      TSNESI
     +            WRKNEN(1,6),WRKNEN(1,7),WRKNEN(1,8),WRKNEN(1,9),      TSNESI
     +            WRKNEN(1,10),WRKNEN(1,SQRN+10),IWRKN(1,1),IWRKN(1,2), TSNESI
     +            IWRKN(1,3),EPSM,SQRN,TSDUMJ,TSFVEC,MSG,XP,FP,GP,      TSNESI
     +            TERMCD)                                               TSNESI
                                                                        TSNESI
       RETURN                                                           TSNESI
       END                                                              TSNESI
       SUBROUTINE TSNESV(MAXM,MAXN,MAXP,XC,M,N,TYPX,TYPF,ITNLIM,        TSNESV
     +                  JACFLG,GRADTL,STEPTL,FTOL,METHOD,GLOBAL,        TSNESV
     +                  STEPMX,DLT,IPR,X,TYPXU,XPLS,GPLS,A,WRK,DFN,     TSNESV
     +                  WRK1,WRK2,WRK3,WRK4,WRK5,FQ,FQQ,FC,FHAT,        TSNESV
     +                  ANLS,FV,AJA,DXN,DN,DT,DF,D,GBAR,DBAR,DBARP,     TSNESV
     +                  S,SHAT,CURPOS,PIVOT,PBAR,EPSM,SQRN,TSANJA,      TSNESV
     +                  TSFVEC,MSG,XP,FP,GP,TERMCD)                     TSNESV
                                                                        TSNESV
        INTEGER MAXM,MAXN,MAXP,M,N,SQRN,TERMCD                          TSNESV
        INTEGER ITNLIM,JACFLG,METHOD,GLOBAL,MSG,IPR                     TSNESV
        INTEGER PBAR(N),CURPOS(N),PIVOT(N)                              TSNESV
        DOUBLE PRECISION GRADTL,STEPTL,FTOL,STEPMX,DLT,FPLS,EPSM        TSNESV
        DOUBLE PRECISION TYPXU(SQRN),XPLS(SQRN),GPLS(SQRN),A(MAXP,SQRN) TSNESV
        DOUBLE PRECISION WRK(MAXP,SQRN),X(SQRN),AJA(MAXM,N),S(MAXN,SQRN)TSNESV
        DOUBLE PRECISION ANLS(MAXM,SQRN),SHAT(MAXN,SQRN),FV(MAXM,SQRN)  TSNESV
        DOUBLE PRECISION XC(N),FC(M),XP(N),FP(M),DN(N),DT(N),DF(N)      TSNESV
        DOUBLE PRECISION D(N),WRK1(M),WRK2(M),WRK3(M),WRK4(M)           TSNESV
        DOUBLE PRECISION WRK5(M),FQQ(M),FQ(M),GP(N),FHAT(M)             TSNESV
        DOUBLE PRECISION GBAR(N),DBAR(N),DBARP(N)                       TSNESV
        DOUBLE PRECISION TYPX(N),TYPF(M),DXN(N),DFN(M)                  TSNESV
        EXTERNAL TSANJA,TSFVEC                                          TSNESV
                                                                        TSNESV
C********************************************************************** TSNESV
C THIS IS THE DRIVER FOR NONLINEAR EQUATIONS/NONLINEAR LEAST SQUARES    TSNESV
C PROBLEMS.                                                             TSNESV
C********************************************************************** TSNESV
C                                                                       TSNESV
C       INPUT PARAMETERS :                                              TSNESV
C       -----------------                                               TSNESV
C                                                                       TSNESV
C       MAXM   : LEADING DIMENSION OF AJA, ANLS, AND FV                 TSNESV
C       MAXN   : LEADING DIMENSION OF S AND SHAT                        TSNESV
C       XC     : INITIAL ESTIMATE OF SOLUTION                           TSNESV
C       M,N    : DIMENSIONS OF PROBLEM                                  TSNESV
C       TYPX   : TYPICAL SIZE FOR EACH COMPONENT OF X                   TSNESV
C       TYPF   : TYPICAL SIZE FOR EACH COMPONENT OF F                   TSNESV
C       ITNLIM : MAXIMUM NUMBER OF ALLOWABLE ITERATIONS                 TSNESV
C       JACFLG : JACOBIAN FLAG WITH THE FOLLOWING MEANINGS:             TSNESV
C                JACFLG = 1 IF ANALYTIC JACOBIAN SUPPLIED               TSNESV
C                JACFLG = 0 IF ANALYTIC JACOBIAN NOT SUPPLIED           TSNESV
C       GRADTL : TOLERANCE AT WHICH GRADIENT IS CONSIDERED CLOSE ENOUGH TSNESV
C                TO ZERO TO TERMINATE ALGORITHM                         TSNESV
C       STEPTL : TOLERANCE AT WHICH SUCCESSIVE ITERATES ARE CONSIDERED  TSNESV
C                CLOSE ENOUGH TO TERMINATE ALGORITHM                    TSNESV
C       FTOL : TOLERANCE AT WHICH FUNCTION VALUE IS CONSIDERED CLOSE    TSNESV
C                ENOUGH TO ZERO                                         TSNESV
C       METHOD : METHOD TO USE                                          TSNESV
C                METHOD = 0 : STANDARD METHOD IS USED                   TSNESV
C                METHOD = 1 : TENSOR METHOD IS USED                     TSNESV
C       GLOBAL : GLOBAL STRATEGY TO USE                                 TSNESV
C                GLOBAL = 0 : LINE SEARCH                               TSNESV
C                GLOBAL = 1 : 2-DIMENSIONAL TRUST REGION                TSNESV
C       STEPMX : MAXIMUM ALLOWABLE STEP SIZE                            TSNESV
C       DLT    : TRUST REGION RADIUS                                    TSNESV
C       IPR    : DEVICE TO WHICH TO SEND OUTPUT                         TSNESV
C       X      : ESTIMATE TO A ROOT OF FCN ( USED BY UNCMIN)            TSNESV
C       TYPXU  : TYPICAL SIZE FOR EACH COMPONENT OF X (USED BY UNCMIN)  TSNESV
C       XPLS   : LOCAL MINIMUM OF OPTIMIZATION FUNCTION FCN USED BY     TSNESV
C                UNCMIN                                                 TSNESV
C       GPLS   : GRADIENT AT SOLUTION XPLS (USED BY UNCMIN)             TSNESV
C       A      : WORKSPACE FOR HESSIAN (OR ESTIMATE) (USED BY UNCMIN)   TSNESV
C       WRK    : WORKSPACE (USED BY UNCMIN)                             TSNESV
C       WRK1,WRK2,WRK3,WRK4,WRK5,FQ,FQQ:  WORKSPACE                     TSNESV
C       FC     : FUNCTION VALUE AT CURRENT ITERATE                      TSNESV
C       FHAT   : WORKSPACE                                              TSNESV
C       DFN    : DIAGONAL SCALING MATRIX FOR F                          TSNESV
C       ANLS   : TENSOR TERM MATRIX                                     TSNESV
C       FV     : WORKSPACE USED TO STORE PAST FUNCTION VALUES           TSNESV
C       AJA    : JACOBIAN MATRIX                                        TSNESV
C       DN     : STANDARD STEP                                          TSNESV
C       DT     : TENSOR STEP                                            TSNESV
C       DF,D,GBAR,DBAR,DBARP : WORKSPACE                                TSNESV
C       DXN    : DIAGONAL SCALING MATRIX FOR X                          TSNESV
C       S      : MATRIX OF PREVIOUS DIRECTIONS                          TSNESV
C       SHAT   : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS         TSNESV
C       CURPOS,PIVOT,PBAR : PIVOT VECTORS                               TSNESV
C       SQRN   : MAXIMUM COLUMN DIMENSION OF ANLS, S, AND SHAT          TSNESV
C       EPSM   : MACHINE PRECISION                                      TSNESV
C       TSANJA : (OPTIONAL) NAME OF SUBROUTINE TO EVALUATE JACOBIAN.    TSNESV
C                MUST BE DECLARED EXTERNAL IN CALLING ROUTINE           TSNESV
C       TSFVEC : NAME OF SUBROUTINE TO EVALUATE FUNCTION                TSNESV
C                                                                       TSNESV
C                                                                       TSNESV
C       INPUT-OUTPUT PARAMETERS :                                       TSNESV
C       ------------------------                                        TSNESV
C                                                                       TSNESV
C       MSG : MESSAGE TO INHIBIT CERTAIN AUTOMATIC CHECKS + OUTPUT      TSNESV
C                                                                       TSNESV
C                                                                       TSNESV
C       OUTPUT PARAMETERS :                                             TSNESV
C       -----------------                                               TSNESV
C                                                                       TSNESV
C       XP : SOLUTION TO THE SYSTEM OF NONLINEAR EQUATIONS              TSNESV
C       FP : FUNCTION VALUE AT THE SOLUTION                             TSNESV
C       GP : GRADIENT AT THE SOLUTION                                   TSNESV
C       TERMCD : TERMINATION CODE                                       TSNESV
C                                                                       TSNESV
C       SUBPROGRAMS CALLED:                                             TSNESV
C                                                                       TSNESV
C       LEVEL 1 BLAS  ...  DCOPY,DNRM2                                  TSNESV
C       LEVEL 2 BLAS  ...  DGEMV                                        TSNESV
C       TENSOLVE      ...  TSSCLX,TSFSCL,TSSCLJ,TSCHKJ,TSNSTP,TSSSTP,   TSNESV
C       TENSOLVE      ...  TSLSCH,TS2DTR,TSRSLT,TSMGSA,TSFRMT,TSMSLV,   TSNESV
C       TENSOLVE      ...  TSSLCT,TSMDLS,TSUPSF                         TSNESV
C                                                                       TSNESV
C*********************************************************************  TSNESV
                                                                        TSNESV
        INTEGER P,ITN,I,FLAG,RETCD,ZERO1,IERR,ITRMCD,ICSCMX             TSNESV
        DOUBLE PRECISION FNORM,RESTNS,RESNEW                            TSNESV
        DOUBLE PRECISION ZERO,HALF,ONE                                  TSNESV
        DOUBLE PRECISION DNRM2                                          TSNESV
        LOGICAL NWTAKE,MXTAKE                                           TSNESV
        DATA ZERO,HALF,ONE/0.0D0,0.50D0,1.0D0/                          TSNESV
                                                                        TSNESV
c-----------------                                                      TSNESV
c initialization                                                        TSNESV
c-----------------                                                      TSNESV
                                                                        TSNESV
        ITN = 0                                                         TSNESV
        NWTAKE = .TRUE.                                                 TSNESV
                                                                        TSNESV
        CALL TSSCLX(XC,DXN,N)                                           TSNESV
                                                                        TSNESV
        IF(MOD(MSG/8,2).NE.1) THEN                                      TSNESV
           WRITE(IPR,896)                                               TSNESV
           WRITE(IPR,900) (TYPX(I),I = 1,N)                             TSNESV
           WRITE(IPR,897)                                               TSNESV
           WRITE(IPR,900) (DXN(I),I = 1,N)                              TSNESV
           WRITE(IPR,898)                                               TSNESV
           WRITE(IPR,900) (TYPF(I),I = 1,M)                             TSNESV
           WRITE(IPR,899)                                               TSNESV
           WRITE(IPR,900) (DFN(I),I = 1,M)                              TSNESV
           WRITE(IPR,901) JACFLG                                        TSNESV
           WRITE(IPR,902) METHOD                                        TSNESV
           WRITE(IPR,903) GLOBAL                                        TSNESV
           WRITE(IPR,904) ITNLIM                                        TSNESV
           WRITE(IPR,905) EPSM                                          TSNESV
           WRITE(IPR,906) STEPTL                                        TSNESV
           WRITE(IPR,907) GRADTL                                        TSNESV
           WRITE(IPR,908) FTOL                                          TSNESV
           WRITE(IPR,909) STEPMX                                        TSNESV
           WRITE(IPR,910) DLT                                           TSNESV
        ENDIF                                                           TSNESV
                                                                        TSNESV
c evaluate analytic or finite difference Jacobian and check analytic    TSNESV
c Jacobian, if requested                                                TSNESV
                                                                        TSNESV
        CALL TSFSCL(XC,DXN,DFN,M,N,TSFVEC,FC)                           TSNESV
        CALL TSSCLJ(XC,DXN,TYPX,FC,DFN,FHAT,MAXM,M,N,                   TSNESV
     +              EPSM,JACFLG,TSFVEC,TSANJA,AJA)                      TSNESV
        IF(JACFLG.EQ.1) THEN                                            TSNESV
          IF(MOD(MSG/2,2).EQ.0) THEN                                    TSNESV
             CALL TSCHKJ(AJA,XC,FC,MAXM,M,N,EPSM,DFN,DXN,TYPX,          TSNESV
     +                   IPR,FHAT,WRK1,TSFVEC,MSG)                      TSNESV
             IF(MSG.LT.0) RETURN                                        TSNESV
          ENDIF                                                         TSNESV
        ENDIF                                                           TSNESV
                                                                        TSNESV
c compute the gradient at the current iterate XC                        TSNESV
                                                                        TSNESV
        CALL DGEMV('T',M,N,ONE,AJA,MAXM,FC,1,ZERO,GP,1)                 TSNESV
                                                                        TSNESV
c compute the residual of FC                                            TSNESV
                                                                        TSNESV
        FNORM = HALF*DNRM2(M,FC,1)**2                                   TSNESV
                                                                        TSNESV
c check stopping criteria for input XC                                  TSNESV
                                                                        TSNESV
        CALL TSNSTP(GP,XC,FC,XC,STEPTL,GRADTL,RETCD,FTOL,ITN,           TSNESV
     +              ITNLIM,ICSCMX,MXTAKE,M,N,MSG,IPR,FNORM,TERMCD)      TSNESV
                                                                        TSNESV
        IF(TERMCD.GT.0) THEN                                            TSNESV
           FPLS = FNORM                                                 TSNESV
           GO TO 120                                                    TSNESV
        ENDIF                                                           TSNESV
                                                                        TSNESV
c---------------                                                        TSNESV
c iteration 1                                                           TSNESV
c---------------                                                        TSNESV
                                                                        TSNESV
        ITN = 1                                                         TSNESV
                                                                        TSNESV
c compute the standard step                                             TSNESV
                                                                        TSNESV
        CALL DCOPY(M,FC,1,FHAT,1)                                       TSNESV
                                                                        TSNESV
        CALL TSSSTP(AJA,FHAT,M,N,MAXM,EPSM,GLOBAL,WRK1,WRK2,WRK3,       TSNESV
     +              DN,FQQ,PIVOT,PBAR,IERR)                             TSNESV
                                                                        TSNESV
c choose next iterate XP by a global strategy                           TSNESV
                                                                        TSNESV
        IF(GLOBAL.EQ.0) THEN                                            TSNESV
          CALL TSLSCH(M,N,XC,FC,DN,GP,STEPTL,DXN,DFN,TSFVEC,            TSNESV
     +                MXTAKE,STEPMX,XP,FP,FNORM,FPLS,RETCD)             TSNESV
        ELSE                                                            TSNESV
          CALL TS2DTR(AJA,SHAT,ANLS,DN,GP,GBAR,XC,FC,METHOD,            TSNESV
     +                NWTAKE,STEPMX,STEPTL,EPSM,MXTAKE,DLT,             TSNESV
     +                FQQ,MAXM,MAXN,M,N,P,CURPOS,PIVOT,PBAR,            TSNESV
     +                ITN,IERR,FLAG,DXN,DFN,TSFVEC,DBAR,DBARP,          TSNESV
     +                D,FHAT,WRK1,WRK2,WRK3,WRK4,WRK5,                  TSNESV
     +                XPLS,GPLS,FNORM,XP,FP,FPLS,RETCD)                 TSNESV
        ENDIF                                                           TSNESV
                                                                        TSNESV
        IF(MOD(MSG/8,2).EQ.0) CALL TSRSLT(N,XC,FNORM,GP,0,IPR)          TSNESV
                                                                        TSNESV
c evaluate the Jacobian at the new iterate XP                           TSNESV
                                                                        TSNESV
        CALL TSSCLJ(XP,DXN,TYPX,FP,DFN,FHAT,MAXM,M,N,EPSM,JACFLG,       TSNESV
     +              TSFVEC,TSANJA,AJA)                                  TSNESV
                                                                        TSNESV
c compute the gradient at the new iterate XP                            TSNESV
                                                                        TSNESV
        CALL DGEMV('T',M,N,ONE,AJA,MAXM,FP,1,ZERO,GP,1)                 TSNESV
                                                                        TSNESV
c check stopping criteria for the new iterate XP                        TSNESV
                                                                        TSNESV
        CALL TSNSTP(GP,XP,FP,XC,STEPTL,GRADTL,RETCD,FTOL,ITN,           TSNESV
     +              ITNLIM,ICSCMX,MXTAKE,M,N,MSG,IPR,FPLS,TERMCD)       TSNESV
                                                                        TSNESV
        IF(TERMCD.GT.0) GO TO 120                                       TSNESV
        IF(MOD(MSG/16,2).EQ.1) CALL TSRSLT(N,XP,FPLS,GP,ITN,IPR)        TSNESV
                                                                        TSNESV
c update S and FV                                                       TSNESV
                                                                        TSNESV
        DO 40 I = 1,N                                                   TSNESV
           S(I,1) = XC(I)-XP(I)                                         TSNESV
40     CONTINUE                                                        TSNESV
        CALL DCOPY(M,FC,1,FV(1,1),1)                                    TSNESV
                                                                        TSNESV
c update XC and FC                                                      TSNESV
                                                                        TSNESV
        CALL DCOPY(N,XP,1,XC,1)                                         TSNESV
        CALL DCOPY(M,FP,1,FC,1)                                         TSNESV
        FNORM = FPLS                                                    TSNESV
                                                                        TSNESV
c---------------                                                        TSNESV
c iteration > 1                                                         TSNESV
c---------------                                                        TSNESV
                                                                        TSNESV
80    ITN = ITN+1                                                      TSNESV
                                                                        TSNESV
c if the standard method is selected then compute the standard step     TSNESV
                                                                        TSNESV
              IF(METHOD.EQ.0) THEN                                      TSNESV
                 CALL DCOPY(M,FC,1,FHAT,1)                              TSNESV
                 CALL TSSSTP(AJA,FHAT,M,N,MAXM,EPSM,GLOBAL,WRK1,WRK2,   TSNESV
     +                       WRK3,DF,FQQ,PIVOT,PBAR,IERR)               TSNESV
              ENDIF                                                     TSNESV
                                                                        TSNESV
c if the tensor method is selected then form the tensor model           TSNESV
                                                                        TSNESV
              IF(METHOD.EQ.1) THEN                                      TSNESV
                                                                        TSNESV
c select the past linearly independent directions                       TSNESV
                                                                        TSNESV
                 CALL TSMGSA(S,MAXN,N,SQRN,ITN,SHAT,P,CURPOS)           TSNESV
                                                                        TSNESV
c form the tensor term                                                  TSNESV
                                                                        TSNESV
                 CALL TSFRMT(SHAT,S,AJA,FV,FC,MAXM,MAXN,MAXP,M,N,P,     TSNESV
     +                       CURPOS,A,X,XPLS,GPLS,ANLS)                 TSNESV
                                                                        TSNESV
c solve the tensor model for the tensor step DT and compute DN          TSNESV
c as a by-product if the global strategy selected is the                TSNESV
c two-dimensional trust region or M > N                                 TSNESV
                                                                        TSNESV
                 CALL TSMSLV(AJA,SHAT,ANLS,FC,P,MAXM,MAXN,SQRN,M,N,     TSNESV
     +                       EPSM,METHOD,GLOBAL,WRK1,WRK2,WRK3,WRK4,    TSNESV
     +                       X,TYPXU,XPLS,GPLS,A,WRK,CURPOS,PBAR,PIVOT, TSNESV
     +                       FQ,FQQ,DN,DT,RESTNS,RESNEW,ITRMCD,FLAG,    TSNESV
     +                       ZERO1,IERR)                                TSNESV
                                                                        TSNESV
c decide which step to use (DN or DT)                                   TSNESV
                                                                        TSNESV
                 IF(GLOBAL.EQ.1 .OR. (M.GT.N .AND. GLOBAL.EQ.0)) THEN   TSNESV
                    CALL TSSLCT(RESTNS,RESNEW,ITRMCD,FC,M,N,DN,DT,GP,   TSNESV
     +                          DF,NWTAKE)                              TSNESV
                 ENDIF                                                  TSNESV
                                                                        TSNESV
              ENDIF                                                     TSNESV
                                                                        TSNESV
c choose the next iterate XP by a global strategy                       TSNESV
                                                                        TSNESV
             IF(GLOBAL.EQ.0) THEN                                       TSNESV
                IF(METHOD.EQ.0) THEN                                    TSNESV
                  CALL TSLSCH(M,N,XC,FC,DF,GP,STEPTL,DXN,DFN,TSFVEC,    TSNESV
     +                        MXTAKE,STEPMX,XP,FP,FNORM,FPLS,RETCD)     TSNESV
                 ELSEIF(M.EQ.N) THEN                                    TSNESV
                CALL TSMDLS(AJA,SHAT,ANLS,XC,FC,M,N,MAXM,MAXN,P,DT,GP,  TSNESV
     +                      DXN,DFN,TSFVEC,METHOD,STEPTL,GLOBAL,STEPMX, TSNESV
     +                      EPSM,FQ,WRK1,WRK2,WRK3,WRK4,DN,FQQ,PIVOT,   TSNESV
     +                      CURPOS,PBAR,MXTAKE,XP,FP,FNORM,FPLS,        TSNESV
     +                      ZERO1,RETCD,IERR)                           TSNESV
                 ELSE                                                   TSNESV
                  CALL TSLSCH(M,N,XC,FC,DF,GP,STEPTL,DXN,DFN,TSFVEC,    TSNESV
     +                        MXTAKE,STEPMX,XP,FP,FNORM,FPLS,RETCD)     TSNESV
                 ENDIF                                                  TSNESV
              ELSE                                                      TSNESV
                  CALL TS2DTR(AJA,SHAT,ANLS,DF,GP,GBAR,XC,FC,           TSNESV
     +                 METHOD,NWTAKE,STEPMX,STEPTL,EPSM,MXTAKE,         TSNESV
     +                 DLT,FQQ,MAXM,MAXN,M,N,P,CURPOS,PIVOT,            TSNESV
     +                 PBAR,ITN,IERR,FLAG,DXN,DFN,TSFVEC,DBAR,          TSNESV
     +                 DBARP,D,FHAT,WRK1,WRK2,WRK3,WRK4,WRK5,           TSNESV
     +                 XPLS,GPLS,FNORM,XP,FP,FPLS,RETCD)                TSNESV
              ENDIF                                                     TSNESV
                                                                        TSNESV
c evaluate the Jacobian at the new iterate XP                           TSNESV
                                                                        TSNESV
              CALL TSSCLJ(XP,DXN,TYPX,FP,DFN,FHAT,MAXM,M,N,EPSM,        TSNESV
     +                    JACFLG,TSFVEC,TSANJA,AJA)                     TSNESV
                                                                        TSNESV
c evaluate the gradient at the new iterate XP                           TSNESV
                                                                        TSNESV
              CALL DGEMV('T',M,N,ONE,AJA,MAXM,FP,1,ZERO,GP,1)           TSNESV
                                                                        TSNESV
c check stopping criteria for the new iterate XP                        TSNESV
                                                                        TSNESV
              CALL TSNSTP(GP,XP,FP,XC,STEPTL,GRADTL,RETCD,FTOL,ITN,     TSNESV
     +                    ITNLIM,ICSCMX,MXTAKE,M,N,MSG,IPR,FPLS,TERMCD) TSNESV
                                                                        TSNESV
              IF(TERMCD.GT.0) GO TO 120                                 TSNESV
              IF(MOD(MSG/16,2).EQ.1) CALL TSRSLT(N,XP,FPLS,GP,ITN,IPR)  TSNESV
                                                                        TSNESV
c if tensor method is selected then update the matrices S and FV        TSNESV
                                                                        TSNESV
              IF(METHOD.EQ.1) THEN                                      TSNESV
                 CALL TSUPSF(FC,XC,XP,SQRN,ITN,MAXM,MAXN,M,N,WRK1,S,FV) TSNESV
              ENDIF                                                     TSNESV
                                                                        TSNESV
c update XC, FC, and FNORM                                              TSNESV
                                                                        TSNESV
               CALL DCOPY(N,XP,1,XC,1)                                  TSNESV
               CALL DCOPY(M,FP,1,FC,1)                                  TSNESV
               FNORM = FPLS                                             TSNESV
        GO TO 80                                                        TSNESV
                                                                        TSNESV
c termination                                                           TSNESV
                                                                        TSNESV
120    IF(MOD(MSG/8,2).EQ.0) THEN                                      TSNESV
           IF(ITN.NE.0) THEN                                            TSNESV
              CALL TSRSLT(N,XP,FPLS,GP,ITN,IPR)                         TSNESV
           ELSE                                                         TSNESV
              FPLS = HALF*DNRM2(M,FC,1)**2                              TSNESV
              CALL TSRSLT(N,XC,FPLS,GP,ITN,IPR)                         TSNESV
           ENDIF                                                        TSNESV
        ENDIF                                                           TSNESV
        IF (ITN.EQ.0) THEN                                              TSNESV
           CALL DCOPY(N,XC,1,XP,1)                                      TSNESV
           CALL DCOPY(M,FC,1,FP,1)                                      TSNESV
           FNORM = FPLS                                                 TSNESV
        ENDIF                                                           TSNESV  
        CALL TSUNSX(XP,DXN,N)                                           TSNESV               
                                                                        TSNESV
896    FORMAT('  TSNESV      TYPICAL X')                               TSNESV
897    FORMAT('  TSNESV      DIAGONAL SCALING MATRIX FOR X')           TSNESV
898    FORMAT('  TSNESV      TYPICAL F')                               TSNESV
899    FORMAT('  TSNESV      DIAGONAL SCALING MATRIX FOR F')           TSNESV
900    FORMAT(100('  TSNESV     ',3(D20.13,3X),/))                     TSNESV
901    FORMAT('  TSNESV      JACOBIAN FLAG      = ',I1)                TSNESV
902    FORMAT('  TSNESV      METHOD USED        = ',I1)                TSNESV
903    FORMAT('  TSNESV      GLOBAL STRATEGY    = ',I1)                TSNESV
904    FORMAT('  TSNESV      ITERATION LIMIT    =',I5)                 TSNESV
905    FORMAT('  TSNESV      MACHINE EPSILON    =',D20.13)             TSNESV
906    FORMAT('  TSNESV      STEP TOLERANCE     =',D20.13)             TSNESV
907    FORMAT('  TSNESV      GRADIENT TOLERANCE =',D20.13)             TSNESV
908    FORMAT('  TSNESV      FUNCTION TOLERANCE =',D20.13)             TSNESV
909    FORMAT('  TSNESV      MAXIMUM STEP SIZE  =',D20.13)             TSNESV
910    FORMAT('  TSNESV      TRUST REG RADIUS   =',D20.13)             TSNESV
        END                                                             TSNESV
       SUBROUTINE TSNSTP(G,XPLUS,FPLUS,XC,STEPTL,GRADTL,RETCD,FTOL,ITN, TSNSTP
     +                  ITNLIM,ICSCMX,MXTAKE,M,N,MSG,IPR,FNORM,TERMCD)  TSNSTP
                                                                        TSNSTP
       INTEGER M,N,ITN,ITNLIM,MSG,IPR,TERMCD,RETCD,ICSCMX               TSNSTP
       DOUBLE PRECISION STEPTL,GRADTL,FTOL,FNORM                        TSNSTP
       DOUBLE PRECISION XPLUS(N),FPLUS(M),G(N),XC(N)                    TSNSTP
       LOGICAL MXTAKE                                                   TSNSTP
                                                                        TSNSTP
C********************************************************************** TSNSTP
C THIS ROUTINE DECIDES WHETHER TO TERMINATE THE NONLINEAR ALGORITHM.    TSNSTP
C********************************************************************** TSNSTP
C                                                                       TSNSTP
C       INPUT PARAMETERS :                                              TSNSTP
C       ------------------                                              TSNSTP
C                                                                       TSNSTP
C       G     : GRADIENT AT XC                                          TSNSTP
C       XPLUS : NEW ITERATE                                             TSNSTP
C       FPLUS : FUNCTION VALUE AT XPLUS                                 TSNSTP
C       XC    : CURRENT ITERATE                                         TSNSTP
C       STEPTL: STEP TOLERANCE                                          TSNSTP
C       GRADTL: GRADIENT TOLERANCE                                      TSNSTP
C       RETCD : RETURN CODE WITH THE FOLLOWING MEANINGS :               TSNSTP
C               RETCD = 0 : SUCCESSFUL GLOBAL STRATEGY                  TSNSTP
C               RETCD = 1 : UNSUCCESSFUL GLOBAL STRATEGY                TSNSTP
C       FTOL  : FUNCTION TOLERANCE                                      TSNSTP
C       ITN   : ITERATION NUMBER                                        TSNSTP
C       ITNLIM: ITERATION NUMBER LIMIT                                  TSNSTP
C       ICSCMX: NUMBER CONSECUTIVE STEPS .GE. STEPMX                    TSNSTP
C       MXTAKE: BOOLEAN FLAG INDICATING STEP OF MAXIMUM LENGTH          TSNSTP
C       M     : DIMENSION OF FPLUS                                      TSNSTP
C       N     : DIMENSION OF G, XC, AND XPLUS                           TSNSTP
C       MSG   : MESSAGE TO INHIBIT CERTAIN AUTOMATIC CHECKS + OUTPUT    TSNSTP
C       IPR   : DEVICE TO WHICH TO SEND OUTPUT                          TSNSTP
C                                                                       TSNSTP
C                                                                       TSNSTP
C       OUTPUT PARAMETERS :                                             TSNSTP
C       ------------------                                              TSNSTP
C                                                                       TSNSTP
C       TERMCD: RETURN CODE WITH THE FOLLOWING MEANINGS :               TSNSTP
C              TERMCD = 0 NO TERMINATION CRITERION SATISFIED            TSNSTP
C                                                                       TSNSTP
C              TERMCD > 0 : SOME TERMINATION CRITERION SATISFIED        TSNSTP
C              TERMCD = 1 : NORM OF SCALED FUNCTION VALUE IS LESS THAN  TSNSTP
C              FTOL                                                     TSNSTP
C              TERMCD = 2 :  GRADIENT TOLERANCE REACHED                 TSNSTP
C              TERMCD = 3 : SCALED DISTANCE BETWEEN LAST TWO STEPS      TSNSTP
C              LESS THAN STEPTL                                         TSNSTP
C              TERMCD = 4 : UNSUCCESSFUL GLOBAL STRATEGY                TSNSTP
C              TERMCD = 5 : ITERATION LIMIT EXCEEDED                    TSNSTP
C              TERMCD = 6 : FIVE CONSECUTIVE STEPS OF LENGTH STEPMX     TSNSTP
C                           HAVE BEEN TAKEN                             TSNSTP
C                                                                       TSNSTP
C       SUBPROGRAMS CALLED:                                             TSNSTP
C                                                                       TSNSTP
C       LEVEL 1 BLAS  ...  IDAMAX                                       TSNSTP
C                                                                       TSNSTP
C********************************************************************** TSNSTP
                                                                        TSNSTP
       INTEGER I                                                        TSNSTP
       DOUBLE PRECISION RES,D,RGX,RELGRD,RSX,RELSTP,ZERO,ONE            TSNSTP
       INTEGER IDAMAX                                                   TSNSTP
       INTRINSIC ABS,MAX                                                TSNSTP
       DATA ZERO,ONE/0.0D0,1.0D0/                                       TSNSTP
                                                                        TSNSTP
c check whether scaled function is within tolerance                     TSNSTP
                                                                        TSNSTP
       RES = ABS(FPLUS(IDAMAX(M,FPLUS,1)))                              TSNSTP
       IF(RES.LE.FTOL) THEN                                             TSNSTP
          TERMCD = 1                                                    TSNSTP
          IF(MOD(MSG/8,2).EQ.0) THEN                                    TSNSTP
             WRITE(IPR,701)                                             TSNSTP
          ENDIF                                                         TSNSTP
          RETURN                                                        TSNSTP
       ENDIF                                                            TSNSTP
                                                                        TSNSTP
c check whether scaled gradient is within tolerance                     TSNSTP
                                                                        TSNSTP
       D = ONE/MAX(FNORM, DBLE(N/2))                                    TSNSTP
       RGX = ZERO                                                       TSNSTP
       DO 200 I = 1,N                                                   TSNSTP
        RELGRD = ABS(G(I)) * MAX(ABS(XPLUS(I)), ONE)*D                  TSNSTP
        RGX = MAX(RGX,RELGRD)                                           TSNSTP
200   CONTINUE                                                         TSNSTP
       IF(RGX.LE.GRADTL) THEN                                           TSNSTP
          TERMCD = 2                                                    TSNSTP
          IF(MOD(MSG/8,2).EQ.0) THEN                                    TSNSTP
             WRITE(IPR,702)                                             TSNSTP
          ENDIF                                                         TSNSTP
          RETURN                                                        TSNSTP
       ENDIF                                                            TSNSTP
                                                                        TSNSTP
       IF(ITN.EQ.0) RETURN                                              TSNSTP
                                                                        TSNSTP
       IF(RETCD.EQ.1) THEN                                              TSNSTP
          TERMCD = 4                                                    TSNSTP
          IF(MOD(MSG/8,2).EQ.0)  THEN                                   TSNSTP
          WRITE(IPR,703)                                                TSNSTP
          ENDIF                                                         TSNSTP
          RETURN                                                        TSNSTP
       ENDIF                                                            TSNSTP
                                                                        TSNSTP
c check whether relative step length is within tolerance                TSNSTP
                                                                        TSNSTP
       RSX = ZERO                                                       TSNSTP
       DO 300 I = 1,N                                                   TSNSTP
          RELSTP = ABS(XPLUS(I) - XC(I))/MAX(XPLUS(I), ONE)             TSNSTP
          RSX = MAX(RSX, RELSTP)                                        TSNSTP
300   CONTINUE                                                         TSNSTP
       IF(RSX.LE.STEPTL) THEN                                           TSNSTP
         TERMCD = 3                                                     TSNSTP
         IF(MOD(MSG/8,2).EQ.0) THEN                                     TSNSTP
         WRITE(IPR,704)                                                 TSNSTP
         ENDIF                                                          TSNSTP
         RETURN                                                         TSNSTP
       ENDIF                                                            TSNSTP
                                                                        TSNSTP
c check iteration limit                                                 TSNSTP
                                                                        TSNSTP
       IF(ITN.GE.ITNLIM) THEN                                           TSNSTP
          TERMCD = 5                                                    TSNSTP
          IF(MOD(MSG/8,2).EQ.0) THEN                                    TSNSTP
             WRITE(IPR,705)                                             TSNSTP
          ENDIF                                                         TSNSTP
       ENDIF                                                            TSNSTP
                                                                        TSNSTP
c check number of consecutive steps .ge. stepmx                         TSNSTP
                                                                        TSNSTP
       IF(MXTAKE) THEN                                                  TSNSTP
          ICSCMX = ICSCMX+1                                             TSNSTP
          IF(ICSCMX.GE.5) THEN                                          TSNSTP
             TERMCD = 6                                                 TSNSTP
             IF(MOD(MSG/8,2).EQ.0) THEN                                 TSNSTP
                WRITE(IPR,706)                                          TSNSTP
             ENDIF                                                      TSNSTP
          ENDIF
       ELSE
          ICSCMX=0
       ENDIF
                                                                        TSNSTP
701   FORMAT(/,'  TSNSTP      FUNCTION VALUE CLOSE TO ZERO')           TSNSTP
702   FORMAT(/,'  TSNSTP      RELATIVE GRADIENT CLOSE TO ZERO')        TSNSTP
703   FORMAT(/,'  TSNSTP      LAST GLOBAL STEP FAILED TO LOCATE A',/   TSNSTP
     +        '  TSNSTP      POINT LOWER THAN THE CURRENT ITERATE')     TSNSTP
704   FORMAT(/,'  TSNSTP      SUCCESSIVE ITERATES WITHIN TOLERANCE',/  TSNSTP
     +        '  TSNSTP      CURRENT ITERATE IS PROBABLY SOLUTION')     TSNSTP
705   FORMAT(/,'  TSNSTP      ITERATION LIMIT EXCEEDED',/              TSNSTP
     +        '  TSNSTP      ALGORITHM FAILED')                         TSNSTP
706   FORMAT(/,'  TSNSTP      MAXIMUM STEP SIZE EXCEEDED 5',           TSNSTP
     +        ' CONSECUTIVE TIMES',/                                    TSNSTP
     +        '  TSNSTP      EITHER THE FUNCTION IS UNBOUNDED BELOW',/  TSNSTP
     +        '  TSNSTP      BECOMES ASYMPTOTIC TO A FINITE VALUE',/    TSNSTP
     +        '  TSNSTP      FROM ABOVE IN SOME DIRECTION',/            TSNSTP
     +        '  TSNSTP      OR STEPMX IS TOO SMALL')                   TSNSTP
                                                                        TSNSTP
       RETURN                                                           TSNSTP
       END                                                              TSNSTP
      SUBROUTINE TSPRMV(X,Y,PIVOT,N,JOB)                                TSPRMV
                                                                        TSPRMV
      INTEGER N,JOB                                                     TSPRMV
      INTEGER PIVOT(N)                                                  TSPRMV
      DOUBLE PRECISION X(N),Y(N)                                        TSPRMV
                                                                        TSPRMV
C********************************************************************** TSPRMV
C THIS SUBROUTINE PERFORMS A VECTOR PERMUTATION.                        TSPRMV
C********************************************************************** TSPRMV
C                                                                       TSPRMV
C       INPUT PARAMETERS :                                              TSPRMV
C       -----------------                                               TSPRMV
C                                                                       TSPRMV
C       Y :  VECTOR TO TSPRMV                                           TSPRMV
C       PIVOT :  PIVOT VECTOR                                           TSPRMV
C       N :  DIMENSION OF THE VECTORS Y AND PIVOT                       TSPRMV
C                                                                       TSPRMV
C       OUTPUT PARAMETERS :                                             TSPRMV
C       -------------------                                             TSPRMV
C                                                                       TSPRMV
C        X : PIVOTED VECTOR                                             TSPRMV
C                                                                       TSPRMV
C********************************************************************** TSPRMV
                                                                        TSPRMV
       INTEGER I                                                        TSPRMV
                                                                        TSPRMV
       IF(JOB .EQ. 0) THEN                                              TSPRMV
                                                                        TSPRMV
c permute Y                                                             TSPRMV
                                                                        TSPRMV
          DO 20 I = 1,N                                                 TSPRMV
             X(PIVOT(I)) = Y(I)                                         TSPRMV
20       CONTINUE                                                      TSPRMV
       ELSE                                                             TSPRMV
                                                                        TSPRMV
c reverse permute of Y                                                  TSPRMV
                                                                        TSPRMV
          DO 30 I = 1,N                                                 TSPRMV
             X(I) = Y(PIVOT(I))                                         TSPRMV
30       CONTINUE                                                      TSPRMV
                                                                        TSPRMV
       ENDIF                                                            TSPRMV
                                                                        TSPRMV
       RETURN                                                           TSPRMV
       END                                                              TSPRMV
       SUBROUTINE TSRSLT(N,XP,FVAL,GP,ITN,IPR)                          TSRSLT
                                                                        TSRSLT
       INTEGER N,ITN,IPR                                                TSRSLT
       DOUBLE PRECISION FVAL                                            TSRSLT
       DOUBLE PRECISION XP(N),GP(N)                                     TSRSLT
                                                                        TSRSLT
C********************************************************************** TSRSLT
C THIS ROUTINE PRINTS INFORMATION.                                      TSRSLT
C********************************************************************** TSRSLT
C                                                                       TSRSLT
C       INPUT PARAMETERS :                                              TSRSLT
C       -----------------                                               TSRSLT
C                                                                       TSRSLT
C       M,N  : DIMENSIONS OF PROBLEM                                    TSRSLT
C       XP   : NEXT ITERATE                                             TSRSLT
C       FVAL : SUM OF SQUARES OF F(XP)                                  TSRSLT
C       GP   : GRADIENT AT XP                                           TSRSLT
C       ITN  : ITERATION NUMBER                                         TSRSLT
C       IPR  : DEVICE TO WHICH TO SEND OUTPUT                           TSRSLT
C                                                                       TSRSLT
C********************************************************************** TSRSLT
                                                                        TSRSLT
       INTEGER I                                                        TSRSLT
                                                                        TSRSLT
       WRITE(IPR,801) ITN                                               TSRSLT
       WRITE(IPR,802)                                                   TSRSLT
       WRITE(IPR,803) (XP(I),I = 1,N)                                   TSRSLT
       WRITE(IPR,804)                                                   TSRSLT
       WRITE(IPR,805) FVAL                                              TSRSLT
       WRITE(IPR,806)                                                   TSRSLT
       WRITE(IPR,807) (GP(I),I = 1,N)                                   TSRSLT
                                                                        TSRSLT
801   FORMAT(/,'  TSRSLT    ITERATION K   =',I5)                       TSRSLT
802   FORMAT('  TSRSLT    X(K)')                                       TSRSLT
803   FORMAT(100('  TSRSLT    ',3(D20.13,3X),/))                       TSRSLT
804   FORMAT('  TSRSLT    FUNCTION AT X(K)')                           TSRSLT
805   FORMAT('  TSRSLT       ',D20.13)                                 TSRSLT
806   FORMAT('  TSRSLT    GRADIENT AT X(K)')                           TSRSLT
807   FORMAT(100('  TSRSLT    ',3(D20.13,3X),/))                       TSRSLT
                                                                        TSRSLT
       RETURN                                                           TSRSLT
       END                                                              TSRSLT
       SUBROUTINE TSQ1P1(AJA,ANLS,S,F,MAXM,MAXN,N,ROOT,RESTNS)          TSQ1P1
                                                                        TSQ1P1
       INTEGER MAXM,MAXN,N                                              TSQ1P1
       DOUBLE PRECISION ROOT,RESTNS                                     TSQ1P1
       DOUBLE PRECISION AJA(MAXM,N),S(MAXN,*),F(N),ANLS(MAXM,*)         TSQ1P1
                                                                        TSQ1P1
C********************************************************************** TSQ1P1
C THIS ROUTINE SOLVES THE LOWER M-N+Q QUADRATIC EQUATIONS IN P UNKNOWNS TSQ1P1
C OF THE TENSOR MODEL WHEN Q = 1 AND P = 1.                             TSQ1P1
C********************************************************************** TSQ1P1
C                                                                       TSQ1P1
C       INPUT PARAMETERS :                                              TSQ1P1
C       -----------------                                               TSQ1P1
C                                                                       TSQ1P1
C       AJA  : JACOBIAN MATRIX AT CURRENT ITERATE                       TSQ1P1
C       ANLS : TENSOR TERM MATRIX AT CURRENT ITERATE                    TSQ1P1
C       S    : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS           TSQ1P1
C       F    : FUNCTION VALUE AT CURRENT ITERATE MULTIPIED BY AN        TSQ1P1
C              ORTHOGONAL MATRIX                                        TSQ1P1
C       MAXM : LEADING DIMENSION OF AJA AND ANLS                        TSQ1P1
C       MAXN : LEADING DIMENSION OF S                                   TSQ1P1
C       N    : COLUMN DIMENSION OF AJA                                  TSQ1P1
C                                                                       TSQ1P1
C       OUTPUT PARAMETERS :                                             TSQ1P1
C       -----------------                                               TSQ1P1
C                                                                       TSQ1P1
C       ROOT   : SOLUTION TO THE SYSTEM                                 TSQ1P1
C       RESTNS : TENSOR RESIDUAL                                        TSQ1P1
C                                                                       TSQ1P1
C********************************************************************** TSQ1P1
                                                                        TSQ1P1
       DOUBLE PRECISION DELTA,T1,T2,ZERO,HALF,ONE,TWO                   TSQ1P1
       INTRINSIC ABS,SQRT                                               TSQ1P1
       DATA ZERO,HALF,ONE,TWO/0.0D0,0.50D0,1.0D0,2.0D0/                 TSQ1P1
                                                                        TSQ1P1
c find the roots of the equation:                                       TSQ1P1
c F(N) + AJA(N,N)*D + 0.5*ANLS(N,1)*(S(N+2,1)*D)**2                     TSQ1P1
                                                                        TSQ1P1
       T1 = AJA(N,N)                                                    TSQ1P1
       T2 = ANLS(N,1) * S(N+2,1)**2                                     TSQ1P1
       IF(ANLS(N,1).EQ.ZERO) THEN                                       TSQ1P1
          ROOT = -F(N)/T1                                               TSQ1P1
       ELSE                                                             TSQ1P1
          DELTA = T1**2 - TWO*F(N)*T2                                   TSQ1P1
          IF(DELTA.GE.ZERO) THEN                                        TSQ1P1
             ROOT = (-T1+SIGN(ONE,T1) * SQRT(DELTA))/T2                 TSQ1P1
          ELSE                                                          TSQ1P1
             ROOT = -T1/T2                                              TSQ1P1
          ENDIF                                                         TSQ1P1
       ENDIF                                                            TSQ1P1
                                                                        TSQ1P1
c compute tensor residual                                               TSQ1P1
                                                                        TSQ1P1
       RESTNS = ABS(F(N)+AJA(N,N)*ROOT+HALF*ANLS(N,1)*(S(N+2,1)**2)*    TSQ1P1
     +              (ROOT**2))                                          TSQ1P1
       RETURN                                                           TSQ1P1
       END                                                              TSQ1P1
        SUBROUTINE TSQFCN(P,X,SUM,AJA,ANLS,S,F,WRK1,WRK2,WRK3,          TSQFCN
     +                    WRK4,WRK5,MAXM,MAXN,M,N,Q)                    TSQFCN
                                                                        TSQFCN
        INTEGER MAXM,MAXN,M,N,P,Q                                       TSQFCN
        DOUBLE PRECISION X(P),AJA(MAXM,N),ANLS(MAXM,P),S(MAXN,P)        TSQFCN
        DOUBLE PRECISION F(M),WRK1(M),WRK2(P),WRK3(P),WRK4(M),WRK5(M)   TSQFCN
                                                                        TSQFCN
C*********************************************************************  TSQFCN
C THIS ROUTINE IS USED TO EVALUATE THE RESIDUAL OF THE LAST M-N+P       TSQFCN
C QUADRATIC EQUATIONS IN P UNKNOWNS OF THE TENSOR MODEL. NOTE THAT      TSQFCN
C THIS ROUTINE IS CALLED BY UNCMIN TO SOLVE THE NONLINEAR LEAST SQUARES TSQFCN
C PART OF THE TENSOR MODEL.                                             TSQFCN
C*********************************************************************  TSQFCN
C                                                                       TSQFCN
C       INPUT PARAMETERS :                                              TSQFCN
C       -----------------                                               TSQFCN
C                                                                       TSQFCN
C       P : DIMENSION OF THE PROBLEM SOLVED BY UNCMIN                   TSQFCN
C       AJA  : JACOBIAN MATRIX AT CURRENT ITERATE                       TSQFCN
C       ANLS : TENSOR TERM MATRIX AT CURRENT ITERATE                    TSQFCN
C       S    : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS           TSQFCN
C       F    : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY AN       TSQFCN
C              ORTHOGONAL MATRIX                                        TSQFCN
C       WRK1,WRK2,WRK3,WRK4,WRK5 : WORKING VECTORS                      TSQFCN
C       MAXM : LEADING DIMENSION OF AJA AND ANLS                        TSQFCN
C       MAXN : LEADING DIMENSION OF S                                   TSQFCN
C       M,N  : DIMENSION OF PROBLEM                                     TSQFCN
C       Q    : NUMERICAL RANK OF JACOBIAN :                             TSQFCN
C           Q > P : JACOBIAN IS SINGULAR                                TSQFCN
C           Q = P : OTHERWISE                                           TSQFCN
C                                                                       TSQFCN
C       INPUT-OUTPUT PARAMETERS :                                       TSQFCN
C       -----------------------                                         TSQFCN
C                                                                       TSQFCN
C       X : NULL VECTOR ON ENTRY AND APPROXIMATION OF THE SOLUTION      TSQFCN
C           TO THE SYSTEM OF M-N+Q QUADRATIC EQUATIONS IN P UNKNOWNS    TSQFCN
C           OF THE TENSOR MODEL ON EXIT                                 TSQFCN
C                                                                       TSQFCN
C       OUTPUT PARAMETERS :                                             TSQFCN
C       -----------------                                               TSQFCN
C                                                                       TSQFCN
C       SUM : RESIDUAL OF THE LAST M-N+P QUADRATIC EQUATIONS IN P       TSQFCN
C             UNKNOWNS OF THE TENSOR MODEL                              TSQFCN
C                                                                       TSQFCN
C       SUBPROGRAMS CALLED:                                             TSQFCN
C                                                                       TSQFCN
C       LEVEL 1 BLAS  ...  DNRM2                                        TSQFCN
C       LEVEL 2 BLAS  ...  DGEMV                                        TSQFCN
C       TENSOLVE      ...  TSSTMX                                       TSQFCN
C                                                                       TSQFCN
C*********************************************************************  TSQFCN
                                                                        TSQFCN
       INTEGER I                                                        TSQFCN
       DOUBLE PRECISION SUM,ZERO,HALF,ONE                               TSQFCN
       DOUBLE PRECISION DNRM2                                           TSQFCN
       DATA ZERO,HALF,ONE/0.0D0,0.50D0,1.0D0/                           TSQFCN
                                                                        TSQFCN
c compute the lower right (m-n+q) x p submatrix of AJA times X          TSQFCN
                                                                        TSQFCN
       CALL DGEMV('N',M-N+Q,P,ONE,AJA(N-Q+1,N-P+1),MAXM,                TSQFCN
     +            X,1,ZERO,WRK1,1)                                      TSQFCN
                                                                        TSQFCN
c compute S-trans times X                                               TSQFCN
                                                                        TSQFCN
       CALL TSSTMX(S,X,MAXN,N,P,WRK2,WRK3)                              TSQFCN
                                                                        TSQFCN
c compute 0.5 * (S-trans times X)**2                                    TSQFCN
                                                                        TSQFCN
       DO 10 I = 1, P                                                   TSQFCN
          WRK2(I) = HALF * WRK3(I)**2                                   TSQFCN
10    CONTINUE                                                         TSQFCN
                                                                        TSQFCN
c compute 0.5 * (down (m-n+q) x p submatrix of ANLS) *                  TSQFCN
c (S-trans times X)**2                                                  TSQFCN
                                                                        TSQFCN
       CALL DGEMV('N',M-N+Q,P,ONE,ANLS(N-Q+1,1),MAXM,                   TSQFCN
     +            WRK2,1,ZERO,WRK4,1)                                   TSQFCN
                                                                        TSQFCN
       DO 20 I = 1,M-N+Q                                                TSQFCN
          WRK5(I) = WRK4(I)+F(N-Q+I)+WRK1(I)                            TSQFCN
20    CONTINUE                                                         TSQFCN
                                                                        TSQFCN
       SUM = HALF*DNRM2(M-N+Q,WRK5,1)**2                                TSQFCN
                                                                        TSQFCN
       RETURN                                                           TSQFCN
       END                                                              TSQFCN
      SUBROUTINE TSQLFC(QL,NR,M,N,IERR)                                 TSQLFC
                                                                        TSQLFC
      INTEGER NR,M,N,IERR                                               TSQLFC
      DOUBLE PRECISION QL(NR,N)                                         TSQLFC
                                                                        TSQLFC
C********************************************************************** TSQLFC
C THIS ROUTINE PERFORMS A QL DECOMPOSITION.                             TSQLFC
C********************************************************************** TSQLFC
C                                                                       TSQLFC
C       INPUT PARAMETERS :                                              TSQLFC
C       ----------------                                                TSQLFC
C                                                                       TSQLFC
C        NR  : LEADING DIMENSION OF MATRIX QL                           TSQLFC
C        M   : ROW DIMENSION OF QL                                      TSQLFC
C        N   : COLUMN DIMENSION OF QL                                   TSQLFC
C                                                                       TSQLFC
C       INPUT-OUTPUT PARAMETERS :                                       TSQLFC
C       -----------------------                                         TSQLFC
C                                                                       TSQLFC
C        QL : INPUT MATRIX ON ENTRY AND FACTORED MATRIX ON EXIT         TSQLFC
C                                                                       TSQLFC
C       OUTPUT PARAMETERS :                                             TSQLFC
C       ------------------                                              TSQLFC
C                                                                       TSQLFC
C        IERR : RETURN CODE WITH THE FOLLOWING MEANINGS :               TSQLFC
C               IERR = 1 : SINGULARITY DETECTED                         TSQLFC
C               IERR = 0 : OTHERWISE                                    TSQLFC
C                                                                       TSQLFC
C       SUBPROGRAMS CALLED:                                             TSQLFC
C                                                                       TSQLFC
C       LEVEL 1 BLAS  ...  DAXPY,DDOT,DSCAL                             TSQLFC
C                                                                       TSQLFC
C********************************************************************** TSQLFC
                                                                        TSQLFC
       INTEGER I,J,K                                                    TSQLFC
       DOUBLE PRECISION NU,SIGMA,TAU,RNU,ZERO,ONE                       TSQLFC
       INTRINSIC ABS,MAX,SQRT                                           TSQLFC
       DOUBLE PRECISION DDOT,DNRM2                                      TSQLFC
       DATA ZERO,ONE/0.0D0,1.0D0/                                       TSQLFC
                                                                        TSQLFC
c zero out rows m+1 and m+2 of matrix QL                                TSQLFC
                                                                        TSQLFC
       DO 10 J = 1,N                                                    TSQLFC
          QL(M+1,J) = ZERO                                              TSQLFC
          QL(M+2,J) = ZERO                                              TSQLFC
10    CONTINUE                                                         TSQLFC
                                                                        TSQLFC
       IERR = 0                                                         TSQLFC
                                                                        TSQLFC
       K = 1                                                            TSQLFC
                                                                        TSQLFC
20    CONTINUE                                                         TSQLFC
       IF((K.LT.M).AND.(K.LE.N)) THEN                                   TSQLFC
                                                                        TSQLFC
c find NU = max element of col K on or above l-diagonal                 TSQLFC
                                                                        TSQLFC
         NU = ZERO                                                      TSQLFC
         DO 40 I = 1,M+1-K                                              TSQLFC
            NU = MAX(NU,ABS(QL(I,K)))                                   TSQLFC
40      CONTINUE                                                       TSQLFC
                                                                        TSQLFC
         IF(NU.NE.ZERO) THEN                                            TSQLFC
                                                                        TSQLFC
c normalize col K on or above l-diagonal                                TSQLFC
                                                                        TSQLFC
            RNU = ONE/NU                                                TSQLFC
            CALL DSCAL(M-K+1,RNU,QL(1,K),1)                             TSQLFC
                                                                        TSQLFC
c code to find SIGMA = SGN(QL(M+1-K,K))*l2-norm of col K on or          TSQLFC
c above l-diagonal                                                      TSQLFC
                                                                        TSQLFC
            SIGMA = DNRM2(M-K+1,QL(1,K),1)                              TSQLFC
            SIGMA = SIGN(SIGMA,QL(M+1-K,K))                             TSQLFC
                                                                        TSQLFC
c store last element(1st in normal QR) of U-vector in QL(M+1-K,K)       TSQLFC
                                                                        TSQLFC
            QL(M+1-K,K) = QL(M+1-K,K)+SIGMA                             TSQLFC
                                                                        TSQLFC
c store value of <U,U>/2 in QL(M+1,K)                                   TSQLFC
                                                                        TSQLFC
            QL(M+1,K) = SIGMA*QL(M+1-K,K)                               TSQLFC
            IF(QL(M+1,K).EQ.ZERO) THEN                                  TSQLFC
               IERR = 1                                                 TSQLFC
               RETURN                                                   TSQLFC
            ENDIF                                                       TSQLFC
                                                                        TSQLFC
c store L(M+1-K,K) in QL(M+2,K)                                         TSQLFC
                                                                        TSQLFC
            QL(M+2,K) = -NU*SIGMA                                       TSQLFC
                                                                        TSQLFC
c code to get (I-2U*UT/<U,U>)*QL for kth iteration                      TSQLFC
                                                                        TSQLFC
            IF(K.LT.N) THEN                                             TSQLFC
               DO 50 J = K+1,N                                          TSQLFC
                                                                        TSQLFC
c loop to get TAU = <U,J-TH COL OF QL>                                  TSQLFC
                                                                        TSQLFC
               TAU = DDOT(M-K+1,QL(1,K),1,QL(1,J),1)                    TSQLFC
               TAU = -TAU/QL(M+1,K)                                     TSQLFC
                                                                        TSQLFC
c loop to get (I-2U*UT/<U,U>)*j-th col of QL                            TSQLFC
                                                                        TSQLFC
               CALL DAXPY(M-K+1,TAU,QL(1,K),1,QL(1,J),1)                TSQLFC
                                                                        TSQLFC
50            CONTINUE                                                 TSQLFC
            ENDIF                                                       TSQLFC
            K = K+1                                                     TSQLFC
        ELSE                                                            TSQLFC
            IERR = 1                                                    TSQLFC
            RETURN                                                      TSQLFC
        ENDIF                                                           TSQLFC
                                                                        TSQLFC
        GOTO 20                                                         TSQLFC
                                                                        TSQLFC
      ENDIF                                                             TSQLFC
                                                                        TSQLFC
      IF(M.EQ.N) QL(M+2,N) = QL(1,N)                                    TSQLFC
                                                                        TSQLFC
      IF(QL(M+2,N).EQ.ZERO) THEN                                        TSQLFC
         IERR = 1                                                       TSQLFC
      ENDIF                                                             TSQLFC
                                                                        TSQLFC
      RETURN                                                            TSQLFC
      END                                                               TSQLFC
       SUBROUTINE TSQMLV(NR,N,P,Q,V,W,TRANS)                            TSQMLV
                                                                        TSQMLV
       INTEGER NR,N,P                                                   TSQMLV
       DOUBLE PRECISION Q(NR,P),V(N),W(N)                               TSQMLV
                                                                        TSQMLV
C********************************************************************** TSQMLV
C THIS ROUTINE MULTIPLYS AN ORTHOGONAL MATRTIX Q OR ITS TRANSPOSE BY    TSQMLV
C A VECTOR.                                                             TSQMLV
C********************************************************************** TSQMLV
C                                                                       TSQMLV
C       INPUT PARAMETERS :                                              TSQMLV
C       ----------------                                                TSQMLV
C                                                                       TSQMLV
C       NR : LEADING DIMENSION OF MATRIX Q                              TSQMLV
C       N  : DIMENSION OF VECTORS V AND W                               TSQMLV
C       P  : COLUMN DIMENSION OF MATRIX Q                               TSQMLV
C       Q  : ORTHOGONAL MATRIX (OBTAINED FROM TSQLFC SUBROUTINE)        TSQMLV
C       V  : VECTOR TO BE MULTIPLIED BY Q                               TSQMLV
C       TRANS : BOOLEAN PARAMETER:                                      TSQMLV
C               = TRUE  : PERFORM Q-TRANS*V                             TSQMLV
C               = FALSE : PERFORM Q*V                                   TSQMLV
C                                                                       TSQMLV
C       OUTPUT PARAMETERS :                                             TSQMLV
C       -----------------                                               TSQMLV
C                                                                       TSQMLV
C       W  : VECTOR Q*V OR Q-TRANS*V ON EXIT                            TSQMLV
C                                                                       TSQMLV
C       SUBPROGRAMS CALLED:                                             TSQMLV
C                                                                       TSQMLV
C       LEVEL 1 BLAS  ...  DAXPY,DCOPY,DDOT                             TSQMLV
C                                                                       TSQMLV
C********************************************************************** TSQMLV
                                                                        TSQMLV
       INTEGER J,K                                                      TSQMLV
       DOUBLE PRECISION TAU,CONST                                       TSQMLV
       LOGICAL TRANS                                                    TSQMLV
       DOUBLE PRECISION DDOT                                            TSQMLV
                                                                        TSQMLV
       CALL DCOPY(N,V,1,W,1)                                            TSQMLV
                                                                        TSQMLV
       DO 40 J = 1,P                                                    TSQMLV
          IF(TRANS) THEN                                                TSQMLV
             K = P+1-J                                                  TSQMLV
          ELSE                                                          TSQMLV
             K = J                                                      TSQMLV
          ENDIF                                                         TSQMLV
          TAU = DDOT(N-K+1,Q(1,K),1,W,1)                                TSQMLV
          CONST = -TAU/Q(N+1,K)                                         TSQMLV
          CALL DAXPY(N-K+1,CONST,Q(1,K),1,W,1)                          TSQMLV
40    CONTINUE                                                         TSQMLV
                                                                        TSQMLV
       RETURN                                                           TSQMLV
       END                                                              TSQMLV
      SUBROUTINE TSQMTS(ANLS,QHAT,NR,MJ,N,M,P,LB,WRK1,ZERO1)            TSQMTS
                                                                        TSQMTS
      INTEGER NR,M,N,P,MJ,LB,ZERO1                                      TSQMTS
      DOUBLE PRECISION ANLS(NR,P),QHAT(NR,N),WRK1(M)                    TSQMTS
                                                                        TSQMTS
C********************************************************************** TSQMTS
C THIS ROUTINE MULTIPLIES AN ORTHOGONAL MATRIX QHAT BY THE TENSOR       TSQMTS
C MATRIX ANLS.                                                          TSQMTS
C********************************************************************** TSQMTS
C                                                                       TSQMTS
C       INPUT PARAMETERS :                                              TSQMTS
C       ----------------                                                TSQMTS
C                                                                       TSQMTS
C       QHAT :  ORTHOGONAL MATRIX (OBTAINED FROM TSQRFC SUBROUTINE)     TSQMTS
C       NR : LEADIND DIMENSION OF MATRIX QHAT                           TSQMTS
C       MJ : ROW DIMENSION OF QHAT                                      TSQMTS
C       N  : COLUMN DIMENSION OF MATRIX QHAT                            TSQMTS
C       M  : ROW DIMENSION OF MATRIX ANLS                               TSQMTS
C       P  : COLUMN DIMENSION OF MATRIX ANLS                            TSQMTS
C       LB : STARTING COLUMN FROM WHICH QR DECOMPOSITION WAS PERFORMED  TSQMTS
C       WRK1 : WORKING VECTOR                                           TSQMTS
C       ZERO1: FIRST ZERO COLUMN OF MATRIX QHAT IN CASE OF SINGULARITY  TSQMTS
C                                                                       TSQMTS
C        INPUT-OUTPUT PARAMETERS :                                      TSQMTS
C       ------------------------                                        TSQMTS
C                                                                       TSQMTS
C       ANLS : MATRIX TO BE MULTIPLIED BY AN ORTHOGONAL MATRIX          TSQMTS
C       ON ENTRY AND THE MATRIX QHAT*ANLS ON EXIT                       TSQMTS
C                                                                       TSQMTS
C       SUBPROGRAMS CALLED:                                             TSQMTS
C                                                                       TSQMTS
C       LEVEL 1 BLAS  ...  DCOPY                                        TSQMTS
C       TENSOLVE      ...  TSQMUV                                       TSQMTS
C                                                                       TSQMTS
C********************************************************************** TSQMTS
                                                                        TSQMTS
       INTEGER J                                                        TSQMTS
                                                                        TSQMTS
       DO 40 J = 1,P                                                    TSQMTS
          CALL TSQMUV(QHAT,ANLS(1,J),WRK1,NR,MJ,LB,ZERO1,.FALSE.)       TSQMTS
          CALL DCOPY(M,WRK1,1,ANLS(1,J),1)                              TSQMTS
40    CONTINUE                                                         TSQMTS
                                                                        TSQMTS
       RETURN                                                           TSQMTS
       END                                                              TSQMTS
       SUBROUTINE TSQMUV(Q,V,W,NR,M,LB,ZERO1,TRANSP)                    TSQMUV
                                                                        TSQMUV
       INTEGER NR,M,LB,ZERO1                                            TSQMUV
       DOUBLE PRECISION Q(NR,*),V(M),W(M)                               TSQMUV
       LOGICAL TRANSP                                                   TSQMUV
                                                                        TSQMUV
C********************************************************************** TSQMUV
C THIS SUBROUTINE MULTIPLIES AN ORTHOGONAL MATRIX BY A VECTOR.          TSQMUV
C********************************************************************** TSQMUV
C                                                                       TSQMUV
C       INPUT PARAMETERS :                                              TSQMUV
C       -----------------                                               TSQMUV
C                                                                       TSQMUV
C       Q  : FACTORED MATRIX (OBTAINED FROM SUBROUTINE TSQRFC)          TSQMUV
C       V  : VECTOR TO BE MULTIPLIED BY THE ORTHOGONAL MATRIX Q         TSQMUV
C       NR : LEADING DIMENSION OF MATRIX Q                              TSQMUV
C       M  : ROW DIMENSION OF MATRIX Q                                  TSQMUV
C       LB : STARTING COLUMN FROM WHICH QR DECOMPOSITION WAS PERFORMED  TSQMUV
C       ZERO1: FIRST ZERO COLUMN OF THE MATRIX Q                        TSQMUV
C       TRANSP : BOOLEAN PARAMETER :                                    TSQMUV
C                = TRUE  : PERFORM Q-TRANS*V                            TSQMUV
C                = FALSE : PERFORM Q*V                                  TSQMUV
C                                                                       TSQMUV
C       OUTPUT PARAMETERS :                                             TSQMUV
C       -----------------                                               TSQMUV
C                                                                       TSQMUV
C       W : Q*V OR Q-TRANS*V ON EXIT                                    TSQMUV
C                                                                       TSQMUV
C       SUBPROGRAMS CALLED:                                             TSQMUV
C                                                                       TSQMUV
C       LEVEL 1 BLAS  ...  DAXPY,DCOPY,DDOT                             TSQMUV
C                                                                       TSQMUV
C********************************************************************   TSQMUV
C                                                                       TSQMUV
       INTEGER UB,A,B,C,K                                               TSQMUV
       DOUBLE PRECISION TAU,CONST                                       TSQMUV
       DOUBLE PRECISION DDOT                                            TSQMUV
                                                                        TSQMUV
c copy the vector V to W                                                TSQMUV
                                                                        TSQMUV
       CALL DCOPY(M,V,1,W,1)                                            TSQMUV
                                                                        TSQMUV
       UB = ZERO1-1                                                     TSQMUV
       IF(TRANSP) THEN                                                  TSQMUV
         A = UB                                                         TSQMUV
         B = LB                                                         TSQMUV
         C = -1                                                         TSQMUV
       ELSE                                                             TSQMUV
         A = LB                                                         TSQMUV
         B = UB                                                         TSQMUV
         C = 1                                                          TSQMUV
       ENDIF                                                            TSQMUV
                                                                        TSQMUV
       DO 50 K = A,B,C                                                  TSQMUV
          TAU = DDOT(M-K+1,Q(K,K),1,W(K),1)                             TSQMUV
          CONST = -TAU/Q(M+1,K)                                         TSQMUV
          CALL DAXPY(M-K+1,CONST,Q(K,K),1,W(K),1)                       TSQMUV
50    CONTINUE                                                         TSQMUV
                                                                        TSQMUV
       RETURN                                                           TSQMUV
       END                                                              TSQMUV
       SUBROUTINE TSQRFC(QR,NR,N,M,LB,UB,IERR,EPSM,AL2NRM,CURPOS,ZERO1) TSQRFC
                                                                        TSQRFC
       INTEGER NR,N,M,LB,UB,IERR,ZERO1                                  TSQRFC
       INTEGER CURPOS(N)                                                TSQRFC
       DOUBLE PRECISION QR(NR,N),AL2NRM(M),EPSM                         TSQRFC
                                                                        TSQRFC
C********************************************************************** TSQRFC
C THIS ROUTINE PERFORMS COLUMN-PIVOTED QR DECOMPOSITION ON AN M*N       TSQRFC
C MATRIX. THE DECOMPOSITION IS DONE BETWEEN COLS LB AND UB.             TSQRFC
C********************************************************************** TSQRFC
C                                                                       TSQRFC
C       INPUT PARAMETERS :                                              TSQRFC
C       -----------------                                               TSQRFC
C                                                                       TSQRFC
C       NR : LEADING DIMENSION OF MATRIX QR                             TSQRFC
C       N  : COLUMN DIMENSION OF MATRIX QR                              TSQRFC
C       M  : ROW DIMENSION OF MATRIX QR                                 TSQRFC
C       LB,UB : SUBSPACE OF QR DECOMPOSITION                            TSQRFC
C       EPSM  : MACHINE PRECISION                                       TSQRFC
C       AL2NRM: WORKING VECTOR                                          TSQRFC
C                                                                       TSQRFC
C       INPUT-OUTPUT PARAMETERS :                                       TSQRFC
C       ------------------------                                        TSQRFC
C       QR  : INPUT MATRIX ON ENTRY AND FACTORED MATRIX ON EXIT         TSQRFC
C                                                                       TSQRFC
C       OUTPUT PARAMETERS :                                             TSQRFC
C       ------------------                                              TSQRFC
C                                                                       TSQRFC
C       IERR : RETURN CODE WITH TH FOLLOWING MEANINGS:                  TSQRFC
C              IERR  =  1 : SINGULARITY DETECTED                        TSQRFC
C              IERR  =  0 : OTHERWISE                                   TSQRFC
C       CURPOS :  PIVOT VECTOR                                          TSQRFC
C       ZERO1  :  FIRST ZERO COLUMN OF MATRIX QR IN CASE OF SINGULARITY TSQRFC
C                                                                       TSQRFC
C       SUBPROGRAMS CALLED:                                             TSQRFC
C                                                                       TSQRFC
C       LEVEL 1 BLAS  ...  DAXPY,DDOT,DNRM2,DSCAL,DSWAP,IDAMAX          TSQRFC
C                                                                       TSQRFC
C **********************************************************************TSQRFC
                                                                        TSQRFC
       INTEGER COLPIV,I,J,K,L                                           TSQRFC
       DOUBLE PRECISION COLMAX,SIGMA,TAU,AMAX                           TSQRFC
       DOUBLE PRECISION NU,RNU,ZERO,ONE                                 TSQRFC
       DOUBLE PRECISION DDOT,DNRM2                                      TSQRFC
       INTEGER IDAMAX                                                   TSQRFC
       INTRINSIC ABS,MAX,SIGN,SQRT                                      TSQRFC
       DATA ZERO,ONE/0.0D0,1.0D0/                                       TSQRFC
                                                                        TSQRFC
c zero rows m+1 and m+2 of QR matrix                                    TSQRFC
                                                                        TSQRFC
       DO 10 J = 1,N                                                    TSQRFC
          CURPOS(J) = J                                                 TSQRFC
10    CONTINUE                                                         TSQRFC
                                                                        TSQRFC
       DO 20 J = LB,UB                                                  TSQRFC
          QR(M+1,J) = ZERO                                              TSQRFC
          QR(M+2,J) = ZERO                                              TSQRFC
20    CONTINUE                                                         TSQRFC
                                                                        TSQRFC
       IERR = 0                                                         TSQRFC
       ZERO1 = UB+1                                                     TSQRFC
       K = LB                                                           TSQRFC
                                                                        TSQRFC
c  get L2NORM**2 of columns (LB to UB)                                  TSQRFC
                                                                        TSQRFC
       DO 30 J = K,UB                                                   TSQRFC
          AL2NRM(J) = DNRM2(M-K+1,QR(K,J),1)**2                         TSQRFC
30    CONTINUE                                                         TSQRFC
                                                                        TSQRFC
40    CONTINUE                                                         TSQRFC
       IF((K.LT.M).AND.(K.LE.UB)) THEN                                  TSQRFC
                                                                        TSQRFC
         AMAX = ZERO                                                    TSQRFC
         DO 60 J = K,UB                                                 TSQRFC
            IF(AL2NRM(J).GE.AMAX) THEN                                  TSQRFC
               AMAX = AL2NRM(J)                                         TSQRFC
               COLPIV = J                                               TSQRFC
            ENDIF                                                       TSQRFC
60      CONTINUE                                                       TSQRFC
                                                                        TSQRFC
         IF(AMAX.EQ.ZERO) THEN                                          TSQRFC
            IERR = 1                                                    TSQRFC
            ZERO1 = K                                                   TSQRFC
            RETURN                                                      TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
         IF(K.EQ.LB) THEN                                               TSQRFC
            COLMAX = AMAX                                               TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
         IF(AL2NRM(COLPIV).LE.EPSM*COLMAX) THEN                         TSQRFC
            IERR = 1                                                    TSQRFC
            ZERO1 = K                                                   TSQRFC
            RETURN                                                      TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
         IF(COLPIV .NE. K) THEN                                         TSQRFC
            CALL DSWAP(M+2,QR(1,COLPIV),1,QR(1,K),1)                    TSQRFC
            L = CURPOS(K)                                               TSQRFC
            CURPOS(K) = CURPOS(COLPIV)                                  TSQRFC
            CURPOS(COLPIV) = L                                          TSQRFC
            CALL DSWAP(1,AL2NRM(COLPIV),1,AL2NRM(K),1)                  TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
c find NU = max element of col K on or below diagonal                   TSQRFC
                                                                        TSQRFC
         L = IDAMAX(M-K+1,QR(K,K),1) + K - 1                            TSQRFC
         NU = ABS(QR(L,K))                                              TSQRFC
                                                                        TSQRFC
         IF(NU.EQ.ZERO) THEN                                            TSQRFC
            IERR = 1                                                    TSQRFC
            ZERO1 = K                                                   TSQRFC
            RETURN                                                      TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
c normalize col K on or below diagonal                                  TSQRFC
                                                                        TSQRFC
         RNU = ONE/NU                                                   TSQRFC
         CALL DSCAL(M-K+1,RNU,QR(K,K),1)                                TSQRFC
                                                                        TSQRFC
c code to find SIGMA = SGN(QR(K,K))*l2-norm of col K on or              TSQRFC
c below diagonal                                                        TSQRFC
                                                                        TSQRFC
         SIGMA = DNRM2(M-K+1,QR(K,K),1)                                 TSQRFC
         SIGMA = SIGN(SIGMA,QR(K,K))                                    TSQRFC
                                                                        TSQRFC
c store 1st element of U-vector in QR(K,K)                              TSQRFC
                                                                        TSQRFC
         QR(K,K) = QR(K,K)+SIGMA                                        TSQRFC
                                                                        TSQRFC
c store value of <U,U>/2 in QR(M+1,K)                                   TSQRFC
                                                                        TSQRFC
         QR(M+1,K) = SIGMA*QR(K,K)                                      TSQRFC
         IF(QR(M+1,K).EQ.ZERO) THEN                                     TSQRFC
            IERR = 1                                                    TSQRFC
            ZERO1 = K                                                   TSQRFC
            RETURN                                                      TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
c store R(K,K) in QR(M+2,K)                                             TSQRFC
                                                                        TSQRFC
         QR(M+2,K) = -NU*SIGMA                                          TSQRFC
         IF(QR(M+2,K).EQ.ZERO) THEN                                     TSQRFC
            IERR = 1                                                    TSQRFC
            ZERO1 = K                                                   TSQRFC
            RETURN                                                      TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
c code to get (I-2U*UT/<U,U>)*QR for kth iteration                      TSQRFC
                                                                        TSQRFC
         IF(K.LT.N) THEN                                                TSQRFC
            DO 130 J = K+1,N                                            TSQRFC
                                                                        TSQRFC
c loop to get UT*J-TH col of QR                                         TSQRFC
                                                                        TSQRFC
               TAU = DDOT(M-K+1,QR(K,K),1,QR(K,J),1)                    TSQRFC
               TAU = -TAU/QR(M+1,K)                                     TSQRFC
                                                                        TSQRFC
c loop to get (I-2U*UT/<U,U>)*j-th col of QR                            TSQRFC
                                                                        TSQRFC
               CALL DAXPY(M-K+1,TAU,QR(K,K),1,QR(K,J),1)                TSQRFC
                                                                        TSQRFC
130        CONTINUE                                                    TSQRFC
         ENDIF                                                          TSQRFC
                                                                        TSQRFC
c update l2norm**2 (K+1 to UB)                                          TSQRFC
                                                                        TSQRFC
         DO 140 I = K+1,UB                                              TSQRFC
           AL2NRM(I) = AL2NRM(I)-QR(K,I)**2                             TSQRFC
140     CONTINUE                                                       TSQRFC
                                                                        TSQRFC
         K = K+1                                                        TSQRFC
         GOTO 40                                                        TSQRFC
                                                                        TSQRFC
       ELSE                                                             TSQRFC
                                                                        TSQRFC
         IF(LB.EQ.UB) COLMAX = AL2NRM(LB)                               TSQRFC
                                                                        TSQRFC
       ENDIF                                                            TSQRFC
                                                                        TSQRFC
       IF(M.EQ.UB) QR(M+2,UB) = QR(M,M)                                 TSQRFC
       IF(ABS(QR(M+2,UB)).LE.EPSM*COLMAX) THEN                          TSQRFC
          IERR = 1                                                      TSQRFC
          ZERO1 = UB                                                    TSQRFC
       ENDIF                                                            TSQRFC
                                                                        TSQRFC
       RETURN                                                           TSQRFC
       END                                                              TSQRFC
      SUBROUTINE TSRSID(ITN,METHOD,FQ,D,CURPOS,PIVOT,PBAR,AJA,ANLS,     TSRSID
     +                  SHAT,FLAG,NWTAKE,IERR,MAXM,MAXN,M,N,P,WRK1,     TSRSID
     +                  VN,VNP,VNS,SCRES)                               TSRSID
                                                                        TSRSID
      INTEGER MAXM,MAXN,M,N,P,IERR,FLAG,ITN,METHOD                      TSRSID
      INTEGER CURPOS(N),PIVOT(N),PBAR(N)                                TSRSID
      DOUBLE PRECISION SCRES,D(N),VN(M),VNP(M),VNS(M),AJA(MAXM,N)       TSRSID
      DOUBLE PRECISION WRK1(M),SHAT(MAXN,P),FQ(M)                       TSRSID
      DOUBLE PRECISION ANLS(MAXM,P)                                     TSRSID
      LOGICAL NWTAKE                                                    TSRSID
                                                                        TSRSID
C********************************************************************** TSRSID
C THIS ROUTINE COMPUTES || F + J*D + 0.5*A*D**2 ||**2 IN THE L2         TSRSID
C NORM SENS AT A GIVEN STEP D.                                          TSRSID
C********************************************************************** TSRSID
C                                                                       TSRSID
C       INPUT PARAMETERS                                                TSRSID
C       ----------------                                                TSRSID
C                                                                       TSRSID
C        ITN   : CURRENT ITERATION NUMBER                               TSRSID
C        METHOD: METHOD TO BE USED                                      TSRSID
C        FQ    : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY        TSRSID
C                ORTHOGONAL MATRICES                                    TSRSID
C        D     : STEP AT WHICH TO EVALUATE THE TENSOR MODEL             TSRSID
C        CURPOS: PIVOT VECTOR (USED DURING THE FACTORIZATION OF AJA     TSRSID
C                FROM COLUMN 1 TO N-P)                                  TSRSID
C        PIVOT : PIVOT VECTOR ( USED DURING THE FACTORIZATION OF AJA    TSRSID
C                FROM COLUMN N-P+1 TO N)                                TSRSID
C        PBAR  : PIVOT VECTOR (USED DURING THE FACTORIZATION OF AJA     TSRSID
C                IF IT IS SINGULAR                                      TSRSID
C        AJA   : JACOBIAN MATRIX AT CURRENT ITERATE                     TSRSID
C        ANLS  : TENSOR TERM MATRIX AT CURRENT ITERATE                  TSRSID
C        SHAT  : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS AFTER   TSRSID
C                A QL FACTORIZATION                                     TSRSID
C        FLAG  : RETURN CODE WITH THE FOLLOWING MEANINGS:               TSRSID
C                FLAG = 0 : NO SINGULARITY DETECTED DURING FACTORIZATIONTSRSID
C                           OF THE JACOBIAN FROM COLUMN 1 TO N          TSRSID
C                FLAG = 1 : SINGULARITY DETECTED DURING FACTORIZATION   TSRSID
C                           OF THE JACOBIAN FROM COLUMN 1 TO N-P        TSRSID
C                FLAG = 2 : SINGULARITY DETECTED DURING FACTORIZATION   TSRSID
C                           OF THE JACOBIAN FROM COLUMN N-P+1 TO N      TSRSID
C        NWTAKE: LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS:          TSRSID
C                NWTAKE = .TRUE.  : NEWTON STEP TAKEN                   TSRSID
C                NWTAKE = .FALSE. : TENSOR STEP TAKEN                   TSRSID
C        IERR  : RETURN CODE FROM QRP FACTORIZATION ROUTINE:            TSRSID
C                IERR = 0 : NO SINGULARITY DETECTED                     TSRSID
C                IERR = 1 : SINGULARITY DETECTED                        TSRSID
C        MAXM   : LEADING DIMENSION OF AJA AND ANLS                     TSRSID
C        MAXN   : LEADING DIMENSION OF SHAT                             TSRSID
C        M,N    : DIMENSIONS OF THE PROBLEM                             TSRSID
C        P      : COLUMN DIMENSION OF THE MATRICES SHAT AND ANLS        TSRSID
C        WRK1,VN,VNP,VNS : WORKSPACE VECTORS                            TSRSID
C                                                                       TSRSID
C       OUTPUT PARAMETERS                                               TSRSID
C       -----------------                                               TSRSID
C                                                                       TSRSID
C        SCRES :  || F + J*D + 0.5*A*D**2 ||**2                         TSRSID
C                                                                       TSRSID
C       SUBPROGRAMS CALLED:                                             TSRSID
C                                                                       TSRSID
C       LEVEL 1 BLAS  ...  DLOAD,DNRM2                                  TSRSID
C       LEVEL 2 BLAS  ...  DGEMV                                        TSRSID
C       TENSOLVE      ...  TSJMUV,TSUDQV                                TSRSID
C                                                                       TSRSID
C **********************************************************************TSRSID
                                                                        TSRSID
      INTEGER I,J,LEN                                                   TSRSID
      DOUBLE PRECISION ZERO,HALF,ONE                                    TSRSID
      DOUBLE PRECISION DNRM2                                            TSRSID
      DATA ZERO,HALF,ONE/0.0D0,0.50D0,1.0D0/                            TSRSID
                                                                        TSRSID
      CALL TSJMUV(ITN,METHOD,D,CURPOS,PIVOT,PBAR,AJA,SHAT,FLAG,         TSRSID
     +            IERR,MAXM,MAXN,M,N,P,VN,VNP,VNS,WRK1)                 TSRSID
                                                                        TSRSID
      CALL DLOAD (M,ZERO,WRK1(N+1),1)                                   TSRSID
                                                                        TSRSID
      LEN = M                                                           TSRSID
      IF(IERR .GT. 0) LEN = M + N                                       TSRSID
                                                                        TSRSID
      DO 20 I = 1, LEN                                                  TSRSID
         VN(I) = WRK1(I) + FQ(I)                                        TSRSID
20   CONTINUE                                                          TSRSID
                                                                        TSRSID
      IF( .NOT. NWTAKE) THEN                                            TSRSID
        CALL TSUDQV(SHAT,VNS,MAXN,N,P,VNP)                              TSRSID
        DO 30 J = 1, P                                                  TSRSID
           VNP(J) = VNP(J) ** 2                                         TSRSID
30     CONTINUE                                                        TSRSID
        CALL DGEMV('N',LEN,P,HALF,ANLS,MAXM,VNP,1,ONE,VN,1)             TSRSID
      ENDIF                                                             TSRSID
                                                                        TSRSID
      SCRES = DNRM2(LEN,VN,1)                                           TSRSID
                                                                        TSRSID
      RETURN                                                            TSRSID
      END                                                               TSRSID
       SUBROUTINE TSSCLF(F,DF,M)                                        TSSCLF
                                                                        TSSCLF
       INTEGER M                                                        TSSCLF
       DOUBLE PRECISION F(M),DF(M)                                      TSSCLF
                                                                        TSSCLF
C*******************************************************************    TSSCLF
C THIS ROUTINE SCALES A FUNCTION VALUE F.                               TSSCLF
C*******************************************************************    TSSCLF
C                                                                       TSSCLF
C       INPUT PARAMETERS :                                              TSSCLF
C       ------------------                                              TSSCLF
C                                                                       TSSCLF
C       DF : DIAGONAL SCALING MATRIX FOR F                              TSSCLF
C       M  : DIMENSION OF F                                             TSSCLF
C                                                                       TSSCLF
C       INPUT-OUTPUT PARAMETERS :                                       TSSCLF
C       ------------------                                              TSSCLF
C                                                                       TSSCLF
C       F  : UNSCALED FUNCTION VALUE ON ENTRY AND SCALED FUNCTION       TSSCLF
C            VALUE ON EXIT                                              TSSCLF
C                                                                       TSSCLF
C*********************************************************************  TSSCLF
                                                                        TSSCLF
       INTEGER I                                                        TSSCLF
                                                                        TSSCLF
       DO 10 I = 1,M                                                    TSSCLF
          F(I) = DF(I)*F(I)                                             TSSCLF
10    CONTINUE                                                         TSSCLF
                                                                        TSSCLF
       RETURN                                                           TSSCLF
       END                                                              TSSCLF
       SUBROUTINE TSSCLJ(X,DX,TYPX,F,DF,FHAT,NR,M,N,EPSM,JACFLG,        TSSCLJ
     +                   TSFVEC,TSANJA,AJA)                             TSSCLJ
                                                                        TSSCLJ
       INTEGER NR,M,N,JACFLG                                            TSSCLJ
       DOUBLE PRECISION EPSM                                            TSSCLJ
       DOUBLE PRECISION X(N),DX(N),TYPX(N),F(M),DF(M)                   TSSCLJ
       DOUBLE PRECISION AJA(NR,N),FHAT(M)                               TSSCLJ
       EXTERNAL TSFVEC,TSANJA                                           TSSCLJ
                                                                        TSSCLJ
C********************************************************************** TSSCLJ
C THIS ROUTINE COMPUTES THE JACOBIAN MATRIX AT THE CURRENT ITERATE      TSSCLJ
C X AND SCALES ITS VALUE.                                               TSSCLJ
C********************************************************************** TSSCLJ
C                                                                       TSSCLJ
C       INPUT PARAMETERS :                                              TSSCLJ
C       -----------------                                               TSSCLJ
C                                                                       TSSCLJ
C       X    : SCALED CURRENT ITERATE                                   TSSCLJ
C       DX   : DIAGONAL SCALING MATRIX FOR X                            TSSCLJ
C       F    : SCALED FUNCTION VALUE AT X                               TSSCLJ
C       DF   : DIAGONAL SCALING MATRIX FOR F                            TSSCLJ
C       FHAT : WORKSPACE ARRAY                                          TSSCLJ
C       NR   : LEADING DIMENSION OF AJA                                 TSSCLJ
C       M,N  : DIMENSIONS OF PROBLEM                                    TSSCLJ
C       EPSM : MACHINE PRECISION                                        TSSCLJ
C       JACFLG : JACOBIAN FLAG                                          TSSCLJ
C       TSFVEC : SUBROUTINE TO EVALUATE FUNCTION                        TSSCLJ
C       TSANJA : SUBROUTINE TO EVALUATE ANALYTIC JACOBIAN               TSSCLJ
C                                                                       TSSCLJ
C                                                                       TSSCLJ
C       INPUT-OUTPUT PARAMETERS :                                       TSSCLJ
C       ------------------------                                        TSSCLJ
C                                                                       TSSCLJ
C       AJA  : SCALED JACOBIAN AT CURRENT ITERATE                       TSSCLJ
C                                                                       TSSCLJ
C       SUBPROGRAMS CALLED:                                             TSSCLJ
C                                                                       TSSCLJ
C       TENSOLVE      ...  TSUNSX,TSUNSF,TSFDFJ,TSSCLF,TSSCLX           TSSCLJ
C       USER          ...  TSANJA                                       TSSCLJ
C                                                                       TSSCLJ
C********************************************************************   TSSCLJ
                                                                        TSSCLJ
       INTEGER I,J                                                      TSSCLJ
                                                                        TSSCLJ
c unscale X AND F                                                       TSSCLJ
                                                                        TSSCLJ
       CALL TSUNSX(X,DX,N)                                              TSSCLJ
       CALL TSUNSF(F,DF,M)                                              TSSCLJ
                                                                        TSSCLJ
c compute the finite difference or analytic Jacobian at X               TSSCLJ
                                                                        TSSCLJ
       IF(JACFLG.EQ.0) THEN                                             TSSCLJ
          CALL TSFDFJ(X,F,NR,M,N,EPSM,TSFVEC,FHAT,AJA)                  TSSCLJ
       ELSE                                                             TSSCLJ
          CALL TSANJA(AJA,X,NR,M,N)                                     TSSCLJ
       ENDIF                                                            TSSCLJ
                                                                        TSSCLJ
c scale the Jacobian matrix                                             TSSCLJ
                                                                        TSSCLJ
       DO 20 J = 1,N                                                    TSSCLJ
          DO 10 I = 1,M                                                 TSSCLJ
             AJA(I,J) = AJA(I,J)*DF(I)*TYPX(J)                          TSSCLJ
10       CONTINUE                                                      TSSCLJ
20    CONTINUE                                                         TSSCLJ
                                                                        TSSCLJ
c scale back X AND F                                                    TSSCLJ
                                                                        TSSCLJ
       CALL TSSCLF(F,DF,M)                                              TSSCLJ
       CALL TSSCLX(X,DX,N)                                              TSSCLJ
                                                                        TSSCLJ
       RETURN                                                           TSSCLJ
       END                                                              TSSCLJ
       SUBROUTINE TSSCLX(X,DX,N)                                        TSSCLX
                                                                        TSSCLX
       INTEGER N                                                        TSSCLX
       DOUBLE PRECISION X(N),DX(N)                                      TSSCLX
                                                                        TSSCLX
C********************************************************************** TSSCLX
C THIS ROUTINE SCALES A VECTOR X.                                       TSSCLX
C********************************************************************** TSSCLX
C                                                                       TSSCLX
C       INPUT PARAMETERS :                                              TSSCLX
C       ------------------                                              TSSCLX
C                                                                       TSSCLX
C       DX : DIAGONAL SCALING MATRIX FOR X                              TSSCLX
C       N  : DIMENSION OF X                                             TSSCLX
C                                                                       TSSCLX
C       OUTPUT PARAMETERS :                                             TSSCLX
C       ------------------                                              TSSCLX
C                                                                       TSSCLX
C       X  : SCALED VECTOR X                                            TSSCLX
C                                                                       TSSCLX
C********************************************************************** TSSCLX
                                                                        TSSCLX
       INTEGER I                                                        TSSCLX
                                                                        TSSCLX
       DO 10 I = 1,N                                                    TSSCLX
          X(I) = DX(I)*X(I)                                             TSSCLX
10    CONTINUE                                                         TSSCLX
                                                                        TSSCLX
       RETURN                                                           TSSCLX
       END                                                              TSSCLX
       SUBROUTINE TSSLCT(RESIDT,RESIDN,ITRMCD,FC,M,N,DN,DT,G,DF,NWTAKE) TSSLCT
                                                                        TSSLCT
       INTEGER M,N,ITRMCD                                               TSSLCT
       DOUBLE PRECISION RESIDT,RESIDN                                   TSSLCT
       DOUBLE PRECISION FC(M),DF(N),DN(N),DT(N),G(N)                    TSSLCT
       LOGICAL NWTAKE                                                   TSSLCT
                                                                        TSSLCT
C*********************************************************************  TSSLCT
C THIS ROUTINE DECIDES WHICH DIRECTION TO CHOOSE: THE TENSOR OR THE     TSSLCT
C STANDARD DIRECTION. THE STANDARD DIRECTION IS CHOSEN WHENEVER         TSSLCT
C THE TENSOR DIRECTION IS NOT DESCENT OR THE TENSOR DIRECTION IS TO A   TSSLCT
C MINIMIZER OF THE TENSOR MODEL AND DOESN'T PROVIDE ENOUGH DECREASE     TSSLCT
C IN THE TENSOR MODEL, OR THE QUADRATIC SYSTEM OF Q EQUATIONS IN P      TSSLCT
C UNKNOWNS CANNOT BE SOLVED BY UNCMIN WITHIN 150 ITERATIONS.            TSSLCT
C*********************************************************************  TSSLCT
C                                                                       TSSLCT
C       INPUT PARAMETERS :                                              TSSLCT
C       ------------------                                              TSSLCT
C                                                                       TSSLCT
C       RESIDT : TENSOR RESIDUAL                                        TSSLCT
C       RESIDN : NEWTON RESIDUAL                                        TSSLCT
C       ITRMCD : UNCMIN TERMINATION CODE                                TSSLCT
C       FC : FUNCTION VALUE AT XC                                       TSSLCT
C       M,N: DIMENSIONS OF PROBLEM                                      TSSLCT
C       DN : STANDARD STEP                                              TSSLCT
C       DT : TENSOR STEP                                                TSSLCT
C       G  : GRADIENT VALUE AT XC                                       TSSLCT
C                                                                       TSSLCT
C                                                                       TSSLCT
C       OUTPUT PARAMETERS :                                             TSSLCT
C       -----------------                                               TSSLCT
C                                                                       TSSLCT
C       DF : EITHER THE STANDARD OR TENSOR STEP ON EXIT                 TSSLCT
C       NWTAKE : BOOLEAN VALUE WITH THE FOLLOWING MEANINGS:             TSSLCT
C               =.TRUE.  : STANDARD STEP IS TAKEN                       TSSLCT
C               =.FALSE. : TENSOR STEP IS TAKEN                         TSSLCT
C                                                                       TSSLCT
C       SUBPROGRAMS CALLED:                                             TSSLCT
C                                                                       TSSLCT
C       LEVEL 1 BLAS  ....  DCOPY,DDOT,DNRM2                            TSSLCT
C                                                                       TSSLCT
C*********************************************************************  TSSLCT
                                                                        TSSLCT
       DOUBLE PRECISION ANRMFC,DTNORM,GNORM                             TSSLCT
       DOUBLE PRECISION TEMP,TEMP1,BETA,GAMA                            TSSLCT
       DOUBLE PRECISION TENTH,ONETT,HALF                                TSSLCT
       DOUBLE PRECISION DNRM2,DDOT                                      TSSLCT
       DATA ONETT,TENTH,HALF/1.0D-4,1.0D-1,0.50D0/                      TSSLCT
                                                                        TSSLCT
       NWTAKE = .FALSE.                                                 TSSLCT
       ANRMFC = DNRM2(M,FC,1)                                           TSSLCT
       DTNORM = DNRM2(N,DT,1)                                           TSSLCT
       GNORM = DNRM2(N,G,1)                                             TSSLCT
       TEMP = DDOT(N,DT,1,G,1)                                          TSSLCT
                                                                        TSSLCT
       GAMA = HALF                                                      TSSLCT
       IF(M.GT.N) THEN                                                  TSSLCT
          BETA = TENTH                                                  TSSLCT
       ELSE                                                             TSSLCT
          BETA = ONETT                                                  TSSLCT
       ENDIF                                                            TSSLCT
                                                                        TSSLCT
       TEMP1 = -BETA*DTNORM*GNORM                                       TSSLCT
                                                                        TSSLCT
       IF(RESIDT.GE.GAMA*(ANRMFC+RESIDN).OR.(TEMP.GT.TEMP1).OR.         TSSLCT
     +    ITRMCD.EQ.4) THEN                                             TSSLCT
          CALL DCOPY(N,DN,1,DF,1)                                       TSSLCT
          NWTAKE = .TRUE.                                               TSSLCT
       ELSE                                                             TSSLCT
          CALL DCOPY(N,DT,1,DF,1)                                       TSSLCT
       ENDIF                                                            TSSLCT
                                                                        TSSLCT
       RETURN                                                           TSSLCT
       END                                                              TSSLCT
       SUBROUTINE TSSMIN(ANLS,FQ,ADT,AG,CONST1,CONST2,DLT,NR,M,N,       TSSMIN
     +                   P,NWTAKE,IERR,EPSM,VN,VNP,VNS,SOL)             TSSMIN
                                                                        TSSMIN
       DOUBLE PRECISION DLT,EPSM                                        TSSMIN
       INTEGER NR,M,N,P,IERR                                            TSSMIN
       DOUBLE PRECISION ADT(N),AG(N),VN(M),VNP(M)                       TSSMIN
       DOUBLE PRECISION VNS(M),ANLS(NR,P),FQ(M)                         TSSMIN
       DOUBLE PRECISION CONST1(P),CONST2(P)                             TSSMIN
       LOGICAL NWTAKE                                                   TSSMIN
                                                                        TSSMIN
C***********************************************************************TSSMIN
C THIS ROUTINE MINIMIZES THE TENSOR MODEL OVER THE SUBSPACE SPANNED BY  TSSMIN
C THE TENSOR STEP AND THE STEEPEST DECENT DIRECTION. IF THE NEWTON STEP TSSMIN
C WERE CHOSEN, IT WILL MINIMIZE THE NEWTON MODEL OVER THE SUBSPACE      TSSMIN
C SPANNED BY THE NEWTON STEP AND THE STEEPEST DESCENT DIRECTION.        TSSMIN
C***********************************************************************TSSMIN
C                                                                       TSSMIN
C       INPUT PARAMETERS :                                              TSSMIN
C       -----------------                                               TSSMIN
C                                                                       TSSMIN
C       ANLS : TENSOR TERM MATRIX AT CURRENT ITERATE                    TSSMIN
C       FQ   : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY          TSSMIN
C              ORTHOGONAL MATRICES                                      TSSMIN
C       ADT  : JACOBIAN MATRIX TIMES DT (SEE SUBROUTINE TS2DTR)         TSSMIN
C        AG  : JACOBIAN MATRIX TIMES GBAR (SEE SUBROUTINE TS2DTR)       TSSMIN
C      CONST1: SHAT-TRANS * DT  (SEE SUBROUTINE TS2DTR)                 TSSMIN
C      CONST2: SHAT-TRANS * GBAR (SEE SUBROUTINE TS2DTR)                TSSMIN
C      ALPHA : POINT AT WHICH DERIVATIVE IS EVALUATED                   TSSMIN
C        DLT : CURRENT TRUST RADIUS                                     TSSMIN
C        NR  : LEADING DIMENSION OF ANLS                                TSSMIN
C         M,N: DIMENSIONS OF THE PROBLEM                                TSSMIN
C           P: COLUMN DIMENSION OF MATRIX ANLS                          TSSMIN
C       NWTAKE : LOGICAL VARIABLE WITH THE FOLLOWING MEANINGS :         TSSMIN
C                NWTAKE = .TRUE.  : STANDARD STEP TAKEN                 TSSMIN
C                NWTAKE = .FALSE. : TENSOR STEP TAKEN                   TSSMIN
C       IERR   : RETURN CODE FROM QRP FACTORIZATION ROUTINE             TSSMIN
C                IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED         TSSMIN
C                IERR = 1 : SINGULARITY OF JACOBIAN DETECTED            TSSMIN
C       EPSM   : MACHINE PRECISION                                      TSSMIN
C       VN,VNP,VNS : WORKING VECTORS                                    TSSMIN
C                                                                       TSSMIN
C                                                                       TSSMIN
C       OUTPUT PARAMETERS :                                             TSSMIN
C       -----------------                                               TSSMIN
C                                                                       TSSMIN
C       SOL   : GLOBAL MINIMIZER OF THE ONE VARIABLE FUNCTION IN ALPHA  TSSMIN
C               ||F + J*(ALPHA*DT + BETA*GBAR) + 0.5*A*(ALPHA*DT +      TSSMIN
C               BETA*GBAR)**2||**2 WHERE BETA = SQRT(DLT**2 - ALPHA**2) TSSMIN
C                                                                       TSSMIN
C       SUBPROGRAMS CALLED:                                             TSSMIN
C                                                                       TSSMIN
C       TENSOLVE      ...  TSFAFA,TSMFDA,TSLMIN                         TSSMIN
C                                                                       TSSMIN
C***********************************************************************TSSMIN
                                                                        TSSMIN
        INTEGER INT                                                     TSSMIN
        DOUBLE PRECISION SOL,TOL,DL,S,SP,C,TSFAFA,A,TSMFDA              TSSMIN
        DOUBLE PRECISION D,S1,B,Q,BC,OPTIM,AC,GLOPT,QINCR               TSSMIN
        DOUBLE PRECISION ZERO,OHUND,TENTH,TWO,THREE,TEN                 TSSMIN
        LOGICAL FIRST                                                   TSSMIN
        DATA ZERO,OHUND,TENTH,TWO,THREE,TEN/0.0D0,1.0D-2,1.0D-1,2.0D0,  TSSMIN
     +  3.0D0,10.0D0/                                                   TSSMIN
                                                                        TSSMIN
        FIRST = .TRUE.                                                  TSSMIN
        TOL = EPSM**(TWO/THREE)                                         TSSMIN
        INT = 40                                                        TSSMIN
        DL = TOL                                                        TSSMIN
        IF(DLT.LT.TOL) THEN                                             TSSMIN
           DL = TOL*TENTH                                               TSSMIN
        ELSEIF(DLT.GT.TOL*TEN) THEN                                     TSSMIN
           DL = TOL*TEN                                                 TSSMIN
        ENDIF                                                           TSSMIN
        IF(DLT.LE.OHUND) THEN                                           TSSMIN
           INT = 10                                                     TSSMIN
        ENDIF                                                           TSSMIN
                                                                        TSSMIN
c find global minimizer of FALPHA                                       TSSMIN
                                                                        TSSMIN
        QINCR = TWO*(DLT-DL)/INT                                        TSSMIN
        DO 10 S = -DLT+DL,DLT*(INT-2)/INT,QINCR                         TSSMIN
           SP = S                                                       TSSMIN
           S1 = S+QINCR                                                 TSSMIN
                                                                        TSSMIN
c evaluate FALPHA(SP) and the derivative of FALPHA at SP                TSSMIN
                                                                        TSSMIN
           IF(FIRST) THEN                                               TSSMIN
              C = TSFAFA(ANLS,FQ,ADT,AG,CONST1,CONST2,SP,DLT,           TSSMIN
     +                   NR,M,N,P,NWTAKE,IERR,VN)                       TSSMIN
              A = TSMFDA(ANLS,ADT,AG,CONST1,CONST2,SP,DLT,              TSSMIN
     +                   NR,M,N,P,NWTAKE,IERR,VN,VNP)                   TSSMIN
           ELSE                                                         TSSMIN
              C = D                                                     TSSMIN
              A = B                                                     TSSMIN
           ENDIF                                                        TSSMIN
                                                                        TSSMIN
c evaluate FALPHA(S1) and the derivative of FALPHA at S1                TSSMIN
                                                                        TSSMIN
           D = TSFAFA(ANLS,FQ,ADT,AG,CONST1,CONST2,S1,DLT,              TSSMIN
     +                NR,M,N,P,NWTAKE,IERR,VN)                          TSSMIN
           B = TSMFDA(ANLS,ADT,AG,CONST1,CONST2,S1,DLT,                 TSSMIN
     +                NR,M,N,P,NWTAKE,IERR,VN,VNP)                      TSSMIN
                                                                        TSSMIN
c minimize FALPHA in the subinterval [SP,S1]                            TSSMIN
                                                                        TSSMIN
           IF((A.LE.ZERO).AND.(B.GE.ZERO)) THEN                         TSSMIN
              IF(C.GT.D) THEN                                           TSSMIN
                 Q = D                                                  TSSMIN
                 BC = B                                                 TSSMIN
                 CALL TSLMIN(S1,SP,BC,Q,ANLS,FQ,ADT,AG,CONST1,CONST2,   TSSMIN
     +                       DLT,NR,M,N,P,NWTAKE,IERR,TOL,VN,VNP,       TSSMIN
     +                       VNS,OPTIM)                                 TSSMIN
              ELSE                                                      TSSMIN
                 Q = C                                                  TSSMIN
                 AC = A                                                 TSSMIN
                 CALL TSLMIN(SP,S1,AC,Q,ANLS,FQ,ADT,AG,CONST1,CONST2,   TSSMIN
     +                       DLT,NR,M,N,P,NWTAKE,IERR,TOL,VN,VNP,       TSSMIN
     +                       VNS,OPTIM)                                 TSSMIN
              ENDIF                                                     TSSMIN
           ELSEIF((A.LE.ZERO).AND.(B.LE.ZERO)) THEN                     TSSMIN
              IF(C.LE.D) THEN                                           TSSMIN
                 Q = C                                                  TSSMIN
                 AC = A                                                 TSSMIN
                 CALL TSLMIN(SP,S1,AC,Q,ANLS,FQ,ADT,AG,CONST1,CONST2,   TSSMIN
     +                       DLT,NR,M,N,P,NWTAKE,IERR,TOL,VN,VNP,       TSSMIN
     +                       VNS,OPTIM)                                 TSSMIN
              ELSE                                                      TSSMIN
                 OPTIM = S1                                             TSSMIN
                 Q = D                                                  TSSMIN
              ENDIF                                                     TSSMIN
           ELSEIF((A.GE.ZERO).AND.(B.GE.ZERO)) THEN                     TSSMIN
              IF(C.GE.D) THEN                                           TSSMIN
                 Q = D                                                  TSSMIN
                 BC = B                                                 TSSMIN
                 CALL TSLMIN(S1,SP,BC,Q,ANLS,FQ,ADT,AG,CONST1,CONST2,   TSSMIN
     +                       DLT,NR,M,N,P,NWTAKE,IERR,TOL,VN,VNP,       TSSMIN
     +                       VNS,OPTIM)                                 TSSMIN
              ELSE                                                      TSSMIN
                 OPTIM = SP                                             TSSMIN
                 Q = C                                                  TSSMIN
              ENDIF                                                     TSSMIN
           ENDIF                                                        TSSMIN
                                                                        TSSMIN
c update the global minimizer of FALPHA so far                          TSSMIN
                                                                        TSSMIN
           IF(FIRST) THEN                                               TSSMIN
             IF(A.GT.ZERO .AND. B.LT.ZERO) THEN                         TSSMIN
                GLOPT = C                                               TSSMIN
                SOL = SP                                                TSSMIN
                IF(C.GT.D) THEN                                         TSSMIN
                   GLOPT = D                                            TSSMIN
                   SOL = S1                                             TSSMIN
                ENDIF                                                   TSSMIN
             ELSE                                                       TSSMIN
                GLOPT = Q                                               TSSMIN
                SOL = OPTIM                                             TSSMIN
             ENDIF                                                      TSSMIN
             FIRST = .FALSE.                                            TSSMIN
           ELSEIF(GLOPT.GE.Q) THEN                                      TSSMIN
             GLOPT = Q                                                  TSSMIN
             SOL = OPTIM                                                TSSMIN
           ENDIF                                                        TSSMIN
10     CONTINUE                                                        TSSMIN
                                                                        TSSMIN
        RETURN                                                          TSSMIN
        END                                                             TSSMIN
       SUBROUTINE TSSMRD(VECT,RESNEW,X,MU,IERR,M,N)                     TSSMRD
                                                                        TSSMRD
       INTEGER M,N,IERR                                                 TSSMRD
       DOUBLE PRECISION RESNEW,MU                                       TSSMRD
       DOUBLE PRECISION VECT(M),X(N)                                    TSSMRD
                                                                        TSSMRD
C********************************************************************** TSSMRD
C THIS ROUTINE COMPUTES THE RESIDUAL OF THE STANDARD MODEL.             TSSMRD
C********************************************************************** TSSMRD
C                                                                       TSSMRD
C       INPUT PARAMETERS :                                              TSSMRD
C       -----------------                                               TSSMRD
C                                                                       TSSMRD
C       VECT : RIGHT HAND SIDE VECTOR OF THE NEWTON/GAUSS-NEWTON        TSSMRD
C              EQUATIONS AFTER BEING MULTIPLIED BY ORTHOGONAL MATRICES  TSSMRD
C              (SEE SUBROUTINE TSCPSS)                                  TSSMRD
C       X    : STANDARD STEP COMPUTED BY THE SUBROUTINE TSCPSS          TSSMRD
C       MU   : A SMALL PERTURBATION USED IN COMPUTING THE STANDARD      TSSMRD
C              STEP WHEN THE JACOBIAN IS SINGULAR                       TSSMRD
C       IERR : RETURN CODE WITH THE FOLLOWING MEANINGS :                TSSMRD
C              IERR = 0 : NO SINGULARITY OF JACOBIAN DETECTED           TSSMRD
C              IERR = 1 : OTHERWISE                                     TSSMRD
C       M,N  : DIMENSION OF PROBLEM                                     TSSMRD
C                                                                       TSSMRD
C       OUTPUT PARAMETERS :                                             TSSMRD
C       ------------------                                              TSSMRD
C                                                                       TSSMRD
C       RESNEW : RESIDUAL OF THE STANDARD MODEL                         TSSMRD
C                                                                       TSSMRD
C       SUBPROGRAMS CALLED:                                             TSSMRD
C                                                                       TSSMRD
C       LEVEL 1 BLAS  ...  DNRM2                                        TSSMRD
C                                                                       TSSMRD
C********************************************************************** TSSMRD
                                                                        TSSMRD
       DOUBLE PRECISION TEMP,PROD                                       TSSMRD
       DOUBLE PRECISION DNRM2                                           TSSMRD
       INTRINSIC SQRT                                                   TSSMRD
                                                                        TSSMRD
       IF(IERR .EQ .0) THEN                                             TSSMRD
          RESNEW = DNRM2(M-N,VECT(N+1),1)                               TSSMRD
       ELSE                                                             TSSMRD
          TEMP = DNRM2(M,VECT(N+1),1)**2                                TSSMRD
          PROD = MU * DNRM2(N,X,1)**2                                   TSSMRD
          RESNEW = SQRT(TEMP-PROD)                                      TSSMRD
       ENDIF                                                            TSSMRD
                                                                        TSSMRD
       RETURN                                                           TSSMRD
       END                                                              TSSMRD
       SUBROUTINE TSSQP1(AJA,ANLS,S,F,MAXM,MAXN,M,N,Q,ROOT,RESTNS)      TSSQP1
                                                                        TSSQP1
       INTEGER MAXM,MAXN,M,N,Q                                          TSSQP1
       DOUBLE PRECISION ROOT,RESTNS                                     TSSQP1
       DOUBLE PRECISION AJA(MAXM,N),S(MAXN,*),ANLS(MAXM,*),F(M)         TSSQP1
                                                                        TSSQP1
C********************************************************************** TSSQP1
C THIS ROUTINE SOLVES THE LOWER M-N+Q QUADRATIC EQUATIONS IN P UNKNOWNS TSSQP1
C OF THE TENSOR MODEL WHEN Q > 1 AND P = 1.                             TSSQP1
C********************************************************************** TSSQP1
C                                                                       TSSQP1
C       INPUT PARAMETERS :                                              TSSQP1
C       -----------------                                               TSSQP1
C                                                                       TSSQP1
C       AJA  : JACOBIAN MATRIX AT CURRENT ITERATE                       TSSQP1
C       ANLS : TENSOR TERM MATRIX AT CURRENT ITERATE                    TSSQP1
C       S    : MATRIX OF PAST LINEARLY INDEPENDENT DIRECTIONS           TSSQP1
C       F    : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY AN       TSSQP1
C              ORTHOGONAL MATRIX                                        TSSQP1
C       MAXM : LEADING DIMENSION OF AJA AND ANLS                        TSSQP1
C       MAXN : LEADING DIMENSION OF S                                   TSSQP1
C       M,N  : ROW AND COLUMN DIMENSIONS OF AJA                         TSSQP1
C       Q    : NUMERICAL RANK OF JACOBIAN :                             TSSQP1
C              Q > P : JACOBIAN IS SINGULAR                             TSSQP1
C              Q = P : OTHERWISE                                        TSSQP1
C                                                                       TSSQP1
C                                                                       TSSQP1
C       OUTPUT PARAMETERS :                                             TSSQP1
C       -----------------                                               TSSQP1
C                                                                       TSSQP1
C       ROOT   : SOLUTION TO THE SYSTEM                                 TSSQP1
C       RESTNS : TENSOR RESIDUAL                                        TSSQP1
C                                                                       TSSQP1
C       SUBPROGRAMS CALLED:                                             TSSQP1
C                                                                       TSSQP1
C       LEVEL 1 BLAS  ...  DDOT,DNRM2                                   TSSQP1
C                                                                       TSSQP1
C **********************************************************************TSSQP1
                                                                        TSSQP1
       INTEGER I                                                        TSSQP1
       DOUBLE PRECISION TEMP,A,B,C,D,RES1,RES2,RES3,RES,S1,S2,S3        TSSQP1
       DOUBLE PRECISION T,T0,T1,T2,T3,PI,A1,A2,A3,THETA                 TSSQP1
       DOUBLE PRECISION ZERO,QUART,HALF,ONE,TWO,THREE,FOUR,NINE         TSSQP1
       DOUBLE PRECISION TSEVEN,FFOUR,ONETRD                             TSSQP1
       DOUBLE PRECISION DDOT,DNRM2                                      TSSQP1
       INTRINSIC ABS,SQRT                                               TSSQP1
       PARAMETER (PI = 3.141592653589793D0)                             TSSQP1
       DATA ZERO,QUART,HALF,ONE,TWO,THREE,FOUR,NINE,TSEVEN,FFOUR/0.0D0, TSSQP1
     + 0.250D0,0.50D0,1.0D0,2.0D0,3.0D0,4.0D0,9.0D0,27.0D0,54.0D0/      TSSQP1
                                                                        TSSQP1
c compute the coefficients of a third degree polynomial                 TSSQP1
                                                                        TSSQP1
       ONETRD = ONE/THREE                                               TSSQP1
       A = ZERO                                                         TSSQP1
       B = ZERO                                                         TSSQP1
       C = ZERO                                                         TSSQP1
                                                                        TSSQP1
       TEMP = DNRM2(M-N+Q,F(N-Q+1),1)**2                                TSSQP1
       D = TWO*DDOT(M-N+Q,AJA(N-Q+1,N),1,F(N-Q+1),1)                    TSSQP1
       T0 = S(N+2,1)**2                                                 TSSQP1
       T1 = T0**2                                                       TSSQP1
       DO 10 I = N-Q+1,M                                                TSSQP1
          T2 = AJA(I,N)                                                 TSSQP1
          T3 = ANLS(I,1) * T0                                           TSSQP1
          C = C + TWO * (T2**2 + F(I) * T3)                             TSSQP1
          B = B + THREE * T2 * T3                                       TSSQP1
          A = A + ANLS(I,1)**2 * T1                                     TSSQP1
10    CONTINUE                                                         TSSQP1
                                                                        TSSQP1
c compute the roots of the third degree polynomial                      TSSQP1
                                                                        TSSQP1
       IF(A.EQ.ZERO) THEN                                               TSSQP1
         IF(B.NE.ZERO) THEN                                             TSSQP1
            T0 = SQRT(C**2-FOUR*B*D)                                    TSSQP1
            T1 = TWO*B                                                  TSSQP1
            S1 = (-C+T0)/T1                                             TSSQP1
            S2 = (-C-T0)/T1                                             TSSQP1
            RES1 = ABS(TEMP+D*S1+HALF*C*(S1**2)+ONETRD*B*(S1**3))       TSSQP1
            RES2 = ABS(TEMP+D*S2+HALF*C*(S2**2)+ONETRD*B*(S2**3))       TSSQP1
            IF(RES1 .GT. RES2) THEN                                     TSSQP1
               ROOT =  S2                                               TSSQP1
               RES  =  RES2                                             TSSQP1
            ELSE                                                        TSSQP1
               ROOT =  S1                                               TSSQP1
               RES  =  RES1                                             TSSQP1
            ENDIF                                                       TSSQP1
            RESTNS  =  SQRT(RES)                                        TSSQP1
            RETURN                                                      TSSQP1
         ELSEIF(C.NE.ZERO) THEN                                         TSSQP1
            ROOT = -D/C                                                 TSSQP1
            RES = ABS(TEMP+D*ROOT+HALF*C*(ROOT**2))                     TSSQP1
            RESTNS = SQRT(RES)                                          TSSQP1
            RETURN                                                      TSSQP1
         ELSE                                                           TSSQP1
            ROOT = ZERO                                                 TSSQP1
            RESTNS = SQRT(TEMP)                                         TSSQP1
            RETURN                                                      TSSQP1
         ENDIF                                                          TSSQP1
       ELSEIF(D.EQ.ZERO) THEN                                           TSSQP1
         ROOT = ZERO                                                    TSSQP1
         RESTNS = SQRT(TEMP)                                            TSSQP1
         RETURN                                                         TSSQP1
       ENDIF                                                            TSSQP1
       T3 = D                                                           TSSQP1
                                                                        TSSQP1
       A1 = B/A                                                         TSSQP1
       A2 = C/A                                                         TSSQP1
       A3 = D/A                                                         TSSQP1
       T0 = (THREE*A2-A1**2)/NINE                                       TSSQP1
       T1 = (NINE*A1*A2-TSEVEN*A3-TWO*A1**3)/FFOUR                      TSSQP1
       D = T0**3 + T1**2                                                TSSQP1
                                                                        TSSQP1
       IF(D.GT.0) THEN                                                  TSSQP1
          T2 = T1+SQRT(D)                                               TSSQP1
          T = T1-SQRT(D)                                                TSSQP1
          IF(T.LT.0) THEN                                               TSSQP1
             T = -(-T)**ONETRD                                          TSSQP1
          ELSE                                                          TSSQP1
             T = T**ONETRD                                              TSSQP1
          ENDIF                                                         TSSQP1
          IF(T2.LT.0)THEN                                               TSSQP1
             T2 = -(-T2)**ONETRD                                        TSSQP1
          ELSE                                                          TSSQP1
             T2 = T2**ONETRD                                            TSSQP1
          ENDIF                                                         TSSQP1
          S1 = T2+T-A1/THREE                                            TSSQP1
          S3 = S1                                                       TSSQP1
          S2 = S1                                                       TSSQP1
       ELSE                                                             TSSQP1
          T = T1/SQRT(-T0**3)                                           TSSQP1
          THETA = ACOS(T)                                               TSSQP1
          THETA = THETA/THREE                                           TSSQP1
          T = TWO*SQRT(-T0)                                             TSSQP1
          S1 = T*COS(THETA)-A1/THREE                                    TSSQP1
          S2 = T*COS(THETA+PI*TWO/THREE)-A1/THREE                       TSSQP1
          S3 = T*COS(THETA+PI*FOUR/THREE)-A1/THREE                      TSSQP1
       ENDIF                                                            TSSQP1
                                                                        TSSQP1
c compute the tensor residual for each root                             TSSQP1
                                                                        TSSQP1
       RES1 = ABS(TEMP+T3*S1+HALF*C*(S1**2)+ONETRD*B*(S1**3)+           TSSQP1
     +        QUART*A*(S1**4))                                          TSSQP1
       RES2 = ABS(TEMP+T3*S2+HALF*C*(S2**2)+ONETRD*B*(S2**3)+           TSSQP1
     +        QUART*A*(S2**4))                                          TSSQP1
       RES3 = ABS(TEMP+T3*S3+HALF*C*(S3**2)+ONETRD*B*(S3**3)+           TSSQP1
     +        QUART*A*(S3**4))                                          TSSQP1
                                                                        TSSQP1
c select the root that produces the smallest tensor residual            TSSQP1
                                                                        TSSQP1
       RES  =  RES1                                                     TSSQP1
       ROOT  =  S1                                                      TSSQP1
       IF(RES .GT. RES2) THEN                                           TSSQP1
           RES  =  RES2                                                 TSSQP1
           ROOT  =  S2                                                  TSSQP1
        ENDIF                                                           TSSQP1
        IF(RES .GT. RES3) THEN                                          TSSQP1
           RES  =  RES3                                                 TSSQP1
           ROOT  =  S3                                                  TSSQP1
        ENDIF                                                           TSSQP1
        RESTNS  =  SQRT(RES)                                            TSSQP1
                                                                        TSSQP1
       RETURN                                                           TSSQP1
       END                                                              TSSQP1
       SUBROUTINE TSSSTP(AJA,FN,M,N,NR,EPSM,IGLOBL,AL2NRM,Y,W,          TSSSTP
     +                   DN,FQ,PIVOT,PBAR,IERR)                         TSSSTP
                                                                        TSSSTP
       INTEGER NR,M,N,IERR,IGLOBL                                       TSSSTP
       INTEGER PIVOT(N),PBAR(N)                                         TSSSTP
       DOUBLE PRECISION EPSM,AJA(NR,N),AL2NRM(M),FN(M)                  TSSSTP
       DOUBLE PRECISION DN(N),Y(N),W(M),FQ(M)                           TSSSTP
                                                                        TSSSTP
C********************************************************************** TSSSTP
C THIS ROUTINE FINDS THE STANDARD STEP WHEN THE ITERATION NUMBER IS     TSSSTP
C EQUAL TO 1 OR THE INPUT PARAMETER "METHOD" IS SET TO 0.               TSSSTP
C********************************************************************** TSSSTP
C                                                                       TSSSTP
C       INPUT PARAMETERS :                                              TSSSTP
C       -----------------                                               TSSSTP
C                                                                       TSSSTP
C       AJA   : JACOBIAN MATRIX AT CURRENT ITERATE                      TSSSTP
C       FN    : FUNCTION VALUE AT CURRENT ITERATE                       TSSSTP
C       M,N   : DIMENSIONS OF PROBLEM                                   TSSSTP
C       NR    : LEADING DIMENSION OF AJA                                TSSSTP
C       EPSM  : MACHINE EPSILON                                         TSSSTP
C       IGLOBL: GLOBAL STRATEGY USED :                                  TSSSTP
C                = 0 : LINE SEARCH USED                                 TSSSTP
C                = 1 : 2-DIMENSIONAL TRUST REGION USED                  TSSSTP
C       AL2NRM,Y,W : WORKING VECTORS                                    TSSSTP
C                                                                       TSSSTP
C                                                                       TSSSTP
C       OUTPUT PARAMETERS :                                             TSSSTP
C       ------------------                                              TSSSTP
C                                                                       TSSSTP
C       DN : STANDARD STEP                                              TSSSTP
C       FQ : FUNCTION VALUE AT CURRENT ITERATE MULTIPLIED BY            TSSSTP
C              ORTHOGONAL MATRICES (THIS IS USED IN THE CASE WHERE      TSSSTP
C              THE GLOBAL STRATEGY IS THE 2-DIMENSIONAL                 TSSSTP
C              TRUST REGION)                                            TSSSTP
C       PIVOT,PBAR : PIVOT VECTORS                                      TSSSTP
C       IERR : RETURNED CODE WITH THE FOLLOWING MEANING :               TSSSTP
C              IERR  =  1 : SINGULARITY OF JACOBIAN DETECTED (ZERO1     TSSSTP
C                           IS USED TO KEEP TRACK OF THE FIRST COLUMN   TSSSTP
C                           WHERE SINGULARITY IS DETECTED)              TSSSTP
C              IERR  =  0 : OTHERWISE                                   TSSSTP
C                                                                       TSSSTP
C       SUBPROGRAMS CALLED:                                             TSSSTP
C                                                                       TSSSTP
C       LEVEL 1 BLAS  ...  DCOPY,DLOAD,DSCAL                            TSSSTP
C       TENSOLVE      ...  TSQRFC,TSQMUV,TSBSLV,TSPRMV,TSCPMU           TSSSTP
C                                                                       TSSSTP
C********************************************************************** TSSSTP
                                                                        TSSSTP
       INTEGER ZERO1,ZEROTM,I,J                                         TSSSTP
       DOUBLE PRECISION MU,ZERO,ONE                                     TSSSTP
       DATA ZERO,ONE/0.0D0,1.0D0/                                       TSSSTP
                                                                        TSSSTP
c perform a QR factorization of AJA                                     TSSSTP
                                                                        TSSSTP
       CALL TSQRFC(AJA,NR,N,M,1,N,IERR,EPSM,AL2NRM,PIVOT,ZERO1)         TSSSTP
                                                                        TSSSTP
       CALL DSCAL(M,-ONE,FN,1)                                          TSSSTP
                                                                        TSSSTP
       IF(IERR.EQ.0) THEN                                               TSSSTP
          IF(M.EQ.N) THEN                                               TSSSTP
             ZEROTM = ZERO1-1                                           TSSSTP
          ELSE                                                          TSSSTP
             ZEROTM = ZERO1                                             TSSSTP
          ENDIF                                                         TSSSTP
                                                                        TSSSTP
c multiply (-FN) by the orthogonal matrix resulting from the QR         TSSSTP
c decomposition of AJA                                                  TSSSTP
                                                                        TSSSTP
          CALL TSQMUV(AJA,FN,W,NR,M,1,ZEROTM,.FALSE.)                   TSSSTP
                                                                        TSSSTP
c solve AJA*DN  =  W                                                    TSSSTP
                                                                        TSSSTP
          CALL TSBSLV(AJA,NR,M,N,W,Y)                                   TSSSTP
          CALL TSPRMV(DN,Y,PIVOT,N,0)                                   TSSSTP
                                                                        TSSSTP
          IF(IGLOBL.EQ.1) THEN                                          TSSSTP
             IERR = 0                                                   TSSSTP
             CALL DCOPY(M,W,1,FQ,1)                                     TSSSTP
             CALL DSCAL(M,-ONE,FQ,1)                                    TSSSTP
          ENDIF                                                         TSSSTP
          RETURN                                                        TSSSTP
       ELSE                                                             TSSSTP
                                                                        TSSSTP
c AJA is singular                                                       TSSSTP
                                                                        TSSSTP
          CALL TSQMUV(AJA,FN,W,NR,M,1,ZERO1,.FALSE.)                    TSSSTP
                                                                        TSSSTP
c solve ( AJA-trans AJA + MU I ) DN = -AJA-trans FN                     TSSSTP
                                                                        TSSSTP
c put the diagonal elements stored in row m+2 of AJA into their         TSSSTP
c propre positions and zero out the unwanted portions of AJA            TSSSTP
                                                                        TSSSTP
          DO 10 J = 1, ZERO1-1                                          TSSSTP
             AJA(J,J) = AJA(M+2,J)                                      TSSSTP
             CALL DLOAD (M+N-J,ZERO,AJA(J+1,J),1)                       TSSSTP
10       CONTINUE                                                      TSSSTP
                                                                        TSSSTP
          DO 20 J = ZERO1, N                                            TSSSTP
             CALL DLOAD (M+N-ZERO1+1,ZERO,AJA(ZERO1,J),1)               TSSSTP
20       CONTINUE                                                      TSSSTP
                                                                        TSSSTP
c compute a perturbation MU                                             TSSSTP
                                                                        TSSSTP
          CALL TSCPMU(AJA,NR,N,EPSM,MU)                                 TSSSTP
                                                                        TSSSTP
c form the augmented Jacobian matrix by adding an nxn diag(mu) in       TSSSTP
c the bottom of AJA                                                     TSSSTP
                                                                        TSSSTP
          DO 70 I = M+1,M+N                                             TSSSTP
             AJA(I,I-M) = MU                                            TSSSTP
70       CONTINUE                                                      TSSSTP
                                                                        TSSSTP
c factorize the transformed matrix AJA from 1 to n and compute          TSSSTP
c the standard step DN                                                  TSSSTP
                                                                        TSSSTP
          CALL TSQRFC(AJA,NR,N,M+N,1,N,IERR,EPSM,AL2NRM,PBAR,ZERO1)     TSSSTP
          CALL TSQMUV(AJA,W,FQ,NR,M+N,1,N+1,.FALSE.)                    TSSSTP
          CALL TSBSLV(AJA,NR,M+N,N,FQ,DN)                               TSSSTP
          CALL TSPRMV(Y,DN,PBAR,N,0)                                    TSSSTP
          CALL TSPRMV(DN,Y,PIVOT,N,0)                                   TSSSTP
       ENDIF                                                            TSSSTP
                                                                        TSSSTP
       IF(IGLOBL.EQ.1) THEN                                             TSSSTP
          IERR = 1                                                      TSSSTP
          CALL DSCAL(M+N,-ONE,FQ,1)                                     TSSSTP
       ENDIF                                                            TSSSTP
                                                                        TSSSTP
       END                                                              TSSSTP
        SUBROUTINE TSSTMX(S,X,NR,N,P,WRK1,WRK2)                         TSSTMX
        INTEGER NR,N,P                                                  TSSTMX
        DOUBLE PRECISION X(P),S(NR,P),WRK1(P),WRK2(P)                   TSSTMX
                                                                        TSSTMX
C*********************************************************************  TSSTMX
C THIS ROUTINE COMPUTES SHAT-TRANS * X, WHERE SHAT IS AN UPSIDE DOWN    TSSTMX
C TRIANGULAR MATRIX RESULTING FROM A QL FACTORIZATION OF A MATRIX       TSSTMX
C A AND X IS A VECTOR.                                                  TSSTMX
C*********************************************************************  TSSTMX
C                                                                       TSSTMX
C       INPUT PARAMETERS :                                              TSSTMX
C       -----------------                                               TSSTMX
C                                                                       TSSTMX
C       SHAT  : UPSIDE DOWN TRIANGULAR MATRIX RESULTING FROM A QL       TSSTMX
C               FACTORIZATION                                           TSSTMX
C       X     : VECTOR TO BE MULTIPLIED BY SHAT                         TSSTMX
C       NR    : LEADING DIMENSION OF SHAT                               TSSTMX
C       N     : ROW DIMENSION OF THE MATRIX A                           TSSTMX
C       P     : COLUMN DIMENSION OF SHAT                                TSSTMX
C       WRK   : WORKSPACE                                               TSSTMX
C                                                                       TSSTMX
C                                                                       TSSTMX
C       OUTPUT PARAMETERS :                                             TSSTMX
C       -----------------                                               TSSTMX
C                                                                       TSSTMX
C       WRK2  :  SHAT-TRANS * X                                         TSSTMX
C                                                                       TSSTMX
C       SUBPROGRAMS CALLED:                                             TSSTMX
C                                                                       TSSTMX
C       LEVEL 1 BLAS  ...  DCOPY,DDOT,DLOAD                             TSSTMX
C                                                                       TSSTMX
C*********************************************************************  TSSTMX
                                                                        TSSTMX
        INTEGER COL                                                     TSSTMX
        DOUBLE PRECISION ZERO                                           TSSTMX
        DOUBLE PRECISION DDOT                                           TSSTMX
        DATA ZERO/0.0D0/                                                TSSTMX
                                                                        TSSTMX
        CALL DLOAD(P,ZERO,WRK1,1)                                       TSSTMX
                                                                        TSSTMX
        WRK2(1) = S(N+2,1) * X(P)                                       TSSTMX
        IF(P .GT. 1) THEN                                               TSSTMX
           WRK1(P) = S(N,2)                                             TSSTMX
           WRK1(P-1) = S(N+2,2)                                         TSSTMX
           WRK2(2) = DDOT(P,WRK1,1,X,1)                                 TSSTMX
           DO 10 COL = 3, P                                             TSSTMX
              CALL DCOPY(COL-1,S(N-COL+2,COL),1,WRK1(P-COL+2),1)        TSSTMX
              WRK1(P-COL+1) = S(N+2,COL)                                TSSTMX
              WRK2(COL) = DDOT(P,WRK1,1,X,1)                            TSSTMX
10        CONTINUE                                                     TSSTMX
        ENDIF                                                           TSSTMX
                                                                        TSSTMX
        RETURN                                                          TSSTMX
        END                                                             TSSTMX
      SUBROUTINE TSTRUD(M,N,X,F,G,SC,NWTAKE,STEPMX,STEPTL,DLT,MXTAKE,   TSTRUD
     +                  DXN,DFN,TSFVEC,SCRES,IRETCD,XPLSP,FPLSP,FPREV,  TSTRUD
     +                  XPLS,FP,FPLS)                                   TSTRUD
                                                                        TSTRUD
      INTEGER M,N,IRETCD                                                TSTRUD
      DOUBLE PRECISION F,STEPMX,STEPTL,DLT,SCRES,FPLSP,FPLS             TSTRUD
      DOUBLE PRECISION X(N),XPLS(N),G(N)                                TSTRUD
      DOUBLE PRECISION SC(N),XPLSP(N),FPREV(M),FP(M)                    TSTRUD
      DOUBLE PRECISION DXN(N),DFN(M)                                    TSTRUD
      LOGICAL NWTAKE,MXTAKE                                             TSTRUD
      EXTERNAL TSFVEC                                                   TSTRUD
                                                                        TSTRUD
C***********************************************************************TSTRUD
C THIS ROUTINE DECIDES WHETHER TO ACCEPT XPLS=X+SC AS THE NEXT ITERATE  TSTRUD
C AND UPDATES THE TRUST REGION DLT.                                     TSTRUD
C***********************************************************************TSTRUD
C                                                                       TSTRUD
C                                                                       TSTRUD
C                                                                       TSTRUD
C PARAMETERS                                                            TSTRUD
C ----------                                                            TSTRUD
C M,N          --> DIMENSIONS OF PROBLEM                                TSTRUD
C X(N)         --> OLD ITERATE X[K-1]                                   TSTRUD
C F            --> 0.50D0 * || FC ||**2                                 TSTRUD
C G(N)         --> GRADIENT AT OLD ITERATE, G(X), OR APPROXIMATE        TSTRUD
C SC(N)        --> CURRENT STEP                                         TSTRUD
C NWTAKE       --> BOOLEAN, =.TRUE. IF INPUT STEP TAKEN                 TSTRUD
C STEPMX       --> MAXIMUM ALLOWABLE STEP SIZE                          TSTRUD
C STEPTL       --> RELATIVE STEP SIZE AT WHICH SUCCESSIVE ITERATES      TSTRUD
C                  CONSIDERED CLOSE ENOUGH TO TERMINATE ALGORITHM       TSTRUD
C DLT         <--> TRUST REGION RADIUS                                  TSTRUD
C MXTAKE      <--  BOOLEAN FLAG INDICATING STEP OF MAXIMUM LENGTH USED  TSTRUD
C DXN         --->DIAGONAL SCALING MATRIX FOR X                         TSTRUD
C DFN         --->DIAGONAL SCALING MATRIX FOR F                         TSTRUD
C TSFVEC      --->SUBROUTINE TO EVALUATE FUNCTION                       TSTRUD
C                                                                       TSTRUD
C IRETCD      <--> RETURN CODE                                          TSTRUD
C                    =0 XPLS ACCEPTED AS NEXT ITERATE;                  TSTRUD
C                       DLT TRUST REGION FOR NEXT ITERATION.            TSTRUD
C                    =1 XPLS UNSATISFACTORY BUT ACCEPTED AS NEXT ITERATETSTRUD
C                       BECAUSE XPLS-X .LT. SMALLEST ALLOWABLE          TSTRUD
C                       STEP LENGTH.                                    TSTRUD
C                    =2 F(XPLS) TOO LARGE.  CONTINUE CURRENT ITERATION  TSTRUD
C                       WITH NEW REDUCED DLT.                           TSTRUD
C                    =3 F(XPLS) SUFFICIENTLY SMALL, BUT QUADRATIC MODEL TSTRUD
C                       PREDICTS F(XPLS) SUFFICIENTLY WELL TO CONTINUE  TSTRUD
C                       CURRENT ITERATION WITH NEW DOUBLED DLT.         TSTRUD
C XPLSP(N)    <--> WORKSPACE [VALUE NEEDS TO BE RETAINED BETWEEN        TSTRUD
C                  SUCCESSIVE CALLS OF K-TH GLOBAL STEP]                TSTRUD
C FPLSP       <--> [RETAIN VALUE BETWEEN SUCCESSIVE CALLS]              TSTRUD
C FPREV       ---> WORKING VECTOR                                       TSTRUD
C XPLS(N)     <--  NEW ITERATE X[K]                                     TSTRUD
C FP          <--  FUNCTION VALUE AT NEXT ITERATE                       TSTRUD
C FPLS        <--  FUNCTION VALUE AT NEW ITERATE, F(XPLS)               TSTRUD
C                                                                       TSTRUD
C       SUBPROGRAMS CALLED:                                             TSTRUD
C                                                                       TSTRUD
C       LEVEL 1 BLAS  ...  DCOPY,DDOT,DNRM2                             TSTRUD
C       TENSOLVE      ...  TSFSCL                                       TSTRUD  
C                                                                       TSTRUD
C********************************************************************** TSTRUD
                                                                        TSTRUD
      INTEGER I                                                         TSTRUD
      DOUBLE PRECISION STEPLN,DLTFP,SLOPE,DLTF,SLP,PQ,RLN,DLTMP         TSTRUD
      DOUBLE PRECISION DNRM2,DDOT                                       TSTRUD
      INTRINSIC ABS,MAX                                                 TSTRUD
      DOUBLE PRECISION ZERO,TENTH,HALF,ZNN,ONE,TWO                      TSTRUD
      DATA ZERO,TENTH,HALF,ZNN,ONE,TWO/0.0D0,0.10D0,0.50D0,             TSTRUD
     + 0.99D0,1.0D0,2.0D0/                                              TSTRUD
                                                                        TSTRUD
      MXTAKE = .FALSE.                                                  TSTRUD
      DO 90 I = 1,N                                                     TSTRUD
        XPLS(I) = X(I)+SC(I)                                            TSTRUD
  90  CONTINUE                                                          TSTRUD
      STEPLN = DNRM2(N,SC,1)                                            TSTRUD
      CALL TSFSCL(XPLS,DXN,DFN,M,N,TSFVEC,FP)                           TSTRUD
      FPLS = HALF*DNRM2(M,FP,1)**2                                      TSTRUD
      DLTF = FPLS-F                                                     TSTRUD
      SLOPE = DDOT(N,G,1,SC,1)                                          TSTRUD
      SLP = HALF*SCRES**2-F                                             TSTRUD
                                                                        TSTRUD
c next statement added for case of compilers which do not optimize      TSTRUD
c evaluation of next "IF" statement (in which case fplsp could be       TSTRUD
c undefined)                                                            TSTRUD
c                                                                       TSTRUD
      IF(IRETCD.EQ.4) FPLSP=0.0D0                                       TSTRUD
C$      WRITE(*,961) IRETCD,FPLS,FPLSP,DLTF,SLP                         TSTRUD
      IF(IRETCD.NE.3 .OR. (FPLS.LT.FPLSP .AND. DLTF.LE. 1.D-4*SLP))     TSTRUD
     +     GO TO 130                                                    TSTRUD
C     IF(IRETCD.EQ.3 .AND. (FPLS.GE.FPLSP .OR. DLTF.GT. 1.D-4*SLP))     TSTRUD
C     THEN                                                              TSTRUD
C                                                                       TSTRUD
C       reset XPLS to XPLSP and terminate global step                   TSTRUD
C                                                                       TSTRUD
        IRETCD = 0                                                      TSTRUD
        CALL DCOPY(N,XPLSP,1,XPLS,1)                                    TSTRUD
        FPLS = FPLSP                                                    TSTRUD
        DLT = HALF*DLT                                                  TSTRUD
        CALL DCOPY(M,FPREV,1,FP,1)                                      TSTRUD
C$        WRITE(*,951)                                                  TSTRUD
        GO TO 230                                                       TSTRUD
C     ELSE                                                              TSTRUD
C                                                                       TSTRUD
C       FPLS too large                                                  TSTRUD
C                                                                       TSTRUD
  130   IF(DLTF.LE. 1.D-4*SLP) GO TO 170                                TSTRUD
C       IF(DLTF.GT. 1.D-4*SLP)                                          TSTRUD
C       THEN                                                            TSTRUD
C$          WRITE(*,952)                                                TSTRUD
          PQ = ONE                                                      TSTRUD
          RLN = ZERO                                                    TSTRUD
          DO 140 I = 1,N                                                TSTRUD
            RLN = MAX(RLN,ABS(SC(I))/MAX(ABS(XPLS(I)),ONE/PQ))          TSTRUD
  140     CONTINUE                                                      TSTRUD
C$          WRITE(*,962) RLN                                            TSTRUD
          IF(RLN.GE.STEPTL) GO TO 150                                   TSTRUD
C         IF(RLN.LT.STEPTL)                                             TSTRUD
C         THEN                                                          TSTRUD
C                                                                       TSTRUD
C           cannot find satisfactory XPLS sufficiently distinct from X  TSTRUD
C                                                                       TSTRUD
            IRETCD = 1                                                  TSTRUD
C$            WRITE(*,954)                                              TSTRUD
            GO TO 230                                                   TSTRUD
C         ELSE                                                          TSTRUD
C                                                                       TSTRUD
C           reduce trust region and continue global step                TSTRUD
C                                                                       TSTRUD
  150       IRETCD = 2                                                  TSTRUD
            DLTMP = -SLOPE*STEPLN/(TWO*(DLTF-SLOPE))                    TSTRUD
C$            WRITE(*,963) DLTMP                                        TSTRUD
            IF(DLTMP.GE. TENTH*DLT) GO TO 155                           TSTRUD
C           IF(DLTMP.LT. TENTH*DLT)                                     TSTRUD
C           THEN                                                        TSTRUD
              DLT = TENTH*DLT                                           TSTRUD
              GO TO 160                                                 TSTRUD
C           ELSE                                                        TSTRUD
  155         IF(DLTMP.GT.HALF*DLT) THEN                                TSTRUD
                  DLT = HALF*DLT                                        TSTRUD
              ELSE                                                      TSTRUD
                  DLT = DLTMP                                           TSTRUD
              ENDIF                                                     TSTRUD
C           ENDIF                                                       TSTRUD
  160       CONTINUE                                                    TSTRUD
C$            WRITE(*,955)                                              TSTRUD
            GO TO 230                                                   TSTRUD
C         ENDIF                                                         TSTRUD
C       ELSE                                                            TSTRUD
C                                                                       TSTRUD
C         FPLS sufficiently small                                       TSTRUD
C                                                                       TSTRUD
  170     CONTINUE                                                      TSTRUD
C$          WRITE(*,958)                                                TSTRUD
          DLTFP = HALF*SCRES**2-F                                       TSTRUD
C$           WRITE(*,964) DLTFP,NWTAKE                                  TSTRUD
          IF(IRETCD.EQ.2 .OR. ((ABS(DLTFP-DLTF).GT. TENTH*ABS(DLTF))    TSTRUD
     +         .AND. (DLTFP.GT.SLOPE)).OR.NWTAKE                        TSTRUD
     +         .OR. (DLT.GT. ZNN*STEPMX)) GO TO 210                     TSTRUD
C         IF(IRETCD.NE.2 .AND. (ABS(DLTFP-DLTF) .LE. .1*ABS(DLTF))      TSTRUD
C    +         .AND. (.NOT.NWTAKE) .AND. (DLT.LE. .99*STEPMX))          TSTRUD
C         THEN                                                          TSTRUD
C                                                                       TSTRUD
C           double trust region and continue global step                TSTRUD
C                                                                       TSTRUD
            IRETCD = 3                                                  TSTRUD
            CALL DCOPY(N,XPLS,1,XPLSP,1)                                TSTRUD
            FPLSP = FPLS                                                TSTRUD
            DLT = MIN(TWO*DLT,STEPMX)                                   TSTRUD
            CALL DCOPY(M,FP,1,FPREV,1)                                  TSTRUD
C$          WRITE(*,959)                                                TSTRUD
            GO TO 230                                                   TSTRUD
C         ELSE                                                          TSTRUD
C                                                                       TSTRUD
C           accept XPLS as next iterate.  Choose new trust region.      TSTRUD
C                                                                       TSTRUD
  210       CONTINUE                                                    TSTRUD
C$            WRITE(*,960)                                              TSTRUD
            IRETCD = 0                                                  TSTRUD
            IF(DLT.GT. ZNN*STEPMX) MXTAKE = .TRUE.                      TSTRUD
            IF(DLTF.LT. TENTH*DLTFP) GO TO 220                          TSTRUD
C           IF(DLTF.GE. TENTH*DLTFP)                                    TSTRUD
C           THEN                                                        TSTRUD
C                                                                       TSTRUD
C             Decrease trust region for next iteration                  TSTRUD
C                                                                       TSTRUD
              DLT = HALF*DLT                                            TSTRUD
              GO TO 230                                                 TSTRUD
C           ELSE                                                        TSTRUD
C             Check whether to increase trust region for next iteration TSTRUD
C                                                                       TSTRUD
  220         IF(DLTF.LE. .75D0*DLTFP) DLT = MIN(TWO*DLT,STEPMX)        TSTRUD
C           ENDIF                                                       TSTRUD
C         ENDIF                                                         TSTRUD
C       ENDIF                                                           TSTRUD
C     ENDIF                                                             TSTRUD
  230 CONTINUE                                                          TSTRUD
C$      WRITE(*,953)                                                    TSTRUD
C$      WRITE(*,956) IRETCD,MXTAKE,DLT,FPLS                             TSTRUD
C$      WRITE(*,957)                                                    TSTRUD
C$      WRITE(*,965) (XPLS(I),I = 1,N)                                  TSTRUD
      RETURN                                                            TSTRUD
C                                                                       TSTRUD
  951 FORMAT(' TSTRUD    RESET XPLS TO XPLSP. TERMINATION GLOBAL STEP') TSTRUD
  952 FORMAT(' TSTRUD    FPLS TOO LARGE')                               TSTRUD
  953 FORMAT(' TSTRUD    VALUES AFTER CALL TO TREGUP')                  TSTRUD
  954 FORMAT(' TSTRUD    CANNOT FIND SATISFACTORY XPLS DISTINCT FROM',  TSTRUD
     +       ' X.  TERMINATE GLOBAL STEP')                              TSTRUD
  955 FORMAT(' TSTRUD    REDUCE TRUST REGION. CONTINUE GLOBAL STEP')    TSTRUD
  956 FORMAT(' TSTRUD       IRETCD=',I3/                                TSTRUD
     +       ' TSTRUD       MXTAKE=',L1/                                TSTRUD
     +       ' TSTRUD       DLT   =',E20.13/                            TSTRUD
     +       ' TSTRUD       FPLS  =',E20.13)                            TSTRUD
  957 FORMAT(' TSTRUD       NEW ITERATE (XPLS)')                        TSTRUD
  958 FORMAT(' TSTRUD    FPLS SUFFICIENTLY SMALL')                      TSTRUD
  959 FORMAT(' TSTRUD    DOUBLE TRUST REGION.  CONTINUE GLOBAL STEP')   TSTRUD
  960 FORMAT(' TSTRUD    ACCEPT XPLS AS NEW ITERATE.  CHOOSE NEW',      TSTRUD
     +       ' TRUST REGION.  TERMINATE GLOBAL STEP')                   TSTRUD
  961 FORMAT(' TSTRUD    IRETCD=',I5/                                   TSTRUD
     +       ' TSTRUD    FPLS  =',E20.13/                               TSTRUD
     +       ' TSTRUD    FPLSP =',E20.13/                               TSTRUD
     +       ' TSTRUD    DLTF  =',E20.13/                               TSTRUD
     +       ' TSTRUD    SLP   =',E20.13)                               TSTRUD
  962 FORMAT(' TSTRUD    RLN   =',E20.13)                               TSTRUD
  963 FORMAT(' TSTRUD    DLTMP =',E20.13)                               TSTRUD
  964 FORMAT(' TSTRUD    DLTFP =',E20.13/                               TSTRUD
     +       ' TSTRUD    NWTAKE=',L1)                                   TSTRUD
  965 FORMAT(' TSTRUD       ',5(E20.13,3X))                             TSTRUD
      END                                                               TSTRUD
      SUBROUTINE TSUDQV(SHAT,WRK1,NR,N,P,CONST1)                        TSUDQV
                                                                        TSUDQV
      INTEGER NR,N,P                                                    TSUDQV
      DOUBLE PRECISION CONST1(P),SHAT(NR,P),WRK1(N)                     TSUDQV
                                                                        TSUDQV
C********************************************************************** TSUDQV
C THIS ROUTINE COMPUTES SHAT-TRANS * WRK1, WHERE SHAT IS AN UPSIDE      TSUDQV
C DOWN TRIANGULAR MATRIX RESULTING FROM A QL FACTORIZATION OF A         TSUDQV
C MATRIX A AND WRK1 IS A VECTOR OF LENGTH N.                            TSUDQV
C********************************************************************** TSUDQV
C                                                                       TSUDQV
C  INPUT PARAMETERS                                                     TSUDQV
C  ----------------                                                     TSUDQV
C                                                                       TSUDQV
C      SHAT : UPSIDE DOWN TRIANGULAR MATRIX RESULTING FROM A QL         TSUDQV
C             FACTORIZATION                                             TSUDQV
C      WRK1 : VECTOR TO BE MULTIPLIED BY SHAT                           TSUDQV
C      NR   : LEADING DIMENSION OF SHAT                                 TSUDQV
C      N    : DIMENSION OF MATRIX A                                     TSUDQV
C      P    : COLUMN DIMENSION OF SHAT                                  TSUDQV
C                                                                       TSUDQV
C  OUTPUT PARAMETERS                                                    TSUDQV
C  -----------------                                                    TSUDQV
C                                                                       TSUDQV
C      CONST1 : SHAT * WRK1                                             TSUDQV
C                                                                       TSUDQV
C      SUBPROGRAMS CALLED:                                              TSUDQV
C                                                                       TSUDQV
C      LEVEL 1 BLAS  ...  DDOT                                          TSUDQV
C                                                                       TSUDQV
C **********************************************************************TSUDQV
                                                                        TSUDQV
      INTEGER J                                                         TSUDQV
      DOUBLE PRECISION DDOT                                             TSUDQV
                                                                        TSUDQV
      CONST1(1) = SHAT(N+2,1) * WRK1(N)                                 TSUDQV
      IF(P .GT. 1) THEN                                                 TSUDQV
         CONST1(2) = SHAT(N,2) * WRK1(N) + SHAT(N+2,2) * WRK1(N-1)      TSUDQV
      ENDIF                                                             TSUDQV
      DO 20 J = 3,P                                                     TSUDQV
         CONST1(J) = DDOT(J-1,SHAT(N-J+2,J),1,WRK1(N-J+2),1)            TSUDQV
     +               + SHAT(N+2,J) * WRK1(N-J+1)                        TSUDQV
20   CONTINUE                                                          TSUDQV
                                                                        TSUDQV
      RETURN                                                            TSUDQV
      END                                                               TSUDQV
       SUBROUTINE TSUNSF(F,DF,M)                                        TSUNSF
                                                                        TSUNSF
       INTEGER M                                                        TSUNSF
       DOUBLE PRECISION F(M),DF(M)                                      TSUNSF
                                                                        TSUNSF
C*********************************************************************  TSUNSF
C THIS ROUTINE UNSCALES A FUNCTION VALUE F.                             TSUNSF
C*********************************************************************  TSUNSF
C                                                                       TSUNSF
C       INPUT PARAMETERS :                                              TSUNSF
C       ------------------                                              TSUNSF
C                                                                       TSUNSF
C       DF : DIAGONAL SCALING MATRIX FOR F                              TSUNSF
C       M  : DIMENSION OF F                                             TSUNSF
C                                                                       TSUNSF
C       INPUT-OUTPUT PARAMETERS :                                       TSUNSF
C       ------------------                                              TSUNSF
C                                                                       TSUNSF
C       F  : SCALED FUNCTION VALUE ON ENTRY AND UNSCALED FUNCTION       TSUNSF
C            VALUE ON EXIT                                              TSUNSF
C                                                                       TSUNSF
C********************************************************************** TSUNSF
                                                                        TSUNSF
       INTEGER I                                                        TSUNSF
                                                                        TSUNSF
       DO 10 I = 1,M                                                    TSUNSF
          F(I) = F(I)/DF(I)                                             TSUNSF
10    CONTINUE                                                         TSUNSF
                                                                        TSUNSF
       RETURN                                                           TSUNSF
       END                                                              TSUNSF
       SUBROUTINE TSUNSX(X,DX,N)                                        TSUNSX
                                                                        TSUNSX
       INTEGER N                                                        TSUNSX
       DOUBLE PRECISION  X(N),DX(N)                                     TSUNSX
                                                                        TSUNSX
C********************************************************************** TSUNSX
C THIS ROUTINE UNSCALES A VECTOR X.                                     TSUNSX
C********************************************************************** TSUNSX
C                                                                       TSUNSX
C       INPUT PARAMETERS :                                              TSUNSX
C       ------------------                                              TSUNSX
C                                                                       TSUNSX
C       DX : DIAGONAL SCALING MATRIX FOR X                              TSUNSX
C       N  : DIMENSION OF X                                             TSUNSX
C                                                                       TSUNSX
C       OUTPUT PARAMETERS :                                             TSUNSX
C       ------------------                                              TSUNSX
C                                                                       TSUNSX
C       X  : UNSCALED VECTOR X                                          TSUNSX
C                                                                       TSUNSX
C********************************************************************** TSUNSX
                                                                        TSUNSX
       INTEGER I                                                        TSUNSX
                                                                        TSUNSX
       DO 10 I = 1,N                                                    TSUNSX
          X(I) = X(I)/DX(I)                                             TSUNSX
10    CONTINUE                                                         TSUNSX
                                                                        TSUNSX
       RETURN                                                           TSUNSX
       END                                                              TSUNSX
      SUBROUTINE TSUPSF(FC,XC,XP,SQRN,ITN,MAXM,MAXN,M,N,STEP,S,FV)      TSUPSF
                                                                        TSUPSF
      INTEGER MAXM,MAXN,M,N,ITN,SQRN                                    TSUPSF
      DOUBLE PRECISION S(MAXN,*),FV(MAXM,*)                             TSUPSF
      DOUBLE PRECISION FC(M),XC(N),XP(N),STEP(N)                        TSUPSF
                                                                        TSUPSF
C********************************************************************** TSUPSF
C THIS ROUTINE UPDATE THE MATRIX S OF PAST DIRECTIONS AND THE MATRIX    TSUPSF
C FV OF FUNCTION VALUES.                                                TSUPSF
C********************************************************************** TSUPSF
C                                                                       TSUPSF
C       INPUT PARAMETERS :                                              TSUPSF
C       ----------------                                                TSUPSF
C                                                                       TSUPSF
C       FC  : FUNCTION VALUE AT CURRENT ITERATE                         TSUPSF
C       XC  : CURRENT ITERATE X[K-1]                                    TSUPSF
C       XP  : NEW ITERATE X[K]                                          TSUPSF
C       SQRN: MAXIMUM COLUMN DIMENSION OF S AND FV                      TSUPSF
C       ITN : ITERATION NUMBER                                          TSUPSF
C       MAXM: LEADING DIMENSION OF FV                                   TSUPSF
C       MAXN: LEADING DIMENSION OF S                                    TSUPSF
C       M   : ROW DIMENSION OF MATRIX FV                                TSUPSF
C       N   : ROW DIMENSION OF MATRIX S                                 TSUPSF
C       STEP: WORKING VECTOR                                            TSUPSF
C                                                                       TSUPSF
C                                                                       TSUPSF
C       INPUT-OUTPUT PARAMETERS :                                       TSUPSF
C        -----------------------                                        TSUPSF
C                                                                       TSUPSF
C       S   :  MATRIX OF PAST DIRECTIONS (XK - XC)                      TSUPSF
C       FV  :  MATRIX OF PAST FUNCTIONS VALUES                          TSUPSF
C                                                                       TSUPSF
C       SUBPROGRAMS CALLED:                                             TSUPSF
C                                                                       TSUPSF
C       LEVEL 1 BLAS  ...  DCOPY                                        TSUPSF
C                                                                       TSUPSF
C********************************************************************** TSUPSF
                                                                        TSUPSF
       INTEGER I,J,L                                                    TSUPSF
                                                                        TSUPSF
c update FV                                                             TSUPSF
                                                                        TSUPSF
       IF(SQRN.LT.ITN) THEN                                             TSUPSF
          L = SQRN                                                      TSUPSF
       ELSE                                                             TSUPSF
          L = ITN                                                       TSUPSF
       ENDIF                                                            TSUPSF
       DO 10 J = L-1,1,-1                                               TSUPSF
          CALL DCOPY(M,FV(1,J),1,FV(1,J+1),1)                           TSUPSF
10    CONTINUE                                                         TSUPSF
                                                                        TSUPSF
       CALL DCOPY(M,FC,1,FV(1,1),1)                                     TSUPSF
                                                                        TSUPSF
c update S                                                              TSUPSF
                                                                        TSUPSF
       DO 30 I = 1,N                                                    TSUPSF
          STEP(I) = XC(I)-XP(I)                                         TSUPSF
30    CONTINUE                                                         TSUPSF
                                                                        TSUPSF
       DO 50 J = L-1,1,-1                                               TSUPSF
          DO 40 I = 1,N                                                 TSUPSF
             S(I,J+1) = S(I,J) + STEP(I)                                TSUPSF
40       CONTINUE                                                      TSUPSF
50    CONTINUE                                                         TSUPSF
       CALL DCOPY(N,STEP,1,S(1,1),1)                                    TSUPSF
                                                                        TSUPSF
       RETURN                                                           TSUPSF
       END                                                              TSUPSF
       SUBROUTINE TSUTMD(AJA,D,NR,M,N,V)                                TSUTMD
                                                                        TSUTMD
       INTEGER NR,M,N                                                   TSUTMD
       DOUBLE PRECISION AJA(NR,N),D(N),V(N)                             TSUTMD
                                                                        TSUTMD
C********************************************************************** TSUTMD
C THIS ROUTINE MULTIPLIES AN UPPER TRIANGULAR MATRIX (AS STORED IN      TSUTMD
C STEWART) BY A VECTOR D.                                               TSUTMD
C********************************************************************** TSUTMD
C                                                                       TSUTMD
C       INPUT PARAMETERS :                                              TSUTMD
C       -----------------                                               TSUTMD
C                                                                       TSUTMD
C       AJA  : JACOBIAN AT CURRENT ITERATE                              TSUTMD
C       D    : VECTOR TO BE MULTIPLIED BY AJA                           TSUTMD
C       NR   : LEADING DIMENSION OF AJA                                 TSUTMD
C       M,N  : DIMENSIONS OF PROBLEM                                    TSUTMD
C                                                                       TSUTMD
C       OUTPUT PARAMETERS :                                             TSUTMD
C       -----------------                                               TSUTMD
C                                                                       TSUTMD
C       V  : VECTOR AJA * D ON EXIT                                     TSUTMD
C                                                                       TSUTMD
C       SUBPROGRAMS CALLED:                                             TSUTMD
C                                                                       TSUTMD
C       LEVEL 1 BLAS  ...  DAXPY                                        TSUTMD
C                                                                       TSUTMD
C********************************************************************** TSUTMD
                                                                        TSUTMD
       INTEGER J                                                        TSUTMD
                                                                        TSUTMD
       V(1) = AJA(M+2,1) * D(1) + AJA(1,2) * D(2)                       TSUTMD
       V(2) = AJA(M+2,2) * D(2)                                         TSUTMD
       DO 20 J = 3, N                                                   TSUTMD
          V(J) = AJA(M+2,J) * D(J)                                      TSUTMD
          CALL DAXPY(J-1,D(J),AJA(1,J),1,V,1)                           TSUTMD
20    CONTINUE                                                         TSUTMD
                                                                        TSUTMD
       RETURN                                                           TSUTMD
       END                                                              TSUTMD
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表