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

📄 precond.c

📁 OpenFVM-v1.1 open source cfd code
💻 C
字号:
/****************************************************************************//*                                precond.c                                 *//****************************************************************************//*                                                                          *//* PRECONDitioners for iterative solvers of systems of linear equations     *//*                                                                          *//* Copyright (C) 1992-1996 Tomas Skalicky. All rights reserved.             *//*                                                                          *//****************************************************************************//*                                                                          *//*        ANY USE OF THIS CODE CONSTITUTES ACCEPTANCE OF THE TERMS          *//*              OF THE COPYRIGHT NOTICE (SEE FILE COPYRGHT.H)               *//*                                                                          *//****************************************************************************/#include <math.h>#include "precond.h"#include "errhandl.h"#include "qmatrix.h"#include "operats.h"#include "factor.h"#include "itersolv.h"#include "copyrght.h"Vector *JacobiPrecond(QMatrix *A, Vector *y, Vector *c, double Omega)/* Jacobi preconditioner */{    Q_Lock(A);    V_Lock(y);    V_Lock(c);    /*     *  Diag(A) / Omega y = c     *     *  y = Omega Diag(A)^(-1) c     */         Asgn_VV(y, Mul_SV(Omega, MulInv_QV(Diag_Q(A), c)));    Q_Unlock(A);    V_Unlock(y);    V_Unlock(c);    return(y);}Vector *SSORPrecond(QMatrix *A, Vector *y, Vector *c, double Omega)/* SSOR preconditioner */{    Q_Lock(A);    V_Lock(y);    V_Lock(c);        /*     *  1 / (2 - Omega) * (Diag(A) / Omega + Lower(A)) * (Diag(A) / Omega)^(-1)     *      * (Diag(A) / Omega + Upper(A)) y = c     *     *  y = (2 - Omega) / Omega * (Diag(A) / Omega + Upper(A))^(-1) * Diag(A)     *          * (Diag(A) / Omega + Lower(A))^(-1) c     */    Asgn_VV(y, Mul_SV((2.0 - Omega) / Omega,        MulInv_QV(Add_QQ(Mul_SQ(1.0 / Omega, Diag_Q(A)), Upper_Q(A)),        Mul_QV(Diag_Q(A),        MulInv_QV(Add_QQ(Mul_SQ(1.0 / Omega, Diag_Q(A)), Lower_Q(A)), c)))));    Q_Unlock(A);    V_Unlock(y);    V_Unlock(c);    return(y);}Vector *ILUPrecond(QMatrix *A, Vector *y, Vector *c, double Omega)/* incomplete factorization preconditioner */{    Q_Lock(A);    V_Lock(y);    V_Lock(c);        /*     *  if Q symmetric with rowwise stored elements     *     *    (Diag(C) + Upper(C)) * Diag(C)^(-1) * (Diag(C) + Lower(C)) y = c     *    y = (Diag(C) + Upper(C))^(-1) * Diag(C) * (Diag(C) + Lower(C))^(-1) c     *     *  otherwise     *     *    (Diag(B) + Lower(B)) * Diag(B)^(-1) * (Diag(B) + Upper(B)) y = c     *    y = (Diag(B) + Upper(B))^(-1) * Diag(B) * (Diag(B) + Lower(B))^(-1) c     *     *  B denotes the incomplete factorized matrix A     */    if (Q_GetSymmetry(A) && Q_GetElOrder(A) == Rowws)        Asgn_VV(y, MulInv_QV(Add_QQ(Diag_Q(ILUFactor(A)), Lower_Q(ILUFactor(A))),             Mul_QV(Diag_Q(ILUFactor(A)),            MulInv_QV(Add_QQ(Diag_Q(ILUFactor(A)), Upper_Q(ILUFactor(A))), c))));    else        Asgn_VV(y, MulInv_QV(Add_QQ(Diag_Q(ILUFactor(A)), Upper_Q(ILUFactor(A))),             Mul_QV(Diag_Q(ILUFactor(A)),            MulInv_QV(Add_QQ(Diag_Q(ILUFactor(A)), Lower_Q(ILUFactor(A))), c))));    Q_Unlock(A);    V_Unlock(y);    V_Unlock(c);    return(y);}

⌨️ 快捷键说明

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