dsrc2c.c

来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· C语言 代码 · 共 1,951 行 · 第 1/5 页

C
1,951
字号
/**
 * \file itpack.cxx
 * \brief Routines from ITPACK numerical library.
 *
 * In this file routines from ITPACK are defined in the itk::fem::itpack
 * namespace. This is done by calling the original ITPACK code
 * (file dsrc2c.c) which was converted from Fortran using f2c.
 * See "ftp://netlib.bell-labs.com/netlib/f2c" for more info.
 * 
 * Besides that we also define some functions that the ITPACK uses and should
 * normally be defined in f2c.lib. But since we don't have that library
 * we redefine these function here, so that ITPACK code is happy.
 *
 * ITPACK was converted with the following command line options:
 *    f2c -C++P dsrc2c.f
 *
 * This produced two files:
 *   - dsrc2c.c was converted to itpack_dsrc2c.c by removing the
 *     #include "f2c" and all "#ifdef __cplusplus extern C  #endif" parts.
 *   - dsrc2c.P was used to obtain function prototypes which are stored
 *     in itpack.h file.
 *
 * To use ITPACK in your ITK code, simply include the header "itpack.h",
 * and link to the corresponding library.
 *
 * \note All ITPACK functions reside in namespace itpack.
 */




/* Turn off warnings in f2c generated code */
#if defined(_MSC_VER)
#if defined(__ICL)
#pragma warning(disable: 239 264 1011 )
#else
#pragma warning(disable: 4101 4244 4554 4756 4723)
#endif
#endif





#include "f2c.h"




integer i_sign(integer *a, integer *b)
{
integer x;
x = (*a >= 0 ? *a : - *a);
return( *b >= 0 ? x : -x);
}


/*
 * The following couple of functions have something to
 * do with I/O. Since we don't want ITPACK to output
 * anything, the functions do nothing.
 */
integer do_fio(integer * a, char * b, ftnlen c )
{
  (void)a; (void)b; (void)c;
  return 0;
}

integer e_wsfe(void)
{
  return 0;
}

integer s_wsfe(cilist * list)
{
  (void)list;
  return 0;
}

doublereal etime_(float *tarray)
{
  tarray[0]=0.0;
  tarray[1]=0.0;
  return 0.0;
}





/*****   END OF ITK ADDITIONS ****/



/* dsrc2c.f -- translated by f2c (version 20020621).
   You must link the resulting object file with the libraries:
  -lf2c -lm   (in that order)
*/

#ifdef __cplusplus
extern "C" {
#endif
#include "f2c.h"

/* Common Block Declarations */

static struct {
    integer in, is, isym, itmax, level, nout;
} itcom1_;

#define itcom1_1 itcom1_

static struct {
    logical adapt, betadt, caseii, halt, partad;
} itcom2_;

#define itcom2_1 itcom2_

static struct {
    doublereal bdelnm, betab, cme, delnnm, delsnm, ff, gamma, omega, qa, qt, 
      rho, rrr, sige, sme, specr, spr, drelpr, stptst, udnm, zeta;
} itcom3_;

#define itcom3_1 itcom3_

/* Table of constant values */

static integer c__1 = 1;
static integer c__0 = 0;
static doublereal c_b21 = 0.;
static integer c__2 = 2;
static integer c__3 = 3;
static integer c__4 = 4;
static doublereal c_b286 = 1.;
static integer c__5 = 5;
static integer c__6 = 6;
static integer c__7 = 7;

/* Subroutine */ int jcg_(integer *nn, integer *ia, integer *ja, doublereal *
  a, doublereal *rhs, doublereal *u, integer *iwksp, integer *nw, 
  doublereal *wksp, integer *iparm, doublereal *rparm, integer *ierr)
{
    /* Format strings */
    static char fmt_10[] = "(\0020\002///1x,\002BEGINNING OF ITPACK SOLUTION\
 MODULE  JCG\002)";
    static char fmt_40[] = "(\0020\002,\002*** W A R N I N G ************\
\002/\0020\002,\002    IN ITPACK ROUTINE JCG\002/\002 \002,\002    RPARM(1) =\
\002,d10.3,\002 (ZETA)\002/\002 \002,\002    A VALUE THIS SMALL MAY HINDER C\
ONVERGENCE \002/\002 \002,\002    SINCE MACHINE PRECISION DRELPR =\002,d10.3/\
\002 \002,\002    ZETA RESET TO \002,d10.3)";
    static char fmt_60[] = "(\0020\002,\002*** F A T A L     E R R O R *****\
*******\002/\0020\002,\002    CALLED FROM ITPACK ROUTINE JCG \002/\002 \002\
,\002    INVALID MATRIX DIMENSION, N =\002,i8)";
    static char fmt_80[] = "(\0020\002,\002*** F A T A L     E R R O R *****\
*******\002/\0020\002,\002    CALLED FROM ITPACK ROUTINE JCG \002/\002 \002\
,\002    ERROR DETECTED IN SUBROUTINE  SBELM \002/\002 \002,\002    WHICH RE\
MOVES ROWS AND COLUMNS OF SYSTEM \002/\002 \002,\002    WHEN DIAGONAL ENTRY \
TOO LARGE  \002/\002 \002,\002    IER = \002,i5,5x,\002 RPARM(8) = \002,d10.\
3,\002 (TOL)\002)";
    static char fmt_100[] = "(\0020\002,\002*** F A T A L     E R R O R ****\
********\002/\0020\002,\002    CALLED FROM ITPACK ROUTINE JCG \002/\002 \002,\
\002    NOT ENOUGH WORKSPACE AT \002,i10/\002 \002,\002    SET IPARM(8) =\
\002,i10,\002 (NW)\002)";
    static char fmt_120[] = "(\0020\002,\002*** F A T A L     E R R O R ****\
********\002/\0020\002,\002    CALLED FROM ITPACK ROUTINE JCG \002/\002 \002,\
\002    ERROR DETECTED IN SUBROUTINE  PRBNDX\002/\002 \002,\002    WHICH COM\
PUTES THE RED-BLACK INDEXING\002/\002 \002,\002    IER = \002,i5,\002 IPARM(\
9) = \002,i5,\002 (NB)\002)";
    static char fmt_140[] = "(/10x,\002ORDER OF BLACK SUBSYSTEM = \002,i5\
,\002 (NB)\002)";
    static char fmt_150[] = "(\0020\002,\002*** F A T A L     E R R O R ****\
********\002/\0020\002,\002    CALLED FROM ITPACK ROUTINE JCG \002/\002 \002,\
\002    ERROR DETECTED IN SUBROUTINE  PERMAT\002/\002 \002,\002    WHICH DOE\
S THE RED-BLACK PERMUTATION\002/\002 \002,\002    IER = \002,i5)";
    static char fmt_180[] = "(\0020\002,\002*** F A T A L     E R R O R ****\
********\002/\0020\002,\002    CALLED FROM ITPACK ROUTINE JCG \002/\002 \002,\
\002    ERROR DETECTED IN SUBROUTINE  SCAL  \002/\002 \002,\002    WHICH SCA\
LES THE SYSTEM   \002/\002 \002,\002    IER = \002,i5)";
    static char fmt_200[] = "(///1x,\002IN THE FOLLOWING, RHO AND GAMMA AR\
E\002,\002 ACCELERATION PARAMETERS\002)";
    static char fmt_210[] = "(1x,\002CME IS THE ESTIMATE OF THE LARGEST EIGE\
NVALUE OF\002,\002 THE JACOBI MATRIX\002)";
    static char fmt_270[] = "(\0020\002,\002*** W A R N I N G ***********\
*\002/\0020\002,\002    IN ITPACK ROUTINE JCG\002/\002 \002,\002    FAILURE \
TO CONVERGE IN\002,i5,\002 ITERATIONS\002)";
    static char fmt_300[] = "(/1x,\002JCG  HAS CONVERGED IN \002,i5,\002 ITE\
RATIONS\002)";
    static char fmt_320[] = "(\0020\002,\002*** F A T A L     E R R O R ****\
********\002/\0020\002,\002    CALLED FROM ITPACK ROUTINE JCG \002/\002 \002,\
\002    ERROR DETECTED IN SUBROUTINE  PERMAT\002/\002 \002,\002    WHICH UND\
OES THE RED-BLACK PERMUTATION   \002/\002 \002,\002    IER = \002,i5)";

    /* System generated locals */
    integer i__1;

    /* Builtin functions */
    integer s_wsfe(cilist *), e_wsfe(void), do_fio(integer *, char *, ftnlen);

    /* Local variables */
    static integer n, n3, nb, ib1, ib2, ib3, ib4, ib5, ier;
    static doublereal tol;
    extern /* Subroutine */ int pjac_(integer *, integer *, integer *, 
      doublereal *, doublereal *, doublereal *), scal_(integer *, 
      integer *, integer *, doublereal *, doublereal *, doublereal *, 
      doublereal *, integer *, integer *, integer *);
    static doublereal temp;
    static integer loop;
    static doublereal time1, time2;
    static real timi1, timj1, timi2, timj2;
    extern /* Subroutine */ int itjcg_(integer *, integer *, integer *, 
      doublereal *, doublereal *, doublereal *, doublereal *, 
      doublereal *, doublereal *, doublereal *), sbelm_(integer *, 
      integer *, integer *, doublereal *, doublereal *, integer *, 
      doublereal *, doublereal *, integer *, integer *, integer *, 
      integer *);
    static integer idgts;
    extern /* Subroutine */ int vfill_(integer *, doublereal *, doublereal *),
       itpackdcopy_(integer *, doublereal *, integer *, doublereal *, integer 
      *);
    extern doublereal timer_(real *);
    static real dummy;
    extern /* Subroutine */ int vevmw_(integer *, doublereal *, doublereal *);
    static doublereal digit1, digit2;
    static integer itmax1;
    extern /* Subroutine */ int echall_(integer *, integer *, integer *, 
      doublereal *, doublereal *, integer *, doublereal *, integer *), 
      pervec_(integer *, doublereal *, integer *), ivfill_(integer *, 
      integer *, integer *);
    static integer ierper;
    extern /* Subroutine */ int echout_(integer *, doublereal *, integer *), 
      permat_(integer *, integer *, integer *, doublereal *, integer *, 
      integer *, integer *, integer *, integer *, integer *), unscal_(
      integer *, integer *, integer *, doublereal *, doublereal *, 
      doublereal *, doublereal *), prbndx_(integer *, integer *, 
      integer *, integer *, integer *, integer *, integer *, integer *, 
      integer *), perror_(integer *, integer *, integer *, doublereal *,
       doublereal *, doublereal *, doublereal *, doublereal *, 
      doublereal *, integer *);

    /* Fortran I/O blocks */
    static cilist io___1 = { 0, 0, 0, fmt_10, 0 };
    static cilist io___7 = { 0, 0, 0, fmt_40, 0 };
    static cilist io___12 = { 0, 0, 0, fmt_60, 0 };
    static cilist io___14 = { 0, 0, 0, fmt_80, 0 };
    static cilist io___20 = { 0, 0, 0, fmt_100, 0 };
    static cilist io___23 = { 0, 0, 0, fmt_120, 0 };
    static cilist io___24 = { 0, 0, 0, fmt_140, 0 };
    static cilist io___25 = { 0, 0, 0, fmt_150, 0 };
    static cilist io___26 = { 0, 0, 0, fmt_180, 0 };
    static cilist io___27 = { 0, 0, 0, fmt_200, 0 };
    static cilist io___28 = { 0, 0, 0, fmt_210, 0 };
    static cilist io___33 = { 0, 0, 0, fmt_270, 0 };
    static cilist io___34 = { 0, 0, 0, fmt_300, 0 };
    static cilist io___36 = { 0, 0, 0, fmt_320, 0 };



/*     ITPACK 2C MAIN SUBROUTINE  JCG  (JACOBI CONJUGATE GRADIENT) */
/*     EACH OF THE MAIN SUBROUTINES: */
/*           JCG, JSI, SOR, SSORCG, SSORSI, RSCG, RSSI */
/*     CAN BE USED INDEPENDENTLY OF THE OTHERS */

/* ... FUNCTION: */

/*          THIS SUBROUTINE, JCG, DRIVES THE JACOBI CONJUGATE */
/*          GRADIENT ALGORITHM. */

/* ... PARAMETER LIST: */

/*          N      INPUT INTEGER.  DIMENSION OF THE MATRIX. (= NN) */
/*          IA,JA  INPUT INTEGER VECTORS.  THE TWO INTEGER ARRAYS OF */
/*                 THE SPARSE MATRIX REPRESENTATION. */
/*          A      INPUT D.P. VECTOR.  THE D.P. ARRAY OF THE SPARSE */
/*                 MATRIX REPRESENTATION. */
/*          RHS    INPUT D.P. VECTOR.  CONTAINS THE RIGHT HAND SIDE */
/*                 OF THE MATRIX PROBLEM. */
/*          U      INPUT/OUTPUT D.P. VECTOR.  ON INPUT, U CONTAINS THE */
/*                 INITIAL GUESS TO THE SOLUTION. ON OUTPUT, IT CONTAINS */
/*                 THE LATEST ESTIMATE TO THE SOLUTION. */
/*          IWKSP  INTEGER VECTOR WORKSPACE OF LENGTH 3*N */
/*          NW     INPUT INTEGER.  LENGTH OF AVAILABLE WKSP.  ON OUTPUT, */
/*                 IPARM(8) IS AMOUNT USED. */
/*          WKSP   D.P. VECTOR USED FOR WORKING SPACE.  JACOBI CONJUGATE */
/*                 GRADIENT NEEDS THIS TO BE IN LENGTH AT LEAST */
/*                 4*N + 2*ITMAX,  IF ISYM = 0  (SYMMETRIC STORAGE) */
/*                 4*N + 4*ITMAX,  IF ISYM = 1  (NONSYMMETRIC STORAGE) */
/*                 HERE ITMAX = IPARM(1) AND ISYM = IPARM(5) */
/*                 (ITMAX IS THE MAXIMUM ALLOWABLE NUMBER OF ITERATIONS) */
/*          IPARM  INTEGER VECTOR OF LENGTH 12.  ALLOWS USER TO SPECIFY */
/*                 SOME INTEGER PARAMETERS WHICH AFFECT THE METHOD. */
/*          RPARM  D.P. VECTOR OF LENGTH 12. ALLOWS USER TO SPECIFY SOME */
/*                 D.P. PARAMETERS WHICH AFFECT THE METHOD. */
/*          IER    OUTPUT INTEGER.  ERROR FLAG. (= IERR) */

/* ... JCG SUBPROGRAM REFERENCES: */

/*          FROM ITPACK    BISRCH, CHGCON, DETERM, DFAULT, ECHALL, */
/*                         ECHOUT, EIGVNS, EIGVSS, EQRT1S, ITERM, TIMER, */
/*                         ITJCG, IVFILL, PARCON, PERMAT, */
/*                         PERROR, PERVEC, PJAC, PMULT, PRBNDX, */
/*                         PSTOP, QSORT, DAXPY, SBELM, SCAL, DCOPY, */
/*                         DDOT, SUM3, UNSCAL, VEVMW, VFILL, VOUT, */
/*                         WEVMW, ZBRENT */
/*          SYSTEM         DABS, DLOG10, DBLE(AMAX0), DMAX1, MOD, DSQRT */

/*     VERSION:  ITPACK 2C (MARCH 1982) */

/*     CODE WRITTEN BY:  DAVID KINCAID, ROGER GRIMES, JOHN RESPESS */
/*                       CENTER FOR NUMERICAL ANALYSIS */
/*                       UNIVERSITY OF TEXAS */
/*                       AUSTIN, TX  78712 */
/*                       (512) 471-1242 */

/*     FOR ADDITIONAL DETAILS ON THE */
/*          (A) SUBROUTINE SEE TOMS ARTICLE 1982 */
/*          (B) ALGORITHM  SEE CNA REPORT 150 */

/*     BASED ON THEORY BY:  DAVID YOUNG, DAVID KINCAID, LOU HAGEMAN */

/*     REFERENCE THE BOOK:  APPLIED ITERATIVE METHODS */
/*                          L. HAGEMAN, D. YOUNG */
/*                          ACADEMIC PRESS, 1981 */

/*     ************************************************** */
/*     *               IMPORTANT NOTE                   * */
/*     *                                                * */
/*     *      WHEN INSTALLING ITPACK ROUTINES ON A      * */
/*     *  DIFFERENT COMPUTER, RESET SOME OF THE VALUES  * */
/*     *  IN  SUBROUTNE DFAULT.   MOST IMPORTANT ARE    * */
/*     *                                                * */
/*     *   DRELPR      MACHINE RELATIVE PRECISION       * */
/*     *   RPARM(1)    STOPPING CRITERION               * */
/*     *                                                * */
/*     *   ALSO CHANGE SYSTEM-DEPENDENT ROUTINE         * */
/*     *   SECOND USED IN TIMER                         * */
/*     *                                                * */
/*     ************************************************** */

/*     SPECIFICATIONS FOR ARGUMENTS */


/*     SPECIFICATIONS FOR LOCAL VARIABLES */


/* **** BEGIN: ITPACK COMMON */




/* **** END  : ITPACK COMMON */

/* ... VARIABLES IN COMMON BLOCK - ITCOM1 */

/*     IN     - ITERATION NUMBER */
/*     IS     - ITERATION NUMBER WHEN PARAMETERS LAST CHANGED */
/*     ISYM   - SYMMETRIC/NONSYMMETRIC STORAGE FORMAT SWITCH */
/*     ITMAX  - MAXIMUM NUMBER OF ITERATIONS ALLOWED */
/*     LEVEL  - LEVEL OF OUTPUT CONTROL SWITCH */
/*     NOUT   - OUTPUT UNIT NUMBER */

/* ... VARIABLES IN COMMON BLOCK - ITCOM2 */

/*     ADAPT  - FULLY ADAPTIVE PROCEDURE SWITCH */
/*     BETADT - SWITCH FOR ADAPTIVE DETERMINATION OF BETA */
/*     CASEII - ADAPTIVE PROCEDURE CASE SWITCH */
/*     HALT   - STOPPING TEST SWITCH */
/*     PARTAD - PARTIALLY ADAPTIVE PROCEDURE SWITCH */

/* ... VARIABLES IN COMMON BLOCK - ITCOM3 */

/*     BDELNM - TWO NORM OF B TIMES DELTA-SUPER-N */
/*     BETAB  - ESTIMATE FOR THE SPECTRAL RADIUS OF LU MATRIX */
/*     CME    - ESTIMATE OF LARGEST EIGENVALUE */
/*     DELNNM - INNER PRODUCT OF PSEUDO-RESIDUAL AT ITERATION N */
/*     DELSNM - INNER PRODUCT OF PSEUDO-RESIDUAL AT ITERATION S */
/*     FF     - ADAPTIVE PROCEDURE DAMPING FACTOR */
/*     GAMMA  - ACCELERATION PARAMETER */
/*     OMEGA  - OVERRELAXATION PARAMETER FOR SOR AND SSOR */
/*     QA     - PSEUDO-RESIDUAL RATIO */
/*     QT     - VIRTUAL SPECTRAL RADIUS */
/*     RHO    - ACCELERATION PARAMETER */
/*     RRR    - ADAPTIVE PARAMETER */
/*     SIGE   - PARAMETER SIGMA-SUB-E */
/*     SME    - ESTIMATE OF SMALLEST EIGENVALUE */
/*     SPECR  - SPECTRAL RADIUS ESTIMATE FOR SSOR */
/*     DRELPR - MACHINE RELATIVE PRECISION */
/*     STPTST - STOPPING PARAMETER */
/*     UDNM   - TWO NORM OF U */
/*     ZETA   - STOPPING CRITERION */

/* ... INITIALIZE COMMON BLOCKS */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?