dsrc2c.c
来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· C语言 代码 · 共 1,951 行 · 第 1/5 页
C
1,951 行
/* 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 */
/* Parameter adjustments */
--u;
--rhs;
--ia;
--ja;
--a;
--iwksp;
--wksp;
--iparm;
--rparm;
/* Function Body */
itcom1_1.level = iparm[2];
itcom1_1.nout = iparm[4];
if (itcom1_1.level >= 1) {
io___75.ciunit = itcom1_1.nout;
s_wsfe(&io___75);
e_wsfe();
}
ier = 0;
if (iparm[1] <= 0) {
return 0;
}
n = *nn;
if (iparm[11] == 0) {
timj1 = timer_(&dummy);
}
if (itcom1_1.level >= 3) {
goto L20;
}
echout_(&iparm[1], &rparm[1], &c__3);
goto L30;
L20:
echall_(&n, &ia[1], &ja[1], &a[1], &rhs[1], &iparm[1], &rparm[1], &c__1);
L30:
temp = itcom3_1.drelpr * 500.;
if (itcom3_1.zeta >= temp) {
goto L50;
}
if (itcom1_1.level >= 1) {
io___81.ciunit = itcom1_1.nout;
s_wsfe(&io___81);
do_fio(&c__1, (char *)&itcom3_1.zeta, (ftnlen)sizeof(doublereal));
do_fio(&c__1, (char *)&itcom3_1.drelpr, (ftnlen)sizeof(doublereal));
do_fio(&c__1, (char *)&temp, (ftnlen)sizeof(doublereal));
e_wsfe();
}
itcom3_1.zeta = temp;
L50:
time1 = rparm[9];
time2 = rparm[10];
digit1 = rparm[11];
digit2 = rparm[12];
/* ... VERIFY N */
if (n > 0) {
goto L70;
}
ier = 31;
if (itcom1_1.level >= 0) {
io___86.ciunit = itcom1_1.nout;
s_wsfe(&io___86);
do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer));
e_wsfe();
}
goto L360;
L70:
/* ... REMOVE ROWS AND COLUMNS IF REQUESTED */
if (iparm[10] == 0) {
goto L90;
}
tol = rparm[8];
ivfill_(&n, &iwksp[1], &c__0);
vfill_(&n, &wksp[1], &c_b21);
sbelm_(&n, &ia[1], &ja[1], &a[1], &rhs[1], &iwksp[1], &wksp[1], &tol, &
itcom1_1.isym, &itcom1_1.level, &itcom1_1.nout, &ier);
if (ier == 0) {
goto L90;
}
if (itcom1_1.level >= 0) {
io___88.ciunit = itcom1_1.nout;
s_wsfe(&io___88);
do_fio(&c__1, (char *)&ier, (ftnlen)sizeof(integer));
do_fio(&c__1, (char *)&tol, (ftnlen)sizeof(doublereal));
e_wsfe();
}
goto L360;
/* ... INITIALIZE WKSP BASE ADDRESSES. */
L90:
ib1 = 1;
ib2 = ib1 + n;
ib3 = ib2 + n;
iparm[8] = n;
if (*nw >= iparm[8]) {
goto L110;
}
ier = 32;
if (itcom1_1.level >= 0) {
io___92.ciunit = itcom1_1.nout;
s_wsfe(&io___92);
do_fio(&c__1, (char *)&(*nw), (ftnlen)sizeof(integer));
do_fio(&c__1, (char *)&iparm[8], (ftnlen)sizeof(integer));
e_wsfe();
}
goto L360;
/* ... PERMUTE TO RED-BLACK SYSTEM IF REQUESTED */
L110:
nb = iparm[9];
if (nb < 0) {
goto L170;
}
n3 = n * 3;
ivfill_(&n3, &iwksp[1], &c__0);
prbndx_(&n, &nb, &ia[1], &ja[1], &iwksp[1], &iwksp[ib2], &itcom1_1.level,
&itcom1_1.nout, &ier);
if (ier == 0) {
goto L130;
}
if (itcom1_1.level >= 0) {
io___95.ciunit = itcom1_1.nout;
s_wsfe(&io___95);
do_fio(&c__1, (char *)&ier, (ftnlen)sizeof(integer));
do_fio(&c__1, (char *)&nb, (ftnlen)sizeof(integer));
e_wsfe();
}
goto L360;
/* ... PERMUTE MATRIX AND RHS */
L130:
if (itcom1_1.level >= 2) {
io___96.ciunit = itcom1_1.nout;
s_wsfe(&io___96);
do_fio(&c__1, (char *)&nb, (ftnlen)sizeof(integer));
e_wsfe();
}
permat_(&n, &ia[1], &ja[1], &a[1], &iwksp[1], &iwksp[ib3], &itcom1_1.isym,
&itcom1_1.level, &itcom1_1.nout, &ier);
if (ier == 0) {
goto L160;
}
if (itcom1_1.level >= 0) {
io___97.ciunit = itcom1_1.nout;
s_wsfe(&io___97);
do_fio(&c__1, (char *)&ier, (ftnlen)sizeof(integer));
e_wsfe();
}
goto L360;
L160:
pervec_(&n, &rhs[1], &iwksp[1]);
pervec_(&n, &u[1], &iwksp[1]);
/* ... SCALE LINEAR SYSTEM, U, AND RHS BY THE SQUARE ROOT OF THE */
/* ... DIAGONAL ELEMENTS. */
L170:
vfill_(&iparm[8], &wksp[1], &c_b21);
scal_(&n, &ia[1], &ja[1], &a[1], &rhs[1], &u[1], &wksp[1], &
itcom1_1.level, &itcom1_1.nout, &ier);
if (ier == 0) {
goto L190;
}
if (itcom1_1.level >= 0) {
io___98.ciunit = itcom1_1.nout;
s_wsfe(&io___98);
do_fio(&c__1, (char *)&ier, (ftnlen)sizeof(integer));
e_wsfe();
}
goto L360;
L190:
if (itcom1_1.level <= 2) {
goto L220;
}
if (itcom2_1.adapt) {
io___99.ciunit = itcom1_1.nout;
s_wsfe(&io___99);
e_wsfe();
}
io___100.ciunit = itcom1_1.nout;
s_wsfe(&io___100);
e_wsfe();
L220:
if (iparm[11] != 0) {
goto L230;
}
timi1 = timer_(&dummy);
/* ... ITERATION SEQUENCE */
L230:
itmax1 = itcom1_1.itmax + 1;
i__1 = itmax1;
for (loop = 1; loop <= i__1; ++loop) {
itcom1_1.in = loop - 1;
/* ... CODE FOR ONE ITERATION. */
/* U = U(IN) */
itsor_(&n, &ia[1], &ja[1], &a[1], &rhs[1], &u[1], &wksp[ib1]);
if (itcom2_1.halt) {
goto L270;
}
/* L240: */
}
/* ... ITMAX HAS BEEN REACHED */
if (iparm[11] != 0) {
goto L250;
}
timi2 = timer_(&dummy);
time1 = (doublereal) (timi2 - timi1);
L250:
if (itcom1_1.level >= 1) {
io___105.ciunit = itcom1_1.nout;
s_wsfe(&io___105);
do_fio(&c__1, (char *)&itcom1_1.itmax, (ftnlen)sizeof(integer));
e_wsfe();
}
ier = 33;
if (iparm[3] == 0) {
rparm[1] = itcom3_1.stptst;
}
goto L300;
/* ... METHOD HAS CONVERGED */
L270:
if (iparm[11] != 0) {
goto L280;
}
timi2 = timer_(&dummy);
time1 = (doublereal) (timi2 - timi1);
L280:
if (itcom1_1.level >= 1) {
io___106.ciunit = itcom1_1.nout;
s_wsfe(&io___106);
do_fio(&c__1, (char *)&itcom1_1.in, (ftnlen)sizeof(integer));
e_wsfe();
}
/* ... UNSCALE THE MATRIX, SOLUTION, AND RHS VECTORS. */
L300:
unscal_(&n, &ia[1], &ja[1], &a[1], &rhs[1], &u[1], &wksp[1]);
/* ... UN-PERMUTE MATRIX,RHS, AND SOLUTION */
if (iparm[9] < 0) {
goto L330;
}
permat_(&n, &ia[1], &ja[1], &a[1], &iwksp[ib2], &iwksp[ib3], &
itcom1_1.isym, &itcom1_1.level, &itcom1_1.nout, &ierper);
if (ierper == 0) {
goto L320;
}
if (itcom1_1.level >= 0) {
io___108.ciunit = itcom1_1.nout;
s_wsfe(&io___108);
do_fio(&c__1, (char *)&ierper, (ftnlen)sizeof(integer));
e_wsfe();
}
if (ier == 0) {
ier = ierper;
}
goto L360;
L320:
pervec_(&n, &rhs[1], &iwksp[ib2]);
pervec_(&n, &u[1], &iwksp[ib2]);
/* ... OPTIONAL ERROR ANALYSIS */
L330:
idgts = iparm[12];
if (idgts < 0) {
goto L340;
}
if (iparm[2] <= 0) {
idgts = 0;
}
perror_(&n, &ia[1], &ja[1], &a[1], &rhs[1], &u[1], &wksp[1], &digit1, &
digit2, &idgts);
/* ... SET RETURN PARAMETERS IN IPARM AND RPARM */
L340:
if (iparm[11] != 0) {
goto L350;
}
timj2 = timer_(&dummy);
time2 = (doublereal) (timj2 - timj1);
L350:
if (iparm[3] != 0) {
goto L360;
}
iparm[1] = itcom1_1.in;
iparm[9] = nb;
rparm[2] = itcom3_1.cme;
rparm[3] = itcom3_1.sme;
rparm[5] = itcom3_1.omega;
rparm[9] = time1;
rparm[10] = time2;
rparm[11] = digit1;
rparm[12] = digit2;
L360:
*ierr = ier;
if (itcom1_1.level >= 3) {
echall_(&n, &ia[1], &ja[1], &a[1], &rhs[1], &iparm[1], &rparm[1], &
c__2);
}
return 0;
} /* sor_ */
/* Subroutine */ int ssorcg_(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 SSORCG\002)";
static char fmt_40[] = "(\0020\002,\002*** W A R N I N G ************\
\002/\0020\002,\002 IN ITPACK ROUTINE SSORCG\002/\002 \002,\002 RPARM(\
1) =\002,d10.3,\002 (ZETA)\002/\002 \002,\002 A VALUE THIS SMALL MAY HIND\
ER CONVERGENCE \002/\002 \002,\002 SINCE MACHINE PRECISION DRELPR =\002,d\
10.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 SSORCG \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 SSORCG \002/\002\
\002,\002 ERROR DETECTED IN SUBROUTINE SBELM \002/\002 \002,\002 WHI\
CH REMOVES ROWS AND COLUMNS OF SYSTEM \002/\002 \002,\002 WHEN DIAGONAL E\
NTRY 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 SSORCG \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 SSORCG \002/\002\
\002,\002 ERROR DETECTED IN SUBROUTINE PRBNDX\002/\002 \002,\002 WHI\
CH COMPUTES 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 SSORCG \002/\002\
\002,\002 ERROR DETECTED IN SUBROUTINE PERMAT\002/\002 \002,\002 WHI\
CH DOES THE RED-BLACK PERMUTATION\002/\002 \002,\002 IER =
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?