c++-mpi的sendrecv函数实现雅可比迭代出错,小弟初学,跪求指教。

问题描述

mpi的sendrecv函数实现雅可比迭代出错,小弟初学,跪求指教。

//一维泊松方程 u(x)=x^3,cpu为四核
#include "stdio.h"
#include "math.h"
#define MPICH_SKIP_MPICXX //没有这句就会出现overriding virtual function differs from 'MPI::的编译错误
#include "mpi.h"//将函数库包含进来
#include
#pragma comment (lib, "mpi.lib")//没有这句就会出现unresolved external symbol _MPI_Finalize的连接错误。
double f(double x)
{double y;
y=6*x;
return y;
}
int main( int argc, char argv[])
{
double l=1;//长度
double w=0,e=1;//左右边界条件
int num=2;//进程数
int n=5;//网格数
double dd=l/n/num;//网格大小
double u[7],u0[7];
double eps=0;
int i,j;
int myid, numprocs, namelen;//定义进程号、进程数、进程名
double startwtime, endwtime;//定义起止时间,为了计算效率
char processor_name[MPI_MAX_PROCESSOR_NAME];//用进程名最长的作为长度
MPI_Init(&argc,&argv);//初始化语句,每个程序都一模一样
MPI_Status status;
startwtime = MPI_Wtime();//得到开始时间
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);//得到进程数
MPI_Comm_rank(MPI_COMM_WORLD,&myid);//得到进程号
MPI_Get_processor_name(processor_name,&namelen);//得到进程名,其实进程名不是必须的
for(j=0;j
u[j]=0;
u[0]=0;
u[n+1]=1;}//初始化
te:
eps=0;
for(j=1;j
u0[j]=u[j];}
//for(j=0;j
//u0[j]=pow(((j-0.5)*dd+myid*n*dd),3);
//u0[j]=u[j];}
int up=myid-1;
if (up
int down=myid+1;
if (down>1){ down=MPI_PROC_NULL;}
//if(myid
//MPI_Recv(&u[n+1],1,MPI_DOUBLE,myid+1,1000,MPI_COMM_WORLD,&status);
//MPI_Send(&u[n],1,MPI_DOUBLE,myid+1,1000,MPI_COMM_WORLD);}
//if (myid>0) {
//MPI_Send(&u[1],1,MPI_DOUBLE,myid-1,1000,MPI_COMM_WORLD);
//MPI_Recv(&u[0],1,MPI_DOUBLE,myid-1,1000,MPI_COMM_WORLD,&status);}
//if(myid>0&&myid<1){
MPI_Sendrecv(&u[1],1,MPI_DOUBLE,down,1000,&u[n+1],1,MPI_DOUBLE,myid,1000,MPI_COMM_WORLD,&status);
MPI_Sendrecv(&u[n],1,MPI_DOUBLE,up,1000,&u[0],1,MPI_DOUBLE,myid,1000,MPI_COMM_WORLD,&status);
for(i=1;i<=n;i++)
{
double t=(i-0.5)*dd+myid*n*dd;
if(i==1){
u[i]=(u[i+1]+2*u[0]-f(t)*dd*dd)/3.0;
continue;}
if(i==(n)){
u[i]=(2*u[n+1]+u[i-1]-f(t)*dd*dd)/3.0;
continue;}
u[i]=(u[i-1]+u[i+1]-f(t)*dd*dd)/2;
}
//if(myid<num-1){u[myid][n+1]=/*u[myid+1][0];}
/(u[myid+1][1]+u[myid][n]-f((myid+1)*n*dd)*dd*dd)/2;
//u[myid+1][0]=u[myid][n+1];}
//if(myid>0){u[myid][0]=/*u[myid-1][n+1];}*/(u[myid][1]+u[myid-1][n+1]-f(myid*n*dd)*dd*dd)/2;
//u[myid-1][n+1]=u[myid][0];}
for(j=1;j
eps=eps+fabs(u0[j]-u[j]);}
if(eps>0.1){goto te;}
endwtime = MPI_Wtime();//得到终止时间
printf("wall clock time = %fn", endwtime-startwtime);//得到墙上时间
MPI_Finalize();//关闭MPI
for(j=1;j<n+1;j++){
printf("u[%d]=%fn",j,u[j]);}
return 0;
}

解决方案

初学者吗?你这又是进程又是动态库的,如果你不是练手玩的可以帮你调一下,不过我可没有mpi.lib的库。看起来也没那么复杂

时间: 2024-11-01 20:17:39

c++-mpi的sendrecv函数实现雅可比迭代出错,小弟初学,跪求指教。的相关文章

PHP自定义函数嵌套使用出错,单独使用不会?

问题描述 PHP自定义函数嵌套使用出错,单独使用不会? 为什么这两个函数单独使用没问题,要是在_html中调用_Clean_String就会出错,并且_Clean_String失效? 比如:$_a是一个数组,<?php print_r(_Clean_String(_html($_a)));?>这样是没问题的,但是如果<?php function _html($_string){ if (is_array($_string)) { foreach ($_string as $_key=&g

mp3-c语言 函数指针编译出错

问题描述 c语言 函数指针编译出错 #ifndef LIBAO_H #define LIBAO_H typedef enum{wav,wim,mp3} io_type_t; typedef struct IOINFO{ io_type_t type; //文件类型编号 char *name; //wav wim,mp3等 char *author; //作者 char *time; //编写时间 char *describe; //模块描述 } io_info_t; typedef struct

为什么malloc函数free时出错

问题描述 为什么malloc函数free时出错 菜鸟求解答 好像是什么越界使用了申请内存,还有为什么指针指向NULL后还是显示错误的指针 代码 #include #include #define NULL 0 using namespace std; int main(void) { int N; cout<<"请输入将要输入的字符串个数"< scanf("%d",&N); char **p=(char **)malloc(sizeof(c

ssrs 2008-SSRS换页 Custom CODE函数取值出错问题

问题描述 SSRS换页 Custom CODE函数取值出错问题 Code是这样写的: Visual Basic code Public Shared Dim Order1Desc as Sting Public Function SetHeadingStr(Byval var1 as String) Order1Desc = Var1 End Function 我在Group的单元格这样写"=Code.SetHeadingStr(Field!EcCo.Value)" 然后再Header

c++ 编程问题-c++ 使用函数对象时出错

问题描述 c++ 使用函数对象时出错 我试图将一些二元操作函数放入一个function table中,但是会编译出错,请教一下大家这是什么问题? #include using namespace std; int add(int a, int b){return a+b;}; int main(){ map binops; binops.insert(make_pair("+",add)); return 0; }

vs2008 调试 类型转换-VS2008使用附加进程的方式调试时,参数传递中转换出错,跪求帮助

问题描述 VS2008使用附加进程的方式调试时,参数传递中转换出错,跪求帮助 OpenStreamEx_Direct( LONG lDevHandle, LONG nChan,, ULONGLONG hWnd, LONG* hPlayHandle) { CLIENTINFO ClientInfo; ClientInfo.lChannel = nChan; ClientInfo.hPlayWnd = (HWND)hWnd; ClientInfo.llLinkMode = 0x80000000; c

thread-C# 回车触发一个打印函数,会卡死,如果打印前sleep(3000)就正常。求指教 。

问题描述 C# 回车触发一个打印函数,会卡死,如果打印前sleep(3000)就正常.求指教 . C# 界面 回车触发一个打印函数,会卡死,如果在打印的函数里,在打印局部方法执行前thread.sleep(3000)就正常. 一定大于等于3秒,2秒也会卡死.但这样打印会很慢,怎样解决.谢谢大家指教下. 解决方案 新开一个线程可以不?触发函数里控制线程就行,把打印函数放在线程里 解决方案二: 打印本身是一个耗时的过程,你应该开线程,把耗时操作放到线程中,这样就不会阻塞主线程,界面就不会卡死了. 解

eclispe android-eclipse第一次创建android工程出错,请大神指教

问题描述 eclipse第一次创建android工程出错,请大神指教 解决方案 工程make编译一下看看,有些出现红色的X是因为没有编译. 解决方案二: 看下环境配置是否正确.新建项目就出错一般是环境的问题 解决方案三: 不知道你的adt是不是自己装的,我之前也遇过,后来用google已集成的adt就没事了,要我可以发给你

回调函数-小弟做了一个方法,执行完毕还会再进入方法一次,求指教下原因

问题描述 小弟做了一个方法,执行完毕还会再进入方法一次,求指教下原因 小弟把代码贴到了下面,我要迭代的替换字符串中的内容,替换完毕后,方法执行到 return sb.toString(); 应该是结束了,可是我的代码在运行的时候执行了return sb.toString(); 以后又进来执行一次,分析不出来原因,还请大家赐教,不胜感激: private String parseToCk(String str) { String s1 = str.trim(); /** s1截取字符串开始部分*/