int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt size; PetscInt n = 9,bs = 3,indices[2],i; PetscScalar values[6]; Vec x; ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size != 1) SETERRQ(PETSC_COMM_SELF,1,"Must be run with one processor"); /* create vector */ ierr = VecCreate(PETSC_COMM_SELF,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,n,n);CHKERRQ(ierr); ierr = VecSetBlockSize(x,bs);CHKERRQ(ierr); ierr = VecSetType(x,VECSEQ);CHKERRQ(ierr); for (i=0; i<6; i++) values[i] = 4.0*i; indices[0] = 0; indices[1] = 2; ierr = VecSetValuesBlocked(x,2,indices,values,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); /* Resulting vector should be 0 4 8 0 0 0 12 16 20 */ ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* test insertion with negative indices */ ierr = VecSetOption(x,VEC_IGNORE_NEGATIVE_INDICES,PETSC_TRUE);CHKERRQ(ierr); for (i=0; i<6; i++) values[i] = -4.0*i; indices[0] = -1; indices[1] = 2; ierr = VecSetValuesBlocked(x,2,indices,values,ADD_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); /* Resulting vector should be 0 4 8 0 0 0 0 0 0 */ ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(&x);CHKERRQ(ierr); ierr = PetscFinalize(); return ierr; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt size; PetscInt n = 9,bs = 3,indices[2],i; PetscScalar values[6]; Vec x; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); if (size != 1) SETERRQ(1,"Must be run with one processor"); /* create vector */ ierr = VecCreateSeq(PETSC_COMM_SELF,n,&x);CHKERRQ(ierr); ierr = VecSetBlockSize(x,bs);CHKERRQ(ierr); for (i=0; i<6; i++) values[i] = 4.0*i; indices[0] = 0; indices[1] = 2; ierr = VecSetValuesBlocked(x,2,indices,values,INSERT_VALUES);CHKERRQ(ierr); ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); /* Resulting vector should be 0 4 8 0 0 0 12 16 20 */ ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(x);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
int main(int argc,char **argv) { PetscErrorCode ierr; PetscMPIInt size; PetscInt i,j,n = 50,bs; PetscScalar val,*vals,zero=0.0; Vec x; ierr = PetscInitialize(&argc,&argv,(char*)0,help);CHKERRQ(ierr); ierr = MPI_Comm_size(PETSC_COMM_WORLD,&size);CHKERRQ(ierr); bs = size; ierr = PetscOptionsGetInt(PETSC_NULL,"-n",&n,PETSC_NULL);CHKERRQ(ierr); ierr = VecCreate(PETSC_COMM_WORLD,&x);CHKERRQ(ierr); ierr = VecSetSizes(x,PETSC_DECIDE,n*bs);CHKERRQ(ierr); ierr = VecSetBlockSize(x,bs);CHKERRQ(ierr); ierr = VecSetFromOptions(x);CHKERRQ(ierr); for (i=0; i<n*bs; i++) { val = i*1.0; ierr = VecSetValues(x,1,&i,&val,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); /* Now do the blocksetvalues */ ierr = VecSet(x,zero);CHKERRQ(ierr); ierr = PetscMalloc(bs*sizeof(PetscScalar),&vals);CHKERRQ(ierr); for (i=0; i<n; i++) { for (j=0; j<bs; j++) { vals[j] = (i*bs+j)*1.0; } ierr = VecSetValuesBlocked(x,1,&i,vals,INSERT_VALUES);CHKERRQ(ierr); } ierr = VecAssemblyBegin(x);CHKERRQ(ierr); ierr = VecAssemblyEnd(x);CHKERRQ(ierr); ierr = VecView(x,PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr); ierr = VecDestroy(x);CHKERRQ(ierr); ierr = PetscFree(vals);CHKERRQ(ierr); ierr = PetscFinalize();CHKERRQ(ierr); return 0; }
PetscErrorCode AssembleSystem(Mat A, Vec b, PetscScalar soft_alpha, PetscScalar x_r, PetscScalar y_r, PetscScalar z_r, PetscScalar r, PetscInt ne, PetscMPIInt npe, PetscMPIInt rank, PetscInt nn, PetscInt m) { PetscErrorCode ierr; PetscReal h = 1.0 / ne; PetscScalar DD[24][24], DD2[24][24]; PetscScalar DD1[24][24]; const PetscInt NP = (PetscInt)(PetscPowReal((PetscReal)npe, 1.0 / 3.0) + 0.5); const PetscInt ipx = rank % NP, ipy = (rank % (NP * NP)) / NP, ipz = rank / (NP * NP); const PetscInt Ni0 = ipx * (nn / NP), Nj0 = ipy * (nn / NP), Nk0 = ipz * (nn / NP); const PetscInt Ni1 = Ni0 + (m > 0 ? (nn / NP) : 0), Nj1 = Nj0 + (nn / NP), Nk1 = Nk0 + (nn / NP); const PetscInt NN = nn / NP, id0 = ipz * nn * nn * NN + ipy * nn * NN * NN + ipx * NN * NN * NN; PetscScalar vv[24], v2[24]; PetscInt i, j, k; { ierr = elem_3d_elast_v_25((PetscScalar*)DD1); CHKERRQ(ierr); for (i = 0; i < 24; i++) { for (j = 0; j < 24; j++) { if (i < 12 || j < 12) { if (i == j) DD2[i][j] = 0.1 * DD1[i][j]; else DD2[i][j] = 0.0; } else DD2[i][j] = DD1[i][j]; } } for (i = 0; i < 24; i++) { if (i % 3 == 0) vv[i] = h * h; else if (i % 3 == 1) vv[i] = 2.0 * h * h; else vv[i] = 0.0; } for (i = 0; i < 24; i++) { if (i % 3 == 0 && i >= 12) v2[i] = h * h; else if (i % 3 == 1 && i >= 12) v2[i] = 2.0 * h * h; else v2[i] = 0.0; } } ierr = MatZeroEntries(A); CHKERRQ(ierr); ierr = VecZeroEntries(b); CHKERRQ(ierr); PetscInt ii, jj, kk; for (i = Ni0, ii = 0; i < Ni1; i++, ii++) { for (j = Nj0, jj = 0; j < Nj1; j++, jj++) { for (k = Nk0, kk = 0; k < Nk1; k++, kk++) { PetscReal x = h * (PetscReal)i; PetscReal y = h * (PetscReal)j; PetscReal z = h * (PetscReal)k; PetscInt id = id0 + ii + NN * jj + NN * NN * kk; if (i < ne && j < ne && k < ne) { PetscReal radius = PetscSqrtReal((x - 0.5 + h / 2) * (x - 0.5 + h / 2) + (y - 0.5 + h / 2) * (y - 0.5 + h / 2) + (z - 0.5 + h / 2) * (z - 0.5 + h / 2)); PetscReal alpha = 1.0; PetscInt jx, ix, idx[8]; idx[0] = id; idx[1] = id + 1; idx[2] = id + NN + 1; idx[3] = id + NN; idx[4] = id + NN * NN; idx[5] = id + 1 + NN * NN; idx[6] = id + NN + 1 + NN * NN; idx[7] = id + NN + NN * NN; if (i == Ni1 - 1 && Ni1 != nn) { idx[1] += NN * (NN * NN - 1); idx[2] += NN * (NN * NN - 1); idx[5] += NN * (NN * NN - 1); idx[6] += NN * (NN * NN - 1); } if (j == Nj1 - 1 && Nj1 != nn) { idx[2] += NN * NN * (nn - 1); idx[3] += NN * NN * (nn - 1); idx[6] += NN * NN * (nn - 1); idx[7] += NN * NN * (nn - 1); } if (k == Nk1 - 1 && Nk1 != nn) { idx[4] += NN * (nn * nn - NN * NN); idx[5] += NN * (nn * nn - NN * NN); idx[6] += NN * (nn * nn - NN * NN); idx[7] += NN * (nn * nn - NN * NN); } if (radius < r) alpha = soft_alpha; for (ix = 0; ix < 24; ix++) { for (jx = 0; jx < 24; jx++) DD[ix][jx] = alpha * DD1[ix][jx]; } if (k > 0) { ierr = MatSetValuesBlocked(A, 8, idx, 8, idx, (const PetscScalar*)DD, ADD_VALUES); CHKERRQ(ierr); ierr = VecSetValuesBlocked(b, 8, idx, (const PetscScalar*)vv, ADD_VALUES); CHKERRQ(ierr); } else { for (ix = 0; ix < 24; ix++) { for (jx = 0; jx < 24; jx++) DD[ix][jx] = alpha * DD2[ix][jx]; } ierr = MatSetValuesBlocked(A, 8, idx, 8, idx, (const PetscScalar*)DD, ADD_VALUES); CHKERRQ(ierr); ierr = VecSetValuesBlocked(b, 8, idx, (const PetscScalar*)v2, ADD_VALUES); CHKERRQ(ierr); } } } } } ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = VecAssemblyBegin(b); CHKERRQ(ierr); ierr = VecAssemblyEnd(b); CHKERRQ(ierr); PetscFunctionReturn(0); }