鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

示例

迁移前后,mumps的初始化接口与使用KML适配层的初始化接口不一样,mumps的初始化在传入A矩阵之前,而KML适配层需要在传入A矩阵之后。

迁移前
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include "dmumps_c.h"
int main ( int argc , char**argv ) {
    DMUMPS_STRUC_C id ;
    int n = 2;
    int64_t nnz = 2;
    int irn[] = { 1, 2 }; // MUMPS只支持COO存储格式
    int jcn[] = { 1, 2 };
    double *a = (double *)malloc(2*sizeof(double));
    double *rhs = (double *)malloc(2*sizeof(double));
    //double a[2];
    //double rhs[2];
    double sol[] = {0, 0};
    int myid, ierr;
    ierr = MPI_Init(&argc, &argv);
    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    /*Define A and rhs */ 
    rhs[0] = 1.0;
    rhs[1] = 4.0;
    a[0] = 1.0;
    a[1] = 2.0;
    /*Initialize MUMPS instance.Use MPI COMM WORLD.*/ 
    id.job = JOB_INIT;
    id.par = 1;
    id.sym = 0;
    id.comm_fortran = USE_COMM_WORLD;
    dmumps_c(&id);
    /*Define the problem on the host */ 
    if (myid == 0)
    {
        id.n = n;
        id.nnz = nnz;
        id.irn = irn;
        id.jcn = jcn;
        id.a = a;
        id.rhs = rhs;
    }

#define ICNTL(I) icntl[(I)-1] /*macro s.t.indices match documentation*/ /*No outputs */ 
    id.ICNTL(1) = -1;
    id.ICNTL(2) = -1;
    id.ICNTL(3) = -1;
    id.ICNTL(4) = 0;
    /*Call the MUMPS package.*/ 
    id.job = 6; //Analyze + Factorize + Solve
    dmumps_c(&id);
    id.job = JOB_END;
    dmumps_c(&id);
    /*Terminate instance */ if (myid == 0)
    {
        printf( " Solution is : (%8.2f %8.2f)\n", rhs[0], rhs[1]);
    }
    ierr = MPI_Finalize();
    return 0;
}
迁移后
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include "MUMPS_kp.h"
int main ( int argc , char**argv ) {
    DMUMPS_STRUC_C id ;
    int n = 2;
    int64_t nnz = 2;
    int irn[] = { 1, 2 }; // MUMPS只支持COO存储格式
    int jcn[] = { 1, 2 };
    double *a = (double *)malloc(2*sizeof(double));
    double *rhs = (double *)malloc(2*sizeof(double));
    //double a[2];
    //double rhs[2];
    double sol[] = {0, 0};
    int myid, ierr;
    ierr = MPI_Init(&argc, &argv);
    ierr = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
    /*Define A and rhs */ 
    rhs[0] = 1.0;
    rhs[1] = 4.0;
    a[0] = 1.0;
    a[1] = 2.0;
    /*Initialize MUMPS instance.Use MPI COMM WORLD.*/ 
    id.job = JOB_INIT;
    id.par = 1;
    id.sym = 0;
    id.comm_fortran = USE_COMM_WORLD;   
    if (myid == 0)
    {
        id.n = n;
        id.nnz = nnz;
        id.irn = irn;
        id.jcn = jcn;
        id.a = a;
        id.rhs = rhs;
    }
    dmumps_c(&id); /*Define the problem on the host */ 

#define ICNTL(I) icntl[(I)-1] /*macro s.t.indices match documentation*/ /*No outputs */ 
    id.ICNTL(1) = -1;
    id.ICNTL(2) = -1;
    id.ICNTL(3) = -1;
    id.ICNTL(4) = 0;
    /*Call the MUMPS package.*/ 
    id.job = 6; //Analyze + Factorize + Solve
    dmumps_c(&id);
    id.job = JOB_END;
    dmumps_c(&id);
    /*Terminate instance */ if (myid == 0)
    {
        printf( " Solution is : (%8.2f %8.2f)\n", rhs[0], rhs[1]);
    }
    ierr = MPI_Finalize();
    return 0;
}