[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#985228: unblock: petsc/3.14.5+dfsg1-2



On 2021-03-16 17:32, Ivo De Decker wrote:
Control: tags -1 moreinfo
...
On Sun, Mar 14, 2021 at 09:01:26PM +0100, Drew Parsons wrote:
upstream released petsc 3.14.5 with bug fixes only.
This will help improve the stability of the package over the lifetime
of the bullseye release.

I'm not convinced this complies with the freeze policy (but see below).

...
  [ ] attach debdiff against the package in testing

We ask these this for a reason. The current diff between the version in
testing and unstable is very large and unreviewable. It certainly isn't going to get unblocked like this. If you can provide a filtered diff, with only the 'real' changes, and not the noise generated by the new upstream release,
there's at least a chance we could look at them. Note that this doesn't
guarantee it will be unblocked. There's still a decent chance that the changes
will be too big.


Hi Ivo, I'm attaching the essential debdiff, omitting changes to docs, TAGS and html files and trivial whitespace reformatting. I also omitted the diff to src/ts/trajectory/impls/memory/trajmemory.c, involving the conditional "#if defined(PETSC_HAVE_REVOLVE)", since we do not build against revolve.

My argument is that this patch makes petsc and therefore bullseye a little more robust.

Drew
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/debian/changelog petsc-3.14.5+dfsg1/debian/changelog
--- petsc-3.14.4+dfsg1/debian/changelog	2021-02-11 16:51:02.000000000 +0100
+++ petsc-3.14.5+dfsg1/debian/changelog	2021-03-10 12:21:59.000000000 +0100
@@ -1,3 +1,22 @@
+petsc (3.14.5+dfsg1-2) unstable; urgency=medium
+
+  * upload new bugfix release to unstable
+
+ -- Drew Parsons <dparsons@debian.org>  Wed, 10 Mar 2021 12:21:59 +0100
+
+petsc (3.14.5+dfsg1-1) experimental; urgency=medium
+
+  * New upstream release (bugfixes)
+
+ -- Drew Parsons <dparsons@debian.org>  Mon, 08 Mar 2021 18:37:39 +0100
+
+petsc (3.14.4+dfsg1-2) unstable; urgency=medium
+
+  * fix PETSC64_NAME in libpetsc64-complex3.14-dev.prerm to enable a
+    clean uninstall of libpetsc64-complex3.14-dev. Closes: #983892.
+
+ -- Drew Parsons <dparsons@debian.org>  Mon, 08 Mar 2021 18:27:40 +0100
+
 petsc (3.14.4+dfsg1-1) unstable; urgency=medium
 
   * New upstream release.
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/debian/libpetsc64-complex3.14-dev.prerm petsc-3.14.5+dfsg1/debian/libpetsc64-complex3.14-dev.prerm
--- petsc-3.14.4+dfsg1/debian/libpetsc64-complex3.14-dev.prerm	2021-02-11 16:51:02.000000000 +0100
+++ petsc-3.14.5+dfsg1/debian/libpetsc64-complex3.14-dev.prerm	2021-03-10 12:21:59.000000000 +0100
@@ -8,7 +8,7 @@
 PETSC_ARCH=${DEB_HOST_MULTIARCH}
 PETSC_COMPLEX_ARCH=${PETSC_ARCH}-complex
 PETSC_SONAME_VERSION=__PETSC_SONAME_VERSION__
-PETSC64_NAME=petsc${PETSC_SONAME_VERSION}
+PETSC64_NAME=petsc64-${PETSC_SONAME_VERSION}
 
 PETSC64_DIR_COMPLEX=/usr/lib/petscdir/${PETSC64_NAME}/${PETSC_COMPLEX_ARCH}
 
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/include/petsc/private/petschpddm.h petsc-3.14.5+dfsg1/include/petsc/private/petschpddm.h
--- petsc-3.14.4+dfsg1/include/petsc/private/petschpddm.h	2020-11-03 19:01:59.000000000 +0100
+++ petsc-3.14.5+dfsg1/include/petsc/private/petschpddm.h	2021-03-03 23:13:43.000000000 +0100
@@ -31,6 +31,7 @@
   PC_HPDDM_Level              **levels;   /* array of shells */
   Mat                         aux;        /* local auxiliary matrix defined at the finest level on PETSC_COMM_SELF */
   Mat                         B;          /* right-hand side matrix defined at the finest level on PETSC_COMM_SELF */
+  Vec                         normal;     /* temporary Vec when preconditioning the normal equations with KSPLSQR */
   IS                          is;         /* global numbering of the auxiliary matrix */
   PetscInt                    N;          /* number of levels */
   PCHPDDMCoarseCorrectionType correction; /* type of coarse correction */
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/dm/dt/fe/interface/ftn-custom/zfef.c petsc-3.14.5+dfsg1/src/dm/dt/fe/interface/ftn-custom/zfef.c
--- petsc-3.14.4+dfsg1/src/dm/dt/fe/interface/ftn-custom/zfef.c	2020-11-03 19:01:59.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/dm/dt/fe/interface/ftn-custom/zfef.c	2021-03-03 23:09:50.000000000 +0100
@@ -17,6 +17,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscSpaceViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
@@ -26,6 +27,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscDualSpaceViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
@@ -35,6 +37,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscFEViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/dm/dt/fv/interface/ftn-custom/zfvf.c petsc-3.14.5+dfsg1/src/dm/dt/fv/interface/ftn-custom/zfvf.c
--- petsc-3.14.4+dfsg1/src/dm/dt/fv/interface/ftn-custom/zfvf.c	2020-11-03 19:01:59.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/dm/dt/fv/interface/ftn-custom/zfvf.c	2021-03-03 23:13:43.000000000 +0100
@@ -15,6 +15,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscLimiterViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
@@ -24,6 +25,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscFVViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/dm/dt/interface/ftn-custom/zdsf.c petsc-3.14.5+dfsg1/src/dm/dt/interface/ftn-custom/zdsf.c
--- petsc-3.14.4+dfsg1/src/dm/dt/interface/ftn-custom/zdsf.c	2020-11-03 19:01:59.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/dm/dt/interface/ftn-custom/zdsf.c	2021-03-03 23:13:43.000000000 +0100
@@ -13,6 +13,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscDSViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/dm/impls/plex/plexvtu.c petsc-3.14.5+dfsg1/src/dm/impls/plex/plexvtu.c
--- petsc-3.14.4+dfsg1/src/dm/impls/plex/plexvtu.c	2020-11-03 19:01:59.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/dm/impls/plex/plexvtu.c	2021-03-03 23:13:43.000000000 +0100
@@ -23,16 +23,13 @@
 #define MPIU_VTUREAL MPIU_REAL
 #endif
 
-static PetscErrorCode TransferWrite(PetscViewer viewer,FILE *fp,PetscMPIInt srank,PetscMPIInt root,const void *send,void *recv,PetscMPIInt count,MPI_Datatype mpidatatype,PetscMPIInt tag)
+static PetscErrorCode TransferWrite(MPI_Comm comm, PetscViewer viewer,FILE *fp,PetscMPIInt srank,PetscMPIInt root,const void *send,void *recv,PetscMPIInt count,MPI_Datatype mpidatatype,PetscMPIInt tag)
 {
   PetscMPIInt    rank;
   PetscErrorCode ierr;
-  MPI_Comm       comm;
 
   PetscFunctionBegin;
-  ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
-
   if (rank == srank && rank != root) {
     ierr = MPI_Send((void*)send,count,mpidatatype,root,tag,comm);CHKERRQ(ierr);
   } else if (rank == root) {
@@ -155,7 +152,7 @@
 #endif
   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
-  tag  = ((PetscObject)viewer)->tag;
+  ierr = PetscCommGetNewTag(comm,&tag);CHKERRQ(ierr);
 
   ierr = PetscFOpen(comm,vtk->filename,"wb",&fp);CHKERRQ(ierr);
   ierr = PetscFPrintf(comm,fp,"<?xml version=\"1.0\"?>\n");CHKERRQ(ierr);
@@ -238,10 +235,10 @@
       boffset += gpiece[r].ncells*sizeof(int) + sizeof(int);
       /* all the vectors */
       for (link=vtk->link; link; link=link->next) {
-        Vec        X = (Vec)link->vec;
-        DM         dmX = NULL;
-        PetscInt   bs,nfields,field;
-        const char *vecname = "";
+        Vec          X = (Vec)link->vec;
+        DM           dmX = NULL;
+        PetscInt     bs = 1,nfields,field;
+        const char   *vecname = "";
         PetscSection section;
         if ((link->ft != PETSC_VTK_CELL_FIELD) && (link->ft != PETSC_VTK_CELL_VECTOR_FIELD)) continue;
         if (((PetscObject)X)->name || link != vtk->link) { /* If the object is already named, use it. If it is past the first link, name it to disambiguate. */
@@ -251,7 +248,7 @@
         if (!dmX) dmX = dm;
         ierr = PetscObjectQuery(link->vec, "section", (PetscObject*) &section);CHKERRQ(ierr);
         if (!section) {ierr = DMGetLocalSection(dmX, &section);CHKERRQ(ierr);}
-        ierr = PetscSectionGetDof(section,cStart,&bs);CHKERRQ(ierr);
+        if (cEnd > cStart) { ierr = PetscSectionGetDof(section,cStart,&bs);CHKERRQ(ierr); }
         ierr = PetscSectionGetNumFields(section,&nfields);CHKERRQ(ierr);
         field = 0;
         if (link->field >= 0) {
@@ -340,10 +337,10 @@
        */
       ierr = PetscFPrintf(PETSC_COMM_SELF,fp,"      <PointData>\n");CHKERRQ(ierr);
       for (link=vtk->link; link; link=link->next) {
-        Vec        X = (Vec)link->vec;
-        DM         dmX;
-        PetscInt   bs,nfields,field;
-        const char *vecname = "";
+        Vec          X = (Vec)link->vec;
+        DM           dmX;
+        PetscInt     bs = 1,nfields,field;
+        const char   *vecname = "";
         PetscSection section;
         if ((link->ft != PETSC_VTK_POINT_FIELD) && (link->ft != PETSC_VTK_POINT_VECTOR_FIELD)) continue;
         if (((PetscObject)X)->name || link != vtk->link) { /* If the object is already named, use it. If it is past the first link, name it to disambiguate. */
@@ -353,7 +350,7 @@
         if (!dmX) dmX = dm;
         ierr = PetscObjectQuery(link->vec, "section", (PetscObject*) &section);CHKERRQ(ierr);
         if (!section) {ierr = DMGetLocalSection(dmX, &section);CHKERRQ(ierr);}
-        ierr = PetscSectionGetDof(section,vStart,&bs);CHKERRQ(ierr);
+        if (vEnd > vStart) { ierr = PetscSectionGetDof(section,vStart,&bs);CHKERRQ(ierr); }
         ierr = PetscSectionGetNumFields(section,&nfields);CHKERRQ(ierr);
         field = 0;
         if (link->field >= 0) {
@@ -429,8 +426,8 @@
         Vec               coords;
         PetscBool         copy;
 
-        ierr  = DMGetCoordinatesLocal(dm,&coords);CHKERRQ(ierr);
-        ierr  = VecGetArrayRead(coords,&x);CHKERRQ(ierr);
+        ierr = DMGetCoordinatesLocal(dm,&coords);CHKERRQ(ierr);
+        ierr = VecGetArrayRead(coords,&x);CHKERRQ(ierr);
 #if defined(PETSC_USE_COMPLEX)
         copy = PETSC_TRUE;
 #else
@@ -492,7 +489,7 @@
           }
         }
         nsend = piece.nvertices*3;
-        ierr  = TransferWrite(viewer,fp,r,0,copy ? (const void *) y : (const void *) x,buffer,nsend,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+        ierr  = TransferWrite(comm,viewer,fp,r,0,copy ? (const void *) y : (const void *) x,buffer,nsend,MPIU_VTUREAL,tag);CHKERRQ(ierr);
         ierr  = PetscFree(y);CHKERRQ(ierr);
         ierr  = VecRestoreArrayRead(coords,&x);CHKERRQ(ierr);
       }
@@ -500,16 +497,16 @@
         PetscVTKInt  *connectivity = NULL, *offsets = NULL;
         PetscVTKType *types = NULL;
         ierr = DMPlexGetVTKConnectivity(dm,localized,&piece,&connectivity,&offsets,&types);CHKERRQ(ierr);
-        ierr = TransferWrite(viewer,fp,r,0,connectivity,buffer,piece.nconn,MPI_INT,tag);CHKERRQ(ierr);
-        ierr = TransferWrite(viewer,fp,r,0,offsets,buffer,piece.ncells,MPI_INT,tag);CHKERRQ(ierr);
-        ierr = TransferWrite(viewer,fp,r,0,types,buffer,piece.ncells,MPI_CHAR,tag);CHKERRQ(ierr);
+        ierr = TransferWrite(comm,viewer,fp,r,0,connectivity,buffer,piece.nconn,MPI_INT,tag);CHKERRQ(ierr);
+        ierr = TransferWrite(comm,viewer,fp,r,0,offsets,buffer,piece.ncells,MPI_INT,tag);CHKERRQ(ierr);
+        ierr = TransferWrite(comm,viewer,fp,r,0,types,buffer,piece.ncells,MPI_CHAR,tag);CHKERRQ(ierr);
         ierr = PetscFree3(connectivity,offsets,types);CHKERRQ(ierr);
       }
       {                         /* Owners (cell data) */
         PetscVTKInt *owners;
         ierr = PetscMalloc1(piece.ncells,&owners);CHKERRQ(ierr);
         for (i=0; i<piece.ncells; i++) owners[i] = rank;
-        ierr = TransferWrite(viewer,fp,r,0,owners,buffer,piece.ncells,MPI_INT,tag);CHKERRQ(ierr);
+        ierr = TransferWrite(comm,viewer,fp,r,0,owners,buffer,piece.ncells,MPI_INT,tag);CHKERRQ(ierr);
         ierr = PetscFree(owners);CHKERRQ(ierr);
       }
       /* Cell data */
@@ -518,7 +515,7 @@
         DM                dmX;
         const PetscScalar *x;
         PetscVTUReal      *y;
-        PetscInt          bs, nfields, field;
+        PetscInt          bs = 1, nfields, field;
         PetscSection      section = NULL;
 
         if ((link->ft != PETSC_VTK_CELL_FIELD) && (link->ft != PETSC_VTK_CELL_VECTOR_FIELD)) continue;
@@ -526,7 +523,7 @@
         if (!dmX) dmX = dm;
         ierr = PetscObjectQuery(link->vec, "section", (PetscObject*) &section);CHKERRQ(ierr);
         if (!section) {ierr = DMGetLocalSection(dmX, &section);CHKERRQ(ierr);}
-        ierr = PetscSectionGetDof(section,cStart,&bs);CHKERRQ(ierr);
+        if (cEnd > cStart) { ierr = PetscSectionGetDof(section,cStart,&bs);CHKERRQ(ierr); }
         ierr = PetscSectionGetNumFields(section,&nfields);CHKERRQ(ierr);
         field = 0;
         if (link->field >= 0) {
@@ -541,7 +538,7 @@
           PetscObject  f;
           PetscClassId fClass;
           PetscBool    vector;
-          if (nfields) {        /* We have user-defined fields/components */
+          if (nfields && cEnd > cStart) {        /* We have user-defined fields/components */
             ierr = PetscSectionGetFieldDof(section,cStart,field,&fbs);CHKERRQ(ierr);
           } else fbs = bs;      /* Say we have one field with 'bs' components */
           ierr = DMGetField(dmX,field,NULL,&f);CHKERRQ(ierr);
@@ -585,7 +582,7 @@
                 for (; j < 3; j++) y[cnt++] = 0.;
               }
               if (cnt != piece.ncells*3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not match");
-              ierr = TransferWrite(viewer,fp,r,0,y,buffer,piece.ncells*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+              ierr = TransferWrite(comm,viewer,fp,r,0,y,buffer,piece.ncells*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
             }
           } else {
             for (i=0; i<fbs; i++) {
@@ -609,7 +606,7 @@
                   y[cnt++] = (PetscVTUReal) (l ? PetscImaginaryPart(xpoint[i]) : PetscRealPart(xpoint[i]));
                 }
                 if (cnt != piece.ncells) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not match");
-                ierr = TransferWrite(viewer,fp,r,0,y,buffer,piece.ncells,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+                ierr = TransferWrite(comm,viewer,fp,r,0,y,buffer,piece.ncells,MPIU_VTUREAL,tag);CHKERRQ(ierr);
               }
             }
           }
@@ -623,7 +620,7 @@
         DM                dmX;
         const PetscScalar *x;
         PetscVTUReal      *y;
-        PetscInt          bs, nfields, field;
+        PetscInt          bs = 1, nfields, field;
         PetscSection      section = NULL;
 
         if ((link->ft != PETSC_VTK_POINT_FIELD) && (link->ft != PETSC_VTK_POINT_VECTOR_FIELD)) continue;
@@ -631,7 +628,7 @@
         if (!dmX) dmX = dm;
         ierr = PetscObjectQuery(link->vec, "section", (PetscObject*) &section);CHKERRQ(ierr);
         if (!section) {ierr = DMGetLocalSection(dmX, &section);CHKERRQ(ierr);}
-        ierr = PetscSectionGetDof(section,vStart,&bs);CHKERRQ(ierr);
+        if (vEnd > vStart) { ierr = PetscSectionGetDof(section,vStart,&bs);CHKERRQ(ierr); }
         ierr = PetscSectionGetNumFields(section,&nfields);CHKERRQ(ierr);
         field = 0;
         if (link->field >= 0) {
@@ -641,8 +638,8 @@
         ierr = VecGetArrayRead(X,&x);CHKERRQ(ierr);
         ierr = PetscMalloc1(piece.nvertices*3,&y);CHKERRQ(ierr);
         for (i=0; field<(nfields?nfields:1); field++) {
-          PetscInt   fbs,j;
-          if (nfields) {        /* We have user-defined fields/components */
+          PetscInt fbs,j;
+          if (nfields && vEnd > vStart) {        /* We have user-defined fields/components */
             ierr = PetscSectionGetFieldDof(section,vStart,field,&fbs);CHKERRQ(ierr);
           } else fbs = bs;      /* Say we have one field with 'bs' components */
           if (link->ft == PETSC_VTK_POINT_VECTOR_FIELD) {
@@ -692,7 +689,7 @@
                 }
               }
               if (cnt != piece.nvertices*3) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not match");
-              ierr = TransferWrite(viewer,fp,r,0,y,buffer,piece.nvertices*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+              ierr = TransferWrite(comm,viewer,fp,r,0,y,buffer,piece.nvertices*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
             }
           } else {
             for (i=0; i<fbs; i++) {
@@ -736,7 +733,7 @@
                   }
                 }
                 if (cnt != piece.nvertices) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not match");
-                ierr = TransferWrite(viewer,fp,r,0,y,buffer,piece.nvertices,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+                ierr = TransferWrite(comm,viewer,fp,r,0,y,buffer,piece.nvertices,MPIU_VTUREAL,tag);CHKERRQ(ierr);
               }
             }
           }
@@ -747,15 +744,15 @@
     } else if (!rank) {
       PetscInt l;
 
-      ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].nvertices*3,MPIU_VTUREAL,tag);CHKERRQ(ierr); /* positions */
-      ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].nconn,MPI_INT,tag);CHKERRQ(ierr); /* connectivity */
-      ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPI_INT,tag);CHKERRQ(ierr); /* offsets */
-      ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPI_CHAR,tag);CHKERRQ(ierr); /* types */
-      ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPI_INT,tag);CHKERRQ(ierr); /* owner rank (cells) */
+      ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].nvertices*3,MPIU_VTUREAL,tag);CHKERRQ(ierr); /* positions */
+      ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].nconn,MPI_INT,tag);CHKERRQ(ierr); /* connectivity */
+      ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPI_INT,tag);CHKERRQ(ierr); /* offsets */
+      ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPI_CHAR,tag);CHKERRQ(ierr); /* types */
+      ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPI_INT,tag);CHKERRQ(ierr); /* owner rank (cells) */
       /* all cell data */
       for (link=vtk->link; link; link=link->next) {
-        Vec               X = (Vec)link->vec;
-        PetscInt bs, nfields, field;
+        Vec          X = (Vec)link->vec;
+        PetscInt     bs = 1, nfields, field;
         DM           dmX;
         PetscSection section = NULL;
 
@@ -764,7 +761,7 @@
         if (!dmX) dmX = dm;
         ierr = PetscObjectQuery(link->vec, "section", (PetscObject*) &section);CHKERRQ(ierr);
         if (!section) {ierr = DMGetLocalSection(dmX, &section);CHKERRQ(ierr);}
-        ierr = PetscSectionGetDof(section,cStart,&bs);CHKERRQ(ierr);
+        if (cEnd > cStart) { ierr = PetscSectionGetDof(section,cStart,&bs);CHKERRQ(ierr); }
         ierr = PetscSectionGetNumFields(section,&nfields);CHKERRQ(ierr);
         field = 0;
         if (link->field >= 0) {
@@ -777,7 +774,7 @@
           PetscObject  f;
           PetscClassId fClass;
           PetscBool    vector;
-          if (nfields) {        /* We have user-defined fields/components */
+          if (nfields && cEnd > cStart) {        /* We have user-defined fields/components */
             ierr = PetscSectionGetFieldDof(section,cStart,field,&fbs);CHKERRQ(ierr);
           } else fbs = bs;      /* Say we have one field with 'bs' components */
           ierr = DMGetField(dmX,field,NULL,&f);CHKERRQ(ierr);
@@ -799,12 +796,12 @@
           }
           if (vector) {
             for (l = 0; l < loops_per_scalar; l++) {
-              ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].ncells*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+              ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].ncells*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
             }
           } else {
             for (i=0; i<fbs; i++) {
               for (l = 0; l < loops_per_scalar; l++) {
-                ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+                ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].ncells,MPIU_VTUREAL,tag);CHKERRQ(ierr);
               }
             }
           }
@@ -812,9 +809,9 @@
       }
       /* all point data */
       for (link=vtk->link; link; link=link->next) {
-        Vec               X = (Vec)link->vec;
-        DM                dmX;
-        PetscInt bs, nfields, field;
+        Vec          X = (Vec)link->vec;
+        DM           dmX;
+        PetscInt     bs = 1, nfields, field;
         PetscSection section = NULL;
 
         if ((link->ft != PETSC_VTK_POINT_FIELD) && (link->ft != PETSC_VTK_POINT_VECTOR_FIELD)) continue;
@@ -822,7 +819,7 @@
         if (!dmX) dmX = dm;
         ierr = PetscObjectQuery(link->vec, "section", (PetscObject*) &section);CHKERRQ(ierr);
         if (!section) {ierr = DMGetLocalSection(dmX, &section);CHKERRQ(ierr);}
-        ierr = PetscSectionGetDof(section,vStart,&bs);CHKERRQ(ierr);
+        if (vEnd > vStart) { ierr = PetscSectionGetDof(section,vStart,&bs);CHKERRQ(ierr); }
         ierr = PetscSectionGetNumFields(section,&nfields);CHKERRQ(ierr);
         field = 0;
         if (link->field >= 0) {
@@ -831,17 +828,17 @@
         }
         for (i=0; field<(nfields?nfields:1); field++) {
           PetscInt   fbs;
-          if (nfields) {        /* We have user-defined fields/components */
+          if (nfields && vEnd > vStart) {        /* We have user-defined fields/components */
             ierr = PetscSectionGetFieldDof(section,vStart,field,&fbs);CHKERRQ(ierr);
           } else fbs = bs;      /* Say we have one field with 'bs' components */
           if (link->ft == PETSC_VTK_POINT_VECTOR_FIELD) {
             for (l = 0; l < loops_per_scalar; l++) {
-              ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].nvertices*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+              ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].nvertices*3,MPIU_VTUREAL,tag);CHKERRQ(ierr);
             }
           } else {
             for (i=0; i<fbs; i++) {
               for (l = 0; l < loops_per_scalar; l++) {
-                ierr = TransferWrite(viewer,fp,r,0,NULL,buffer,gpiece[r].nvertices,MPIU_VTUREAL,tag);CHKERRQ(ierr);
+                ierr = TransferWrite(comm,viewer,fp,r,0,NULL,buffer,gpiece[r].nvertices,MPIU_VTUREAL,tag);CHKERRQ(ierr);
               }
             }
           }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/dm/interface/ftn-custom/zdmf.c petsc-3.14.5+dfsg1/src/dm/interface/ftn-custom/zdmf.c
--- petsc-3.14.4+dfsg1/src/dm/interface/ftn-custom/zdmf.c	2021-01-10 03:07:51.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/dm/interface/ftn-custom/zdmf.c	2021-03-03 23:09:50.000000000 +0100
@@ -26,6 +26,7 @@
 #define dmsetstratumis_              DMSETSTRATUMIS
 #define dmremovelabel_               DMREMOVELABEL
 #define dmviewfromoptions_           DMVIEWFROMOPTIONS
+#define dmcreatesuperdm_             DMCREATESUPERDM
 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
 #define dmcreateinterpolation_       dmcreateinterpolation
 #define dmview_                      dmview
@@ -50,6 +51,7 @@
 #define dmsetstratumis_              dmsetstratumis
 #define dmremovelabel_               dmremovelabel
 #define dmviewfromoptions_           dmviewfromoptions
+#define dmcreatesuperdm_             dmreatesuperdm
 #endif
 
 PETSC_EXTERN void dmgetmattype_(DM *mm,char* name,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/dm/partitioner/interface/ftn-custom/zpartitioner.c petsc-3.14.5+dfsg1/src/dm/partitioner/interface/ftn-custom/zpartitioner.c
--- petsc-3.14.4+dfsg1/src/dm/partitioner/interface/ftn-custom/zpartitioner.c	2020-11-03 19:01:59.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/dm/partitioner/interface/ftn-custom/zpartitioner.c	2021-03-03 23:09:50.000000000 +0100
@@ -28,6 +28,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscPartitionerViewFromOptions(*part,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/ksp/ksp/interface/ftn-custom/zitcreatef.c petsc-3.14.5+dfsg1/src/ksp/ksp/interface/ftn-custom/zitcreatef.c
--- petsc-3.14.4+dfsg1/src/ksp/ksp/interface/ftn-custom/zitcreatef.c	2020-11-03 19:01:59.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/ksp/ksp/interface/ftn-custom/zitcreatef.c	2021-03-03 23:13:43.000000000 +0100
@@ -45,6 +45,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = KSPViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/ksp/pc/impls/bddc/bddc.c petsc-3.14.5+dfsg1/src/ksp/pc/impls/bddc/bddc.c
--- petsc-3.14.4+dfsg1/src/ksp/pc/impls/bddc/bddc.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/ksp/pc/impls/bddc/bddc.c	2021-03-03 23:13:43.000000000 +0100
@@ -1318,7 +1318,7 @@
                      guess if a transformation of basis approach has been selected.
 
    Input Parameter:
-+  pc - the preconditioner contex
++  pc - the preconditioner context
 
    Application Interface Routine: PCPreSolve()
 
@@ -1530,7 +1530,7 @@
                      approach has been selected. Also, restores rhs to its original state.
 
    Input Parameter:
-+  pc - the preconditioner contex
++  pc - the preconditioner context
 
    Application Interface Routine: PCPostSolve()
 
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/ksp/pc/impls/hpddm/hpddm.cxx petsc-3.14.5+dfsg1/src/ksp/pc/impls/hpddm/hpddm.cxx
--- petsc-3.14.4+dfsg1/src/ksp/pc/impls/hpddm/hpddm.cxx	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/ksp/pc/impls/hpddm/hpddm.cxx	2021-03-03 23:13:43.000000000 +0100
@@ -39,6 +39,7 @@
   ierr = ISDestroy(&data->is);CHKERRQ(ierr);
   ierr = MatDestroy(&data->aux);CHKERRQ(ierr);
   ierr = MatDestroy(&data->B);CHKERRQ(ierr);
+  ierr = VecDestroy(&data->normal);CHKERRQ(ierr);
   data->correction = PC_HPDDM_COARSE_CORRECTION_DEFLATED;
   data->Neumann    = PETSC_FALSE;
   data->setup      = NULL;
@@ -391,6 +392,24 @@
   PetscFunctionReturn(0);
 }
 
+static PetscErrorCode PCPreSolve_HPDDM(PC pc, KSP ksp, Vec, Vec)
+{
+  PC_HPDDM       *data = (PC_HPDDM*)pc->data;
+  PetscBool      flg;
+  Mat            A;
+  PetscErrorCode ierr;
+
+  PetscFunctionBegin;
+  if (ksp) {
+    ierr = PetscObjectTypeCompare((PetscObject)ksp, KSPLSQR, &flg);CHKERRQ(ierr);
+    if (flg && !data->normal) {
+      ierr = KSPGetOperators(ksp, &A, NULL);CHKERRQ(ierr);
+      ierr = MatCreateVecs(A, NULL, &data->normal);CHKERRQ(ierr); /* temporary Vec used in PCHPDDMShellApply() for coarse grid corrections */
+    }
+  }
+  PetscFunctionReturn(0);
+}
+
 static PetscErrorCode PCHPDDMShellSetUp(PC pc)
 {
   PC_HPDDM_Level *ctx;
@@ -526,11 +545,21 @@
     ierr = KSPGetOperators(ctx->ksp, &A, NULL);CHKERRQ(ierr);
     ierr = PCHPDDMDeflate_Private(pc, x, y);CHKERRQ(ierr);                    /* y = Q x                          */
     if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_DEFLATED || ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_BALANCED) {
-      ierr = MatMult(A, y, ctx->v[1][0]);CHKERRQ(ierr);                       /* y = A Q x                        */
+      if (!ctx->parent->normal || ctx != ctx->parent->levels[0]) {
+        ierr = MatMult(A, y, ctx->v[1][0]);CHKERRQ(ierr);                     /* y = A Q x                        */
+      } else { /* KSPLSQR and finest level */
+        ierr = MatMult(A, y, ctx->parent->normal);CHKERRQ(ierr);              /* y = A Q x                        */
+        ierr = MatMultTranspose(A, ctx->parent->normal, ctx->v[1][0]);CHKERRQ(ierr); /* y = A^T A Q x             */
+      }
       ierr = VecWAXPY(ctx->v[1][1], -1.0, ctx->v[1][0], x);CHKERRQ(ierr);     /* y = (I - A Q) x                  */
       ierr = PCApply(ctx->pc, ctx->v[1][1], ctx->v[1][0]);CHKERRQ(ierr);      /* y = M^-1 (I - A Q) x             */
       if (ctx->parent->correction == PC_HPDDM_COARSE_CORRECTION_BALANCED) {
-        ierr = MatMultTranspose(A, ctx->v[1][0], ctx->v[1][1]);CHKERRQ(ierr); /* z = A^T M^-1 (I - A Q) x         */
+        if (!ctx->parent->normal || ctx != ctx->parent->levels[0]) {
+          ierr = MatMultTranspose(A, ctx->v[1][0], ctx->v[1][1]);CHKERRQ(ierr); /* z = A^T M^-1 (I - A Q) x       */
+        } else {
+          ierr = MatMult(A, ctx->v[1][0], ctx->parent->normal);CHKERRQ(ierr);
+          ierr = MatMultTranspose(A, ctx->parent->normal, ctx->v[1][1]);CHKERRQ(ierr); /* z = A^T A M^-1 (I - A^T A Q) x */
+        }
         ierr = PCHPDDMDeflate_Private(pc, ctx->v[1][1], ctx->v[1][1]);CHKERRQ(ierr);
         ierr = VecAXPY(ctx->v[1][0], -1.0, ctx->v[1][1]);CHKERRQ(ierr);       /* y = (I - Q A^T) M^-1 (I - A Q) x */
       }
@@ -1082,6 +1111,7 @@
   pc->ops->applytranspose      = 0;
   pc->ops->applysymmetricleft  = 0;
   pc->ops->applysymmetricright = 0;
+  pc->ops->presolve            = PCPreSolve_HPDDM;
   ierr = PetscObjectComposeFunction((PetscObject)pc, "PCHPDDMSetAuxiliaryMat_C", PCHPDDMSetAuxiliaryMat_HPDDM);CHKERRQ(ierr);
   ierr = PetscObjectComposeFunction((PetscObject)pc, "PCHPDDMHasNeumannMat_C", PCHPDDMHasNeumannMat_HPDDM);CHKERRQ(ierr);
   ierr = PetscObjectComposeFunction((PetscObject)pc, "PCHPDDMSetRHSMat_C", PCHPDDMSetRHSMat_HPDDM);CHKERRQ(ierr);
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/ksp/pc/interface/ftn-custom/zpreconf.c petsc-3.14.5+dfsg1/src/ksp/pc/interface/ftn-custom/zpreconf.c
--- petsc-3.14.4+dfsg1/src/ksp/pc/interface/ftn-custom/zpreconf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/ksp/pc/interface/ftn-custom/zpreconf.c	2021-03-03 23:09:50.000000000 +0100
@@ -57,6 +57,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PCViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/mat/coarsen/ftn-custom/zcoarsenf.c petsc-3.14.5+dfsg1/src/mat/coarsen/ftn-custom/zcoarsenf.c
--- petsc-3.14.4+dfsg1/src/mat/coarsen/ftn-custom/zcoarsenf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/mat/coarsen/ftn-custom/zcoarsenf.c	2021-03-03 23:09:50.000000000 +0100
@@ -12,6 +12,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = MatCoarsenViewFromOptions(*a,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/mat/impls/aij/mpi/mpimatmatmult.c petsc-3.14.5+dfsg1/src/mat/impls/aij/mpi/mpimatmatmult.c
--- petsc-3.14.4+dfsg1/src/mat/impls/aij/mpi/mpimatmatmult.c	2020-12-03 18:03:40.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/mat/impls/aij/mpi/mpimatmatmult.c	2021-03-03 23:13:43.000000000 +0100
@@ -417,6 +417,7 @@
   /* Estimate Bbn, column size of Bb */
   if (nz) {
     Bbn1 = 2*Am*BN/nz;
+    if (!Bbn1) Bbn1 = 1;
   } else Bbn1 = BN;
 
   bs = PetscAbs(B->cmap->bs);
@@ -588,6 +589,7 @@
   } else {
     Mat      Bb,Cb;
     PetscInt BN=B->cmap->N,n=contents->workB->cmap->n,i;
+    if (n <= 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Column block size %D must be positive",n);
 
     for (i=0; i<BN; i+=n) {
       ierr = MatDenseGetSubMatrix(B,i,PetscMin(i+n,BN),&Bb);CHKERRQ(ierr);
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/mat/impls/baij/seq/baijfact81.c petsc-3.14.5+dfsg1/src/mat/impls/baij/seq/baijfact81.c
--- petsc-3.14.4+dfsg1/src/mat/impls/baij/seq/baijfact81.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/mat/impls/baij/seq/baijfact81.c	2021-03-03 23:09:50.000000000 +0100
@@ -79,7 +79,7 @@
           /* PetscKernel_A_gets_A_minus_B_times_C(bs,rtmp+bs2*pj[j],pc,pv+bs2*j); */
           /* rtmp+bs2*pj[j] = rtmp+bs2*pj[j] - (*pc)*(pv+bs2*j) */
           v    = rtmp + bs2*pj[j];
-          ierr = PetscKernel_A_gets_A_minus_B_times_C_9(v,pc,pv);CHKERRQ(ierr);
+          ierr = PetscKernel_A_gets_A_minus_B_times_C_9(v,pc,pv+81*j);CHKERRQ(ierr);
           /* pv incremented in PetscKernel_A_gets_A_minus_B_times_C_9 */
         }
         ierr = PetscLogFlops(1458*nz+1377);CHKERRQ(ierr); /* flops = 2*bs^3*nz + 2*bs^3 - bs2) */
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/mat/impls/baij/seq/baij.h petsc-3.14.5+dfsg1/src/mat/impls/baij/seq/baij.h
--- petsc-3.14.4+dfsg1/src/mat/impls/baij/seq/baij.h	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/mat/impls/baij/seq/baij.h	2021-03-03 23:09:50.000000000 +0100
@@ -738,9 +738,9 @@
 
     A6 = _mm256_loadu_pd  (W+18); A7 = _mm256_loadu_pd  (W+22); A8 = _mm256_loadu_pd  (W+26);
     B0 = _mm256_broadcast_sd(B+ 2); B1 = _mm256_broadcast_sd(B+11); B2 = _mm256_broadcast_sd(B+20);
-    S0 = _mm256_fmadd_pd(A6,B0,S0); S1 = _mm256_fmadd_pd(A7,B0,S1); S2 = _mm256_fmadd_pd(A2,B0,S2);
-    S3 = _mm256_fmadd_pd(A6,B1,S3); S4 = _mm256_fmadd_pd(A7,B1,S4); S5 = _mm256_fmadd_pd(A2,B1,S5);
-    S6 = _mm256_fmadd_pd(A6,B2,S6); S7 = _mm256_fmadd_pd(A7,B2,S7); S8 = _mm256_fmadd_pd(A5,B2,S8);
+    S0 = _mm256_fmadd_pd(A6,B0,S0); S1 = _mm256_fmadd_pd(A7,B0,S1); S2 = _mm256_fmadd_pd(A8,B0,S2);
+    S3 = _mm256_fmadd_pd(A6,B1,S3); S4 = _mm256_fmadd_pd(A7,B1,S4); S5 = _mm256_fmadd_pd(A8,B1,S5);
+    S6 = _mm256_fmadd_pd(A6,B2,S6); S7 = _mm256_fmadd_pd(A7,B2,S7); S8 = _mm256_fmadd_pd(A8,B2,S8);
 
     A0 = _mm256_loadu_pd  (W+27); A1 = _mm256_loadu_pd  (W+31); A2 = _mm256_loadu_pd  (W+35);
     B6 = _mm256_broadcast_sd(B+ 3); B7 = _mm256_broadcast_sd(B+12); B8 = _mm256_broadcast_sd(B+21);
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/mat/interface/ftn-custom/zmatrixf.c petsc-3.14.5+dfsg1/src/mat/interface/ftn-custom/zmatrixf.c
--- petsc-3.14.4+dfsg1/src/mat/interface/ftn-custom/zmatrixf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/mat/interface/ftn-custom/zmatrixf.c	2021-03-03 23:09:50.000000000 +0100
@@ -843,6 +843,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = MatViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/mat/partition/ftn-custom/zpartitionf.c petsc-3.14.5+dfsg1/src/mat/partition/ftn-custom/zpartitionf.c
--- petsc-3.14.4+dfsg1/src/mat/partition/ftn-custom/zpartitionf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/mat/partition/ftn-custom/zpartitionf.c	2021-03-03 23:09:50.000000000 +0100
@@ -42,6 +42,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = MatPartitioningViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/mat/tests/ex237.c petsc-3.14.5+dfsg1/src/mat/tests/ex237.c
--- petsc-3.14.4+dfsg1/src/mat/tests/ex237.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/mat/tests/ex237.c	2021-03-03 23:13:43.000000000 +0100
@@ -9,7 +9,7 @@
 
 #include <petsc.h>
 
-#if defined(PETSC_HAVE_MKL)
+#if defined(PETSC_HAVE_MKL) && defined(PETSC_HAVE_MKL_SPARSE_OPTIMIZE)
 #include <mkl.h>
 #define PetscStackCallMKLSparse(func, args) do {               \
     sparse_status_t __ierr;                                    \
@@ -121,7 +121,7 @@
       char        *tmp;
       PetscInt    *ia_ptr, *ja_ptr, k;
       PetscScalar *a_ptr;
-#if defined(PETSC_HAVE_MKL)
+#if defined(PETSC_HAVE_MKL) && defined(PETSC_HAVE_MKL_SPARSE_OPTIMIZE)
       struct matrix_descr descr;
       sparse_matrix_t     spr;
       descr.type = SPARSE_MATRIX_TYPE_GENERAL;
@@ -182,7 +182,7 @@
               for (k = 0; k < Ai[An]; ++k) ja_ptr[k] = Aj[k] + 1; /* Fortran indexing to maximize cases covered by _mm routines */
               ierr = MatSeqSBAIJGetArray(A, &a_ptr);CHKERRQ(ierr);
               PetscStackCallMKLSparse(mkl_sparse_d_create_bsr, (&spr, SPARSE_INDEX_BASE_ONE, SPARSE_LAYOUT_COLUMN_MAJOR, An, An, bs[j], ia_ptr, ia_ptr + 1, ja_ptr, a_ptr));
-#if defined(PETSC_HAVE_MKL)
+#if defined(PETSC_HAVE_MKL) && defined(PETSC_HAVE_MKL_SPARSE_OPTIMIZE)
               descr.type = SPARSE_MATRIX_TYPE_SYMMETRIC;
               descr.mode = SPARSE_FILL_MODE_UPPER;
               descr.diag = SPARSE_DIAG_NON_UNIT;
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/snes/interface/ftn-custom/zsnesf.c petsc-3.14.5+dfsg1/src/snes/interface/ftn-custom/zsnesf.c
--- petsc-3.14.4+dfsg1/src/snes/interface/ftn-custom/zsnesf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/snes/interface/ftn-custom/zsnesf.c	2021-03-03 23:13:43.000000000 +0100
@@ -433,6 +433,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/sys/classes/draw/interface/ftn-custom/zdrawregf.c petsc-3.14.5+dfsg1/src/sys/classes/draw/interface/ftn-custom/zdrawregf.c
--- petsc-3.14.4+dfsg1/src/sys/classes/draw/interface/ftn-custom/zdrawregf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/sys/classes/draw/interface/ftn-custom/zdrawregf.c	2021-03-03 23:09:50.000000000 +0100
@@ -49,6 +49,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscDrawViewFromOptions(*draw,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/sys/classes/random/interface/ftn-custom/zrandomf.c petsc-3.14.5+dfsg1/src/sys/classes/random/interface/ftn-custom/zrandomf.c
--- petsc-3.14.4+dfsg1/src/sys/classes/random/interface/ftn-custom/zrandomf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/sys/classes/random/interface/ftn-custom/zrandomf.c	2021-03-03 23:09:50.000000000 +0100
@@ -47,6 +47,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscRandomViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/sys/fileio/sysio.c petsc-3.14.5+dfsg1/src/sys/fileio/sysio.c
--- petsc-3.14.4+dfsg1/src/sys/fileio/sysio.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/sys/fileio/sysio.c	2021-03-03 23:13:43.000000000 +0100
@@ -609,7 +609,7 @@
 PetscErrorCode  PetscBinarySynchronizedRead(MPI_Comm comm,int fd,void *data,PetscInt num,PetscInt *count,PetscDataType type)
 {
   PetscErrorCode ierr;
-  PetscMPIInt    rank;
+  PetscMPIInt    rank,size;
   MPI_Datatype   mtype;
   PetscInt       ibuf[2] = {0, 0};
   char           *fname = NULL;
@@ -626,13 +626,18 @@
   }
 
   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
+  ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
   if (!rank) {
     ibuf[0] = PetscBinaryRead(fd,data,num,count?&ibuf[1]:NULL,type);
   }
   ierr = MPI_Bcast(ibuf,2,MPIU_INT,0,comm);CHKERRQ(ierr);
   ierr = (PetscErrorCode)ibuf[0];CHKERRQ(ierr);
-  ierr = PetscDataTypeToMPIDataType(type,&mtype);CHKERRQ(ierr);
-  ierr = MPI_Bcast(data,count?ibuf[1]:num,mtype,0,comm);CHKERRQ(ierr);
+
+  /* skip MPI call on potentially huge amounts of data when running with one process; this allows the amount of data to basically unlimited in that case */
+  if (size > 1) {
+    ierr = PetscDataTypeToMPIDataType(type,&mtype);CHKERRQ(ierr);
+    ierr = MPI_Bcast(data,count?ibuf[1]:num,mtype,0,comm);CHKERRQ(ierr);
+  }
   if (count) *count = ibuf[1];
 
   if (type == PETSC_FUNCTION) {
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/sys/objects/ftn-custom/zoptionsf.c petsc-3.14.5+dfsg1/src/sys/objects/ftn-custom/zoptionsf.c
--- petsc-3.14.4+dfsg1/src/sys/objects/ftn-custom/zoptionsf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/sys/objects/ftn-custom/zoptionsf.c	2021-03-03 23:09:50.000000000 +0100
@@ -257,6 +257,7 @@
   char *o;
 
   FIXCHAR(option, loption, o);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscObjectViewFromOptions(*obj, *bobj, o);if (*ierr) return;
   FREECHAR(option, o);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/sys/objects/options.c petsc-3.14.5+dfsg1/src/sys/objects/options.c
--- petsc-3.14.4+dfsg1/src/sys/objects/options.c	2021-02-03 17:42:34.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/sys/objects/options.c	2021-03-03 23:13:43.000000000 +0100
@@ -258,6 +258,7 @@
   PetscErrorCode ierr;
   PetscOptions   tmp;
 
+  if (!defaultoptions) return 0;
   /* Destroy any options that the user forgot to pop */
   while (defaultoptions->previous) {
     tmp = defaultoptions;
@@ -976,7 +977,8 @@
   key[0] = '-'; /* keys must start with '-' */
   ierr = PetscStrncpy(key+1,prefix,sizeof(key)-1);CHKERRQ(ierr);
   ierr = PetscOptionsValidKey(key,&valid);CHKERRQ(ierr);
-  if (!valid) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_USER,"Given prefix \"%s\" not valid (the first character must be a letter, do not include leading '-')",prefix);
+  if (!valid && options->prefixind > 0 && isdigit((int)prefix[0])) valid = PETSC_TRUE; /* If the prefix stack is not empty, make numbers a valid prefix */
+  if (!valid) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"Given prefix \"%s\" not valid (the first character must be a letter%s, do not include leading '-')",prefix,options->prefixind?" or digit":"");
   start = options->prefixind ? options->prefixstack[options->prefixind-1] : 0;
   ierr = PetscStrlen(prefix,&n);CHKERRQ(ierr);
   if (n+1 > sizeof(options->prefix)-start) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Maximum prefix length %d exceeded",sizeof(options->prefix));
@@ -1263,8 +1265,7 @@
   PetscFunctionBegin;
   options = options ? options : defaultoptions;
   if (name[0] != '-') SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Name must begin with '-': Instead %s",name);
-
-  if (!PetscOptNameCmp(name,"-help")) options->help = PETSC_FALSE;
+  if (!PetscOptNameCmp(name,"-help")) options->help = options->help_intro = PETSC_FALSE;
 
   name++; /* skip starting dash */
 
@@ -1701,7 +1702,7 @@
   options = options ? options : defaultoptions;
   *used = PETSC_FALSE;
   for (i=0; i<options->N; i++) {
-    ierr = PetscStrcmp(options->names[i],name,used);CHKERRQ(ierr);
+    ierr = PetscStrcasecmp(options->names[i],name,used);CHKERRQ(ierr);
     if (*used) {
       *used = options->used[i];
       break;
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/sys/objects/pinit.c petsc-3.14.5+dfsg1/src/sys/objects/pinit.c
--- petsc-3.14.4+dfsg1/src/sys/objects/pinit.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/sys/objects/pinit.c	2021-03-03 23:13:43.000000000 +0100
@@ -843,13 +843,20 @@
     /* check for OpenMPI version, it is not part of the MPI ABI initiative (is it part of another initiative that needs to be handled?) */
 #elif defined(OMPI_MAJOR_VERSION)
     {
-      char *ver,bs[32],*bsf;
+      char *ver,bs[MPI_MAX_LIBRARY_VERSION_STRING],*bsf;
       flg = PETSC_FALSE;
-      ierr = PetscStrstr(mpilibraryversion,"Open MPI",&ver);if (ierr) return ierr;
-      if (ver) {
-        PetscSNPrintf(bs,32,"v%d.%d",OMPI_MAJOR_VERSION,OMPI_MINOR_VERSION);
-        ierr = PetscStrstr(ver,bs,&bsf);if (ierr) return ierr;
-        if (bsf) flg = PETSC_TRUE;
+#define PSTRSZ 2
+      char ompistr1[PSTRSZ][MPI_MAX_LIBRARY_VERSION_STRING] = {"Open MPI","FUJITSU MPI"};
+      char ompistr2[PSTRSZ][MPI_MAX_LIBRARY_VERSION_STRING] = {"v","Library "};
+      int i;
+      for (i=0; i<PSTRSZ; i++) {
+        ierr = PetscStrstr(mpilibraryversion,ompistr1[i],&ver);if (ierr) return ierr;
+        if (ver) {
+          PetscSNPrintf(bs,MPI_MAX_LIBRARY_VERSION_STRING,"%s%d.%d",ompistr2[i],OMPI_MAJOR_VERSION,OMPI_MINOR_VERSION);
+          ierr = PetscStrstr(ver,bs,&bsf);if (ierr) return ierr;
+          if (bsf) flg = PETSC_TRUE;
+          break;
+        }
       }
       if (!flg) {
         fprintf(stderr,"PETSc Error --- Open MPI library version \n%s does not match what PETSc was compiled with %d.%d, aborting\n",mpilibraryversion,OMPI_MAJOR_VERSION,OMPI_MINOR_VERSION);
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/sys/objects/prefix.c petsc-3.14.5+dfsg1/src/sys/objects/prefix.c
--- petsc-3.14.4+dfsg1/src/sys/objects/prefix.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/sys/objects/prefix.c	2021-03-03 23:09:50.000000000 +0100
@@ -180,7 +180,7 @@
   Level: advanced
 
 .seealso: PetscOptionsCreate(), PetscOptionsDestroy(), PetscObjectSetOptionsPrefix(), PetscObjectAppendOptionsPrefix(),
-          PetscObjectGetOptionsPrefix(), TSPrependOptionsPrefix(), SNESPrependOptionsPrefix(), KSPPrependOptionsPrefix()
+          PetscObjectGetOptionsPrefix()
 
 @*/
 PetscErrorCode  PetscObjectPrependOptionsPrefix(PetscObject obj,const char prefix[])
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/tao/interface/ftn-custom/ztaosolverf.c petsc-3.14.5+dfsg1/src/tao/interface/ftn-custom/ztaosolverf.c
--- petsc-3.14.4+dfsg1/src/tao/interface/ftn-custom/ztaosolverf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/tao/interface/ftn-custom/ztaosolverf.c	2021-03-03 23:09:50.000000000 +0100
@@ -370,6 +370,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = TaoViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/tao/linesearch/interface/ftn-custom/ztaolinesearchf.c petsc-3.14.5+dfsg1/src/tao/linesearch/interface/ftn-custom/ztaolinesearchf.c
--- petsc-3.14.4+dfsg1/src/tao/linesearch/interface/ftn-custom/ztaolinesearchf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/tao/linesearch/interface/ftn-custom/ztaolinesearchf.c	2021-03-03 23:09:50.000000000 +0100
@@ -163,6 +163,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = TaoLineSearchViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/ts/interface/ftn-custom/ztsf.c petsc-3.14.5+dfsg1/src/ts/interface/ftn-custom/ztsf.c
--- petsc-3.14.4+dfsg1/src/ts/interface/ftn-custom/ztsf.c	2020-12-03 18:03:40.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/ts/interface/ftn-custom/ztsf.c	2021-03-03 23:09:50.000000000 +0100
@@ -304,6 +304,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = TSViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/ts/trajectory/interface/ftn-custom/ztrajf.c petsc-3.14.5+dfsg1/src/ts/trajectory/interface/ftn-custom/ztrajf.c
--- petsc-3.14.4+dfsg1/src/ts/trajectory/interface/ftn-custom/ztrajf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/ts/trajectory/interface/ftn-custom/ztrajf.c	2021-03-03 23:09:50.000000000 +0100
@@ -31,6 +31,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = TSTrajectoryViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/is/ao/interface/ftn-custom/zaof.c petsc-3.14.5+dfsg1/src/vec/is/ao/interface/ftn-custom/zaof.c
--- petsc-3.14.4+dfsg1/src/vec/is/ao/interface/ftn-custom/zaof.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/is/ao/interface/ftn-custom/zaof.c	2021-03-03 23:09:50.000000000 +0100
@@ -34,6 +34,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = AOViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/is/is/interface/ftn-custom/zindexf.c petsc-3.14.5+dfsg1/src/vec/is/is/interface/ftn-custom/zindexf.c
--- petsc-3.14.4+dfsg1/src/vec/is/is/interface/ftn-custom/zindexf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/is/is/interface/ftn-custom/zindexf.c	2021-03-03 23:09:50.000000000 +0100
@@ -126,6 +126,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = ISViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/is/is/utils/ftn-custom/ziscoloringf.c petsc-3.14.5+dfsg1/src/vec/is/is/utils/ftn-custom/ziscoloringf.c
--- petsc-3.14.4+dfsg1/src/vec/is/is/utils/ftn-custom/ziscoloringf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/is/is/utils/ftn-custom/ziscoloringf.c	2021-03-03 23:09:50.000000000 +0100
@@ -22,6 +22,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = ISColoringViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/is/section/interface/ftn-custom/zsectionf.c petsc-3.14.5+dfsg1/src/vec/is/section/interface/ftn-custom/zsectionf.c
--- petsc-3.14.4+dfsg1/src/vec/is/section/interface/ftn-custom/zsectionf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/is/section/interface/ftn-custom/zsectionf.c	2021-03-03 23:09:50.000000000 +0100
@@ -13,6 +13,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscSectionViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/is/sf/interface/ftn-custom/zsf.c petsc-3.14.5+dfsg1/src/vec/is/sf/interface/ftn-custom/zsf.c
--- petsc-3.14.4+dfsg1/src/vec/is/sf/interface/ftn-custom/zsf.c	2020-12-03 18:03:41.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/is/sf/interface/ftn-custom/zsf.c	2021-03-03 23:13:43.000000000 +0100
@@ -88,6 +88,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PetscSFViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/is/utils/ftn-custom/zisltogf.c petsc-3.14.5+dfsg1/src/vec/is/utils/ftn-custom/zisltogf.c
--- petsc-3.14.4+dfsg1/src/vec/is/utils/ftn-custom/zisltogf.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/is/utils/ftn-custom/zisltogf.c	2021-03-03 23:09:50.000000000 +0100
@@ -50,6 +50,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = ISLocalToGlobalMappingViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/pf/interface/ftn-custom/zpff.c petsc-3.14.5+dfsg1/src/vec/pf/interface/ftn-custom/zpff.c
--- petsc-3.14.4+dfsg1/src/vec/pf/interface/ftn-custom/zpff.c	2020-11-03 19:02:00.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/pf/interface/ftn-custom/zpff.c	2021-03-03 23:09:50.000000000 +0100
@@ -13,6 +13,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = PFViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
diff -Nru --exclude '*.html' --exclude '*docs*' petsc-3.14.4+dfsg1/src/vec/vec/interface/ftn-custom/zvectorf.c petsc-3.14.5+dfsg1/src/vec/vec/interface/ftn-custom/zvectorf.c
--- petsc-3.14.4+dfsg1/src/vec/vec/interface/ftn-custom/zvectorf.c	2021-01-10 03:07:51.000000000 +0100
+++ petsc-3.14.5+dfsg1/src/vec/vec/interface/ftn-custom/zvectorf.c	2021-03-03 23:09:50.000000000 +0100
@@ -370,6 +370,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = VecViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }
@@ -378,6 +379,7 @@
   char *t;
 
   FIXCHAR(type,len,t);
+  CHKFORTRANNULLOBJECT(obj);
   *ierr = VecStashViewFromOptions(*ao,obj,t);if (*ierr) return;
   FREECHAR(type,t);
 }

Reply to: