I tried to make Metis 5 work with fortran for quite some time but was not able to make it work; in the end there were some things that I could not make work so I ended up with a C function which I call out of fortran; the C function is attached -- calling it is straightforward just pass in the indicated integers and arrays. [I went this route, because in the end I think I figured out that the Fortran interface in Metis 5 was missing some feature to allow it work properly -- the details escape me at the moment since I did this about 1 month back.]
-sanjay On 6/8/12 8:35 AM, Tabrez Ali wrote: > Here it is for the 3 compilers. > > GNU FC http://bpaste.net/show/31029/ > > Intel FC http://bpaste.net/show/QJ6k5jc52t7MGUlvrlEV/ > > PGI FC http://bpaste.net/show/DZzY6Re5iXMgLSHydOgJ/ > > > On 06/08/2012 09:15 AM, John Mousel wrote: >> Attaching the Valgrind output would probably help a lot. >> >> On Fri, Jun 8, 2012 at 9:02 AM, Tabrez Ali <stali at geology.wisc.edu >> <mailto:stali at geology.wisc.edu>> wrote: >> >> Thanks for your answer. Unfortunately its not that. >> >> Based on past experience I am sure I am overlooking something >> very simple but I cant seem to find out what. Btw METIS 4 worked >> fine before. >> >> On 06/08/2012 08:39 AM, John Mousel wrote: >>> It's hard to tell from the info you provided, but you seem to be >>> playing fast and loose with your type declarations. METIS is >>> expecting real_t, which is a 32 bit real if you haven't changed >>> the definition in metis.h. I know this has caused me problems in >>> the past. >>> >>> On Fri, Jun 8, 2012 at 7:38 AM, Tabrez Ali >>> <stali at geology.wisc.edu <mailto:stali at geology.wisc.edu>> wrote: >>> >>> Sorry about a question not directly related to PETSc but has >>> anyone here been able to use the METIS 5.0 (that PETSc >>> 3.3/dev downloads/builds) with Fortran? There has been an >>> API change from 4 to 5 but I am having some trouble and >>> METIS manual/forums havent been useful. >>> >>> For example consider the simple code (below) that partitions >>> a two element mesh made of linear quads into two. The >>> elements are numbered 0 1 2 3 and 1 4 5 2.It works fine with >>> GNU FC (no valgrind errors). With Intel FC it works fines >>> (though valgrind throws a bunch of errors). However with PGI >>> compilers I get a segfault. >>> >>> program test >>> implicit none >>> integer, parameter :: nels=2, nnds=6, npel=4 >>> integer :: eptr(nels+1), nodes(nels*npel), >>> epart(nels), npart(nnds), n >>> integer, pointer :: vwgt(:)=>null(), vsize(:)=>null(), >>> mopts(:)=>null() >>> real(8), pointer :: tpwgts(:)=>null() >>> eptr=(/0,4,7/) >>> nodes=(/0,1,2,3,1,4,5,2/) >>> call >>> >>> METIS_PartMeshNodal(nels,nnds,eptr,nodes,vwgt,vsize,2,tpwgts,mopts,n,epart,npart) >>> print*, npart; print*, epart >>> end program test >>> >>> According to the manual moving from METIS 4 to 5 only >>> involves passing some additional nulls. I am not sure what I >>> missed. >>> >>> http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/manual.pdf >>> >>> Thanks in advance. >>> >>> Tabrez >>> >> >> -- >> No one trusts a model except the one who wrote it; Everyone trusts an >> observation except the one who made it- Harlow Shapley >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120608/42659f79/attachment-0001.html> -------------- next part -------------- /* c * * F E A P * * A Finite Element Analysis Program c.... Copyright (c) 1984-2012: Regents of the University of California c All rights reserved c-----[--.----+----.----+----.-----------------------------------------] c Modification log Date (dd/mm/year) c Original version 06/05/2012 c-----[--.----+----.----+----.-----------------------------------------] c Purpose: C cover function to partition mesh using METIS ver 5.x c Inputs: c numnp -- number of nodes c xadj -- pointers into adjaceny matrix c adjncy -- adjaceny matrix for node graph c domains -- number of domains to partition graph into c Outputs: c part -- partitioned graph c-----[--.----+----.----+----.-----------------------------------------] */ #include <stdio.h> #include "metis.h" int smetis_(int *numnp,int *xadj,int *adjncy,int *domains, int *part) { int rval; int ncon = 1; int edgecut = 0; int options[METIS_NOPTIONS]; // Default options METIS_SetDefaultOptions(options); options[METIS_OPTION_OBJTYPE] = 0; options[METIS_OPTION_CTYPE] = 1; options[METIS_OPTION_DBGLVL] = 0; options[METIS_OPTION_NITER] = 10; options[METIS_OPTION_NCUTS] = 1; options[METIS_OPTION_MINCONN] = 0; options[METIS_OPTION_CONTIG] = 0; options[METIS_OPTION_NUMBERING] = 1; if (*domains < 8) { // Recursive options[METIS_OPTION_IPTYPE] = 0; options[METIS_OPTION_RTYPE] = 0; options[METIS_OPTION_UFACTOR] = 1; rval = METIS_PartGraphRecursive(numnp,&ncon,xadj,adjncy, NULL,NULL,NULL, domains,NULL,NULL,options,&edgecut,part); } else { // Kway options[METIS_OPTION_IPTYPE] = 4; options[METIS_OPTION_RTYPE] = 1; options[METIS_OPTION_UFACTOR] = 30; rval = METIS_PartGraphKway(numnp,&ncon,xadj,adjncy, NULL,NULL,NULL, domains,NULL,NULL,options,&edgecut,part); } return(rval); }
