示例#1
0
static void
do_test(MAP *rmap, MAP *cmap)
{
    MAT *A;
    VEC *x, *y;
    INT i, j, m0, n0;
    INT *cols = phgAlloc(cmap->nglobal * sizeof(*cols));
    FLOAT *data = phgAlloc(cmap->nglobal * sizeof(*data));

    A = phgMapCreateMat(rmap, cmap);
    m0 = A->rmap->partition[A->rmap->rank];
    n0 = A->cmap->partition[A->cmap->rank];

    /* Matrix entries: A(I,J) = 1 + (I-1) + (J-1) */
    for (i = m0; i < m0 + A->rmap->nlocal; i++) {
#if 0
	/* Test MatAddEntry */
	for (j = 0; j < A->cmap->nglobal; j++)
	    phgMatAddGlobalEntry(A, i, j, 1.0 + i + j);
#else
	/* Test MatAddEntries */
	for (j = 0; j < A->cmap->nglobal; j++) {
	    cols[j] = j;
	    data[j] = 1.0 + i + j;
	}
	phgMatAddGlobalEntries(A, 1, &i, A->cmap->nglobal, cols, data);
#endif
    }
    phgFree(cols);
    phgFree(data);
    phgMatAssemble(A);

    phgInfo(-1, "y = A * x\n");
    x = phgMapCreateVec(A->cmap, 1);
    for (i = 0; i < x->map->nlocal; i++)
	x->data[i] = 1.0 + i + n0;
    phgVecAssemble(x);
    y = phgMatVec(MAT_OP_N, 1.0, A, x, 0.0, NULL);
    for (i = 0; i < y->map->nlocal; i++)
	phgInfo(-1, "    y->data[%d] = %lg\n", i + m0, (double)y->data[i]);
    phgVecDestroy(&x);
    phgVecDestroy(&y);

    phgInfo(-1, "y = A' * x\n");
    x = phgMapCreateVec(A->rmap, 1);
    for (i = 0; i < x->map->nlocal; i++)
	x->data[i] = 1.0 + i + m0;
    phgVecAssemble(x);
    y = phgMatVec(MAT_OP_T, 1.0, A, x, 0.0, NULL);
    for (i = 0; i < y->map->nlocal; i++)
	phgInfo(-1, "    y->data[%d] = %lg\n", i + n0, (double)y->data[i]);
    phgVecDestroy(&x);
    phgVecDestroy(&y);

    phgMatDestroy(&A);
}
示例#2
0
int
main(int argc, char *argv[])
{
    GRID *g;
    MAP *map, *map0;
    INT n = 4;
    DOF *u;
    static INT pre_refines = 0;
    static char *fn = "../test/cube.dat";
    /*static char *fn = "../albert-files/cube5.dat";*/

    phgOptionsPreset("-dof_type P1");
    phgOptionsRegisterInt("-pre_refines", "Pre-refinements", &pre_refines);
    phgInit(&argc, &argv);
    g = phgNewGrid(-1);
    if (!phgImport(g, fn, FALSE))
	phgError(1, "can't read file \"%s\".\n", fn);
    phgRefineAllElements(g, pre_refines);
    phgPartitionGrid(g);

    u = phgDofNew(g, DOF_DEFAULT, 1, "u", DofNoAction);
    map0 = phgMapCreate(u, NULL);

    phgInfo(-1, "\n");
    phgInfo(-1, "Test special map with size = 0 on all but one process:\n");
    map = phgMapCreateSimpleMap(g->comm, g->rank == g->nprocs - 1 ? n : 0, n);
    phgInfo(-1, "---- DOF rows, special columns:\n");
    do_test(map0, map);
    phgInfo(-1, "---- Special rows, DOF columns:\n");
    do_test(map, map0);
    phgInfo(-1, "---- Special rows, special columns:\n");
    do_test(map, map);
    phgMapDestroy(&map);

    phgInfo(-1, "\n");
    phgInfo(-1, "Test serial map:\n");
    map = phgMapCreateSimpleMap(g->comm, n, n);
    phgInfo(-1, "---- DOF rows, serial columns:\n");
    do_test(map0, map);
    phgInfo(-1, "---- serial rows, DOF columns:\n");
    do_test(map, map0);
    phgInfo(-1, "---- Serial rows, serial columns:\n");
    do_test(map, map);
    phgMapDestroy(&map);

    phgMapDestroy(&map0);
    phgDofFree(&u);
    phgFreeGrid(&g);
    phgFinalize();

    return 0;
}
示例#3
0
static void 
getBdryTypes(MovingMesh *mmesh) 
{
    GRID *g = _m->g;
    SIMPLEX *e;
    FILE *fp;
    char token[1024]; 
    int i, n, s;
    int max_bdry_type = sizeof(BTYPE) * 8;
    
    Unused(s);
    Unused(e);
    Unused(g);

    /* Read in boundary faces info from file */
    fp = fopen(_mp->fn_bdry, "r");

    /* Header */
    if (!get_token(fp, token) || strcasecmp(token, "BoundaryFaces")) 
	READ_ERROR;

    if (!get_token(fp, token))
	READ_ERROR;
    n = atoi(token);
    phgInfo(2, "number of bdry faces: %d\n", n);
    _mb->move_bdry_mask = 0;
    _mb->n_bdry = max_bdry_type;
    _mb->normal = phgCalloc(max_bdry_type * Dim, sizeof(*_mb->normal));
    _mb->b = phgCalloc(max_bdry_type, sizeof(*_mb->b));
    
    /* Read in noraml and projection */
    for (i = 0; i < n; i++) {
	int type;
	READ_NUMBER;
	type = atoi(token) - 1;
	if (!get_token(fp, token))
	    READ_ERROR;
	_mb->normal[type*Dim + 0] = atof(token);
	if (!get_token(fp, token))
	    READ_ERROR;
	_mb->normal[type*Dim + 1] = atof(token);
	if (!get_token(fp, token))
	    READ_ERROR;
	_mb->normal[type*Dim + 2] = atof(token);
	if (!get_token(fp, token))
	    READ_ERROR;
	_mb->b[type] = atof(token);
	_mb->move_bdry_mask |= btype_values[type];
    }

    /* End of read */
    if (!get_token(fp, token) || strcasecmp(token, "End"))
	READ_ERROR;
    fclose(fp);

    return;
}