zlarfb.c

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

C
587
字号
                        i__2 = i + j * *ldwork;
                        c[i__1].r -= work[i__2].r, c[i__1].i += work[i__2].i;
                    }
                }

            } else if (lsame_(side, "R")) {

/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */

/*              W := C * V  =  (C1*V1 + C2*V2)  (stored in WORK) */

/*              W := C2 */

                for (j = 0; j < *k; ++j) {
                    zcopy_(m, &c[(*n - *k + j) * *ldc], &c__1, &work[j* *ldwork], &c__1);
                }

/*              W := W * V2 */

                ztrmm_("Right", "Upper", "No transpose", "Unit", m, k, &c_b15, &v[*n - *k], ldv, work, ldwork);
                if (*n > *k) {

/*                 W := W + C1 * V1 */

                    i__1 = *n - *k;
                    zgemm_("No transpose", "No transpose", m, k, &i__1, &c_b15,
                           c, ldc, v, ldv, &c_b15, work, ldwork);
                }

/*              W := W * T  or  W * T' */

                ztrmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b15, t, ldt, work, ldwork);

/*              C := C - W * V' */

                if (*n > *k) {

/*                 C1 := C1 - W * V1' */

                    i__1 = *n - *k;
                    zgemm_("No transpose", "Conjugate transpose", m, &i__1, k,
                           &c_b26, work, ldwork, v, ldv, &c_b15, c, ldc);
                }

/*              W := W * V2' */

                ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", m, k, &c_b15, &v[*n - *k], ldv, work, ldwork);

/*              C2 := C2 - W */

                for (j = 0; j < *k; ++j) {
                    for (i = 0; i < *m; ++i) {
                        i__1 = i + (*n - *k + j) * *ldc;
                        i__2 = i + j * *ldwork;
                        c[i__1].r -= work[i__2].r, c[i__1].i -= work[i__2].i;
                    }
                }
            }
        }

    } else if (lsame_(storev, "R")) {

        if (lsame_(direct, "F")) {

/*           Let  V =  ( V1  V2 )    (V1: first K columns) */
/*           where  V1  is unit upper triangular. */

            if (lsame_(side, "L")) {

/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
/*                                                  ( C2 ) */

/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */

/*              W := C1' */

                for (j = 0; j < *k; ++j) {
                    zcopy_(n, &c[j], ldc, &work[j* *ldwork], &c__1);
                    zlacgv_(n, &work[j* *ldwork], &c__1);
                }

/*              W := W * V1' */

                ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", n, k, &c_b15, v, ldv, work, ldwork);
                if (*m > *k) {

/*                 W := W + C2'*V2' */

                    i__1 = *m - *k;
                    zgemm_("Conjugate transpose", "Conjugate transpose", n, k,
                           &i__1, &c_b15, &c[*k], ldc, &v[*k * *ldv], ldv, &c_b15, work, ldwork);
                }

/*              W := W * T'  or  W * T */

                ztrmm_("Right", "Upper", transt, "Non-unit", n, k, &c_b15, t, ldt, work, ldwork);

/*              C := C - V' * W' */

                if (*m > *k) {

/*                 C2 := C2 - V2' * W' */

                    i__1 = *m - *k;
                    zgemm_("Conjugate transpose", "Conjugate transpose", &i__1,
                           n, k, &c_b26, &v[*k * *ldv], ldv, work, ldwork, &c_b15, &c[*k], ldc);
                }

/*              W := W * V1 */

                ztrmm_("Right", "Upper", "No transpose", "Unit", n, k, &c_b15, v, ldv, work, ldwork);

/*              C1 := C1 - W' */

                for (j = 0; j < *k; ++j) {
                    for (i = 0; i < *n; ++i) {
                        i__1 = j + i * *ldc;
                        i__2 = i + j * *ldwork;
                        c[i__1].r -= work[i__2].r, c[i__1].i += work[i__2].i;
                    }
                }

            } else if (lsame_(side, "R")) {

/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */

/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */

/*              W := C1 */

                for (j = 0; j < *k; ++j) {
                    zcopy_(m, &c[j * *ldc], &c__1, &work[j* *ldwork], &c__1);
                }

/*              W := W * V1' */

                ztrmm_("Right", "Upper", "Conjugate transpose", "Unit", m, k, &c_b15, v, ldv, work, ldwork);
                if (*n > *k) {

/*                 W := W + C2 * V2' */

                    i__1 = *n - *k;
                    zgemm_("No transpose", "Conjugate transpose", m, k, &i__1,
                           &c_b15, &c[*k * *ldc], ldc, &v[*k * *ldv], ldv, &c_b15, work, ldwork);
                }

/*              W := W * T  or  W * T' */

                ztrmm_("Right", "Upper", trans, "Non-unit", m, k, &c_b15, t, ldt, work, ldwork);

/*              C := C - W * V */

                if (*n > *k) {

/*                 C2 := C2 - W * V2 */

                    i__1 = *n - *k;
                    zgemm_("No transpose", "No transpose", m, &i__1, k, &c_b26,
                           work, ldwork, &v[*k * *ldv], ldv, &c_b15, &c[*k * *ldc], ldc);
                }

/*              W := W * V1 */

                ztrmm_("Right", "Upper", "No transpose", "Unit", m, k, &c_b15, v, ldv, work, ldwork);

/*              C1 := C1 - W */

                for (j = 0; j < *k; ++j) {
                    for (i = 0; i < *m; ++i) {
                        i__1 = i + j * *ldc;
                        i__2 = i + j * *ldwork;
                        c[i__1].r -= work[i__2].r, c[i__1].i -= work[i__2].i;
                    }
                }
            }

        } else {

/*           Let  V =  ( V1  V2 )    (V2: last K columns) */
/*           where  V2  is unit lower triangular. */

            if (lsame_(side, "L")) {

/*              Form  H * C  or  H' * C  where  C = ( C1 ) */
/*                                                  ( C2 ) */

/*              W := C' * V'  =  (C1'*V1' + C2'*V2') (stored in WORK) */

/*              W := C2' */

                for (j = 0; j < *k; ++j) {
                    zcopy_(n, &c[*m - *k + j], ldc, &work[j* *ldwork], &c__1);
                    zlacgv_(n, &work[j* *ldwork], &c__1);
                }

/*              W := W * V2' */

                ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", n, k, &c_b15, &v[(*m - *k) * *ldv], ldv, work, ldwork);
                if (*m > *k) {

/*                 W := W + C1'*V1' */

                    i__1 = *m - *k;
                    zgemm_("Conjugate transpose", "Conjugate transpose", n, k,
                           &i__1, &c_b15, c, ldc, v, ldv, &c_b15, work, ldwork);
                }

/*              W := W * T'  or  W * T */

                ztrmm_("Right", "Lower", transt, "Non-unit", n, k, &c_b15, t, ldt, work, ldwork);

/*              C := C - V' * W' */

                if (*m > *k) {

/*                 C1 := C1 - V1' * W' */

                    i__1 = *m - *k;
                    zgemm_("Conjugate transpose", "Conjugate transpose",
                           &i__1, n, k, &c_b26, v, ldv, work, ldwork, &c_b15, c, ldc);
                }

/*              W := W * V2 */

                ztrmm_("Right", "Lower", "No transpose", "Unit", n, k, &c_b15, &v[(*m - *k) * *ldv], ldv, work, ldwork);

/*              C2 := C2 - W' */

                for (j = 0; j < *k; ++j) {
                    for (i = 0; i < *n; ++i) {
                        i__1 = *m - *k + j + i * *ldc;
                        i__2 = i + j * *ldwork;
                        c[i__1].r -= work[i__2].r, c[i__1].i += work[i__2].i;
                    }
                }

            } else if (lsame_(side, "R")) {

/*              Form  C * H  or  C * H'  where  C = ( C1  C2 ) */

/*              W := C * V'  =  (C1*V1' + C2*V2')  (stored in WORK) */

/*              W := C2 */

                for (j = 0; j < *k; ++j) {
                    zcopy_(m, &c[(*n - *k + j) * *ldc], &c__1, &work[j* *ldwork], &c__1);
                }

/*              W := W * V2' */

                ztrmm_("Right", "Lower", "Conjugate transpose", "Unit", m, k, &c_b15, &v[(*n - *k) * *ldv], ldv, work, ldwork);
                if (*n > *k) {

/*                 W := W + C1 * V1' */

                    i__1 = *n - *k;
                    zgemm_("No transpose", "Conjugate transpose", m, k, &i__1,
                           &c_b15, c, ldc, v, ldv, &c_b15, work, ldwork);
                }

/*              W := W * T  or  W * T' */

                ztrmm_("Right", "Lower", trans, "Non-unit", m, k, &c_b15, t, ldt, work, ldwork);

/*              C := C - W * V */

                if (*n > *k) {

/*                 C1 := C1 - W * V1 */

                    i__1 = *n - *k;
                    zgemm_("No transpose", "No transpose", m, &i__1, k,
                           &c_b26, work, ldwork, v, ldv, &c_b15, c, ldc);
                }

/*              W := W * V2 */

                ztrmm_("Right", "Lower", "No transpose", "Unit", m, k, &c_b15, &v[(*n - *k) * *ldv], ldv, work, ldwork);

/*              C1 := C1 - W */

                for (j = 0; j < *k; ++j) {
                    for (i = 0; i < *m; ++i) {
                        i__1 = i + (*n - *k + j) * *ldc;
                        i__2 = i + j * *ldwork;
                        c[i__1].r -= work[i__2].r, c[i__1].i -= work[i__2].i;
                    }
                }
            }
        }
    }
} /* zlarfb_ */

⌨️ 快捷键说明

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