[petsc-dev] C++ error

Satish Balay balay at mcs.anl.gov
Tue Jul 14 10:18:07 CDT 2020


$ git grep DMPlexSNESComputeJacobianFEM
include/petscdmplex.h:PETSC_EXTERN PetscErrorCode DMPlexSNESComputeJacobianFEM(DM, Vec, Mat, Mat, void *);
src/dm/impls/plex/landau/plexland.c:    ierr = DMPlexSNESComputeJacobianFEM(plex, locX, *Amat, *Amat, ctx);CHKERRQ(ierr);
src/snes/utils/dmplexsnes.c:PetscErrorCode DMPlexSNESComputeJacobianFEM(DM dm, Vec X, Mat Jac, Mat JacP,void *user)

So the function is in -lpetscsnes - but its referred to from -lpetscdm [not just examples] - hence a circular dependency.

You should be able to reproduce this issue on your laptop - instead of using CI for this.

Just build with --with-single-library=0 --with-shared-libraries=0

Satish

On Tue, 14 Jul 2020, Mark Adams wrote:

> I am pretty sure I've removed stray includes (this did fix one
> undefined reference), but I am not fixing DMPlexSNESComputeJacobianFEM.
> 
> DMPlexSNESComputeJacobianFEM is not called from any other source. Just
> examples. And it is NOT called from the examples that fail:
> 
> /home/petsc/builds/KFnbdjNX/0/petsc/petsc/arch-ci-linux-cuda-single-cxx/lib/libpetscdm.so:
> undefined reference to `DMPlexSNESComputeJacobianFEM'
> collect2: error: ld returned 1 exit status
> make[2]: *** [arch-ci-linux-cuda-single-cxx/tests/mat/tests/ex240] Error 1
> 
> https://gitlab.com/petsc/petsc/-/jobs/637821856
> https://gitlab.com/petsc/petsc/-/jobs/637821886
> https://gitlab.com/petsc/petsc/-/jobs/637821944
> 
> This seems to be saying that libpetscdm can not find my reference to
> DMPlexSNESComputeJacobianFEM, called from in the lib.
> 
> Maybe DMPlexSNESComputeJacobianFEM is set to be external but I am now using
> it internally and it would need to be declared differently?
> 
> 
> On Mon, Jul 13, 2020 at 8:19 PM Mark Adams <mfadams at lbl.gov> wrote:
> 
> >
> >
> > On Mon, Jul 13, 2020 at 7:11 PM Satish Balay <balay at mcs.anl.gov> wrote:
> >
> >> $ git grep DMPlexLandFormLandau_Internal
> >> include/petsc/private/dmpleximpl.h:PETSC_INTERN PetscErrorCode
> >> DMPlexLandFormLandau_Internal(Vec, Mat, const PetscInt, void *);
> >> src/dm/impls/plex/landau/plexland.c:  DMPlexLandFormLandau_Internal -
> >> Evaluates Jacobian matrix.
> >> src/dm/impls/plex/landau/plexland.c:PetscErrorCode
> >> DMPlexLandFormLandau_Internal(Vec a_X, Mat JacP, const PetscInt dim, void
> >> *a_ctx)
> >> src/ts/utils/dmplexts.c:PETSC_INTERN PetscErrorCode
> >> DMPlexLandFormLandau_Internal(Vec, Mat, const PetscInt, void *);
> >> src/ts/utils/dmplexts.c:    ierr =
> >> DMPlexLandFormLandau_Internal(X,ctx->J,dim,(void*)ctx);CHKERRQ(ierr);
> >> src/ts/utils/dmplexts.c:    ierr =
> >> DMPlexLandFormLandau_Internal(X,ctx->J,dim,(void*)ctx); CHKERRQ(ierr);
> >>
> >>
> >> You'll need the PETSC_EXTERN in include/petsc/private/dmpleximpl.h  and
> >> remove the duplicate prototype listing from src/ts/utils/dmplexts.c
> >>
> >
> > Thanks, the first error that I got was undefined again:
> >
> > arch-ci-linux-cuda-single-cxx/obj/ts/utils/dmplexts.o: In function
> > `DMPlexLandIFunction':
> > 2264 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2264>/home/petsc/builds/KFnbdjNX/0/petsc/petsc/src/ts/utils/dmplexts.c:266:
> > undefined reference to `DMPlexLandFormLandau_Internal'
> > 2265 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2265>arch-ci-linux-cuda-single-cxx/obj/ts/utils/dmplexts.o:
> > In function `DMPlexLandIJacobian':
> > 2266 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2266>/home/petsc/builds/KFnbdjNX/0/petsc/petsc/src/ts/utils/dmplexts.c:305:
> > undefined reference to `DMPlexLandFormLandau_Internal'
> > 2267 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2267>/usr/bin/ld:
> > arch-ci-linux-cuda-single-cxx/lib/libpetscts.so.3.013.3: hidden symbol
> > `DMPlexLandFormLandau_Internal' isn't defined
> > 2268 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2268>/usr/bin/ld:
> > final link failed: Bad value
> > 2269 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2269>collect2:
> > error: ld returned 1 exit status
> > 2270 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2270>gmakefile:149:
> > recipe for target 'arch-ci-linux-cuda-single-cxx/lib/libpetscts.so.3.013.3'
> > failed
> > 2271 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2271>make[3]: ***
> > [arch-ci-linux-cuda-single-cxx/lib/libpetscts.so.3.013.3] Error 1
> > 2272 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2272>make[3]: ***
> > Waiting for unfinished jobs....
> > 2273 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2273> FC
> > arch-ci-linux-cuda-single-cxx/obj/tao/f90-mod/petsctaomod.o
> > 2274 <https://gitlab.com/petsc/petsc/-/jobs/636864970#L2274>/home/petsc/builds/KFnbdjNX/0/petsc/petsc/lib/petsc/conf/rules:49:
> > recipe for target 'libs' failed
> >
> >
> > https://gitlab.com/petsc/petsc/-/jobs/636864970
> >
> >
> > I'll try extern
> >
> >
> >> Satish
> >>
> >>
> >> > I tried to add code to DMPlexts.c and am getting this error:
> >> >
> >> > https://gitlab.com/petsc/petsc/-/jobs/636828148
> >> >
> >> > dmplexts.c:(.text+0x1a0f): undefined reference to
> >> > `DMPlexLandFormLandau_Internal'
> >> > 1648 <https://gitlab.com/petsc/petsc/-/jobs/636828148#L1648>
> >> >
> >> > with this code:
> >> >
> >> > PETSC_INTERN PetscErrorCode DMPlexLandFormLandau_Internal(Vec a_X, Mat
> >> > JacP, const PetscInt dim, void *a_ctx);
> >> > /*@
> >> >   DMPlexLandIFunction
> >> > @*/
> >> > PetscErrorCode DMPlexLandIFunction(TS ts,PetscReal time_dummy,Vec X,Vec
> >> > X_t,Vec F,void *actx)
> >> > {
> >> > .....
> >> >     ierr =
> >> > DMPlexLandFormLandau_Internal(X,ctx->J,dim,(void*)ctx);CHKERRQ(ierr);
> >> >
> >> > I tried with EXTERN also. Any ideas?
> >> > Thanks,
> >> > Mark
> >> >
> >>
> >>
> 



More information about the petsc-dev mailing list