📄 symamgsavediag.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <lapack.h>#include <ilupack.h>#include <ilupackmacros.h>double SYMAMGSAVEDIAG(size_t *Fparam, integer *n, integer *ia, integer *ja, FLOAT *a){ integer i,j,k,ki; REALS val,ti,tmp; REALS *disc; ILUPACKPARAM *IPparam; IPparam=(ILUPACKPARAM *)MALLOC((size_t)1*sizeof(ILUPACKPARAM),"ilupackfactor:param"); memcpy(Fparam, &IPparam, sizeof(size_t)); IPparam->diag=(FLOAT *)MALLOC(*n*sizeof(FLOAT),"symamgsavediag:IPparam->diag"); disc=(REALS *)MALLOC(*n*sizeof(REALS),"symamgsavediag:disc"); for (i=0; i<*n; i++) disc[i]=IPparam->diag[i]=0.0; ki=1; for (i=0; i<*n; i++) { for (j=ia[i]; j<ia[i+1]; j++) { k=ja[j-1]-1; if (k==i) { IPparam->diag[i]=a[j-1]; if (i==0) ti=a[j-1]; else { if (a[j-1] < ti) ti=a[j-1]; ki=i; } } else { val=FABS(a[j-1]); disc[i]+=val; // remember that only the upper triangular part is stored disc[k]+=val; } } } val=ti-disc[ki]; for (i=1; i<*n; i++) { tmp=IPparam->diag[i]-disc[i]; if (tmp<val) { if (IPparam->diag[i]-ti < disc[ki]) val=tmp; } } free(disc); return (val);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -