static PetscErrorCode CheckPoints(const char *name,PetscInt npoints,const PetscReal *points,PetscInt ndegrees,const PetscInt *degrees) { PetscErrorCode ierr; PetscReal *B,*D,*D2; PetscInt i,j; PetscFunctionBegin; ierr = PetscMalloc3(npoints*ndegrees,&B,npoints*ndegrees,&D,npoints*ndegrees,&D2);CHKERRQ(ierr); ierr = PetscDTLegendreEval(npoints,points,ndegrees,degrees,B,D,D2);CHKERRQ(ierr); ierr = PetscPrintf(PETSC_COMM_WORLD,"%s\n",name);CHKERRQ(ierr); for (i=0; i<npoints; i++) { for (j=0; j<ndegrees; j++) { ierr = PetscPrintf(PETSC_COMM_WORLD,"degree %D at %12.4g: B=%12.4g D=%12.4g D2=%12.4g\n",degrees[j],(double)points[i],(double)B[i*ndegrees+j],(double)D[i*ndegrees+j],(double)D2[i*ndegrees+j]);CHKERRQ(ierr); } } ierr = PetscFree3(B,D,D2);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* Computes integral of L_p' over intervals {(x0,x1),(x1,x2),...} */ static PetscErrorCode PetscDTLegendreIntegrate(PetscInt ninterval,const PetscReal *x,PetscInt ndegree,const PetscInt *degrees,PetscBool Transpose,PetscReal *B) { PetscErrorCode ierr; PetscReal *Bv; PetscInt i,j; PetscFunctionBegin; ierr = PetscMalloc((ninterval+1)*ndegree*sizeof(PetscReal),&Bv);CHKERRQ(ierr); /* Point evaluation of L_p on all the source vertices */ ierr = PetscDTLegendreEval(ninterval+1,x,ndegree,degrees,Bv,NULL,NULL);CHKERRQ(ierr); /* Integral over each interval: \int_a^b L_p' = L_p(b)-L_p(a) */ for (i=0; i<ninterval; i++) { for (j=0; j<ndegree; j++) { if (Transpose) B[i+ninterval*j] = Bv[(i+1)*ndegree+j] - Bv[i*ndegree+j]; else B[i*ndegree+j] = Bv[(i+1)*ndegree+j] - Bv[i*ndegree+j]; } } ierr = PetscFree(Bv);CHKERRQ(ierr); PetscFunctionReturn(0); }