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); }
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; }
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; }