⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsrc2c.c

📁 DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.
💻 C
📖 第 1 页 / 共 5 页
字号:
/*          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)                  */
/*                                                                        */
/* ... SSORCG SUBPROGRAM REFERENCES:                                      */
/*                                                                        */
/*          FROM ITPACK    BISRCH, CHGCON, DETERM, DFAULT, ECHALL,        */
/*                         ECHOUT, EIGVNS, EIGVSS, EQRT1S, ITERM, TIMER,  */
/*                         ITSRCG, IVFILL, OMEG, OMGCHG, OMGSTR,          */
/*                         PARCON, PBETA, PBSOR, PERMAT, PERROR,          */
/*                         PERVEC, PFSOR, PJAC, PMULT, PRBNDX, PSTOP, PVT */
/*                         QSORT, SBELM, SCAL, DCOPY, DDOT, SUM3,         */
/*                         UNSCAL, VEVMW, VEVPW, VFILL, VOUT, WEVMW,      */
/*                         ZBRENT                                         */
/*          SYSTEM         DABS, DLOG, DLOG10, DBLE(AMAX0), DMAX1, AMIN1, */
/*                         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                                 */
/*                                                                        */
/* ... 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                                        */

    itcom1_1.level = iparm[1];
    itcom1_1.nout = iparm[3];
    if (iparm[8] >= 0)
        iparm[5] = 2;

    ier = 0;
    if (iparm[0] <= 0)
        return 0;

    if (iparm[10] == 0)
        timj1 = dsrc_timer_((real*)0);

    if (itcom1_1.level < 3)
        echout_(iparm, rparm, &c__4);
    else
        echall_(n, ia, ja, a, rhs, iparm, rparm, &c__1);
    temp = itcom3_1.drelpr * 500.;
    if (itcom3_1.zeta < temp)
        itcom3_1.zeta = temp;

    time1 = rparm[8];
    time2 = rparm[9];
    digit1 = rparm[10];
    digit2 = rparm[11];

    /* ... VERIFY N */

    if (*n <= 0) {
        ier = 41;
        goto L390;
    }

    /* ... REMOVE ROWS AND COLUMNS IF REQUESTED */

    if (iparm[9] != 0) {
        tol = rparm[7];
        ivfill_(n, iwksp, &c__0);
        vfill_(n, wksp, &c_b21);
        sbelm_(n, ia, ja, a, rhs, iwksp, wksp, &tol, &itcom1_1.isym, &itcom1_1.level, &itcom1_1.nout, &ier);
        if (ier != 0)
            goto L390;
    }

    /* ... INITIALIZE WKSP BASE ADDRESSES. */

    ib1 = 0;
    ib2 = ib1 + *n;
    ib3 = ib2 + *n;
    ib4 = ib3 + *n;
    ib5 = ib4 + *n;
    ib6 = ib5 + *n;
    ib7 = ib6 + *n;
    iparm[7] = *n * 6 + (itcom1_1.itmax << 1);
    if (itcom1_1.isym != 0)
        iparm[7] += itcom1_1.itmax << 1;

    if (*nw < iparm[7]) {
        ier = 42;
        goto L390;
    }

    /* ... PERMUTE TO  RED-BLACK SYSTEM IF REQUESTED */

    nb = iparm[8];
    if (nb < 0)
        goto L170;

    n3 = *n * 3;
    ivfill_(&n3, iwksp, &c__0);
    prbndx_(n, &nb, ia, ja, iwksp, &iwksp[ib2], &itcom1_1.level, &itcom1_1.nout, &ier);
    if (ier != 0)
        goto L390;

    /* ... PERMUTE MATRIX AND RHS */

    permat_(n, ia, ja, a, iwksp, &iwksp[ib3], &itcom1_1.isym, &itcom1_1.level, &itcom1_1.nout, &ier);
    if (ier != 0)
        goto L390;

    pervec_(n, rhs, iwksp);
    pervec_(n, u, iwksp);

    /* ... SCALE LINEAR SYSTEM, U, AND RHS BY THE SQUARE ROOT OF THE */
    /* ... DIAGONAL ELEMENTS. */

L170:
    vfill_(&iparm[7], wksp, &c_b21);
    scal_(n, ia, ja, a, rhs, u, wksp, &itcom1_1.level, &itcom1_1.nout, &ier);
    if (ier != 0)
        goto L390;

    if (iparm[10] == 0)
        timi1 = dsrc_timer_((real*)0);

    /* ... SPECIAL PROCEDURE FOR FULLY ADAPTIVE CASE. */

    if (! itcom2_1.adapt)
        goto L250;

    if (itcom2_1.betadt) {
        vfill_(n, &wksp[ib1], &c_b286);
        betnew = pbeta_(n, ia, ja, a, &wksp[ib1], &wksp[ib2], &wksp[ib3]) / (doublereal)(*n);
        itcom3_1.betab = max(max(itcom3_1.betab,.25),betnew);
    }

    omeg_(&c_b21, &c__1);
    itcom1_1.is = 0;

    /* ... INITIALIZE FORWARD PSEUDO-RESIDUAL */

L250:
    itpackdcopy_(n, rhs, &c__1, &wksp[ib1], &c__1);
    itpackdcopy_(n, u, &c__1, &wksp[ib2], &c__1);
    pfsor_(n, ia, ja, a, &wksp[ib2], &wksp[ib1]);
    vevmw_(n, &wksp[ib2], u);

    /* ... ITERATION SEQUENCE */

    itmax1 = itcom1_1.itmax + 1;
    for (loop = 1; loop <= itmax1; ++loop) {
        itcom1_1.in = loop - 1;
        if (itcom1_1.in % 2 == 1)
            goto L260;

        /* ... CODE FOR THE EVEN ITERATIONS. */

        /*     U           = U(IN)       WKSP(IB2) = C(IN) */
        /*     WKSP(IB1)   = U(IN-1)     WKSP(IB3) = C(IN-1) */

        itsrcg_(n, ia, ja, a, rhs, u, &wksp[ib1], &wksp[ib2], &wksp[ib3], &wksp[ib4], &wksp[ib5], &wksp[ib6], &wksp[ib7]);

        if (itcom2_1.halt)
            goto L300;

        continue;

        /* ... CODE FOR THE ODD ITERATIONS. */

        /*     U           = U(IN-1)     WKSP(IB2) = C(IN-1) */
        /*     WKSP(IB1)   = U(IN)       WKSP(IB3) =C(IN) */

L260:
        itsrcg_(n, ia, ja, a, rhs, &wksp[ib1], u, &wksp[ib3], &wksp[ib2], &wksp[ib4], &wksp[ib5], &wksp[ib6], &wksp[ib7]);

        if (itcom2_1.halt)
            goto L300;
    }

    /* ... ITMAX HAS BEEN REACHED */

    if (iparm[10] == 0) {
        timi2 = dsrc_timer_((real*)0);
        time1 = (doublereal) (timi2 - timi1);
    }
    ier = 43;
    if (iparm[2] == 0)
        rparm[0] = itcom3_1.stptst;

    goto L330;

    /* ... METHOD HAS CONVERGED */

L300:
    if (iparm[10] == 0) {
        timi2 = dsrc_timer_((real*)0);
        time1 = (doublereal) (timi2 - timi1);
    }

    /* ... PUT SOLUTION INTO U IF NOT ALREADY THERE. */

L330:
    if (itcom1_1.in % 2 == 1)
        itpackdcopy_(n, &wksp[ib1], &c__1, u, &c__1);

    /* ... UNSCALE THE MATRIX, SOLUTION, AND RHS VECTORS. */

    unscal_(n, ia, ja, a, rhs, u, wksp);

    /* ... UN-PERMUTE MATRIX,RHS, AND SOLUTION */

    if (iparm[8] < 0)
        goto L360;

    permat_(n, ia, ja, a, &iwksp[ib2], &iwksp[ib3], &itcom1_1.isym, &itcom1_1.level, &itcom1_1.nout, &ierper);
    if (ierper != 0) {
        if (ier == 0)
            ier = ierper;

        goto L390;
    }

    pervec_(n, rhs, &iwksp[ib2]);
    pervec_(n, u, &iwksp[ib2]);

    /* ... OPTIONAL ERROR ANALYSIS */

L360:
    idgts = iparm[11];
    if (idgts >= 0) {
        if (iparm[1] <= 0)
            idgts = 0;

        perror_(n, ia, ja, a, rhs, u, wksp, &digit1, &digit2, &idgts);
    }

    /* ... SET

⌨️ 快捷键说明

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