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

📄 subarray_support.c

📁 fortran并行计算包
💻 C
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//*  * *   Copyright (C) 1997 University of Chicago.  *   See COPYRIGHT notice in top-level directory. * * Note: This code originally appeared in ROMIO. */#include "dataloop.h"int PREPEND_PREFIX(Type_convert_subarray)(int ndims,					  int *array_of_sizes, 					  int *array_of_subsizes,					  int *array_of_starts,					  int order,					  MPI_Datatype oldtype, 					  MPI_Datatype *newtype){    MPI_Aint extent, disps[3], size;    int i, blklens[3];    MPI_Datatype tmp1, tmp2, types[3];    PMPI_Type_extent(oldtype, &extent);    if (order == MPI_ORDER_FORTRAN) {	/* dimension 0 changes fastest */	if (ndims == 1) {	    PMPI_Type_contiguous(array_of_subsizes[0], oldtype, &tmp1);	}	else {	    PMPI_Type_vector(array_of_subsizes[1],			     array_of_subsizes[0],			     array_of_sizes[0], oldtype, &tmp1);	    	    size = array_of_sizes[0]*extent;	    for (i=2; i<ndims; i++) {		size *= array_of_sizes[i-1];		PMPI_Type_hvector(array_of_subsizes[i], 1, size, tmp1, &tmp2);		PMPI_Type_free(&tmp1);		tmp1 = tmp2;	    }	}		/* add displacement and UB */	disps[1] = array_of_starts[0];	size = 1;	for (i=1; i<ndims; i++) {	    size *= array_of_sizes[i-1];	    disps[1] += size*array_of_starts[i];	}          /* rest done below for both Fortran and C order */    }    else /* order == MPI_ORDER_C */ {	/* dimension ndims-1 changes fastest */	if (ndims == 1) {	    PMPI_Type_contiguous(array_of_subsizes[0], oldtype, &tmp1);	}	else {	    PMPI_Type_vector(array_of_subsizes[ndims-2],			     array_of_subsizes[ndims-1],			     array_of_sizes[ndims-1], oldtype, &tmp1);	    	    size = array_of_sizes[ndims-1]*extent;	    for (i=ndims-3; i>=0; i--) {		size *= array_of_sizes[i+1];		PMPI_Type_hvector(array_of_subsizes[i], 1, size, tmp1, &tmp2);		PMPI_Type_free(&tmp1);		tmp1 = tmp2;	    }	}		/* add displacement and UB */	disps[1] = array_of_starts[ndims-1];	size = 1;	for (i=ndims-2; i>=0; i--) {	    size *= array_of_sizes[i+1];	    disps[1] += size*array_of_starts[i];	}    }        disps[1] *= extent;        disps[2] = extent;    for (i=0; i<ndims; i++) disps[2] *= array_of_sizes[i];        disps[0] = 0;    blklens[0] = blklens[1] = blklens[2] = 1;    types[0] = MPI_LB;    types[1] = tmp1;    types[2] = MPI_UB;        PMPI_Type_struct(3, blklens, disps, types, newtype);    PMPI_Type_free(&tmp1);    return MPI_SUCCESS;}

⌨️ 快捷键说明

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