Date: Thu, 11 Jul 2013 22:14:17 -0700 From: Steve Kargl <sgk@troutmask.apl.washington.edu> To: mexas@bristol.ac.uk Cc: fortran@freebsd.org Subject: Re: gfortran46: Error: Type of argument 'z' in call to 'dimag' at (1) should be COMPLEX(16), not COMPLEX(8) Message-ID: <20130712051417.GA71107@troutmask.apl.washington.edu> In-Reply-To: <201307112342.r6BNg32L090240@mech-cluster241.men.bris.ac.uk> References: <20130711172542.GA67029@troutmask.apl.washington.edu> <201307112342.r6BNg32L090240@mech-cluster241.men.bris.ac.uk>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, Jul 12, 2013 at 12:42:03AM +0100, Anton Shterenlikht wrote: >>From sgk@troutmask.apl.washington.edu Thu Jul 11 18:32:18 2013 >> >>>$ cat dcargu.f >>> FUNCTION DCARGU(C) >>> IMPLICIT REAL*8 (A-H,O-Z) >>> REAL*8 DCARGU >>> COMPLEX*16 C >> >>> IF (DIMAG(C).GT.0.D0) THEN >> >>I suspect you are being hit by -fdefault-real-8 or >>similar option. If this is the case, you may want >>to ask the ASTER developers if they know what that >>option actually does. > > (cc to thierry@ - the maintainer) > > It's actually in the port's Makefile: > > .if ${ARCH} == "i386" > FLAGARCH= -DP_LINUX -DLINUX > FFLAGARCH= > .else > FLAGARCH= -DLINUX64 > FFLAGARCH= -fdefault-integer-8 -fdefault-real-8 > .endif > > Anyway, please correct my analysis if it's wrong. > > complex*16 is the same as complex(kind=8), meaning > 16 bytes total, or two 8-byte reals. > The effect of -fdefault-real-8 is to make DIMAG > expect not complex(8) but complex(16), but *only* > on platforms where complex(16) is supported. Yes, this is essentially the cause of the problem. I downloaded french/aster, and quite frankly, I would not trust any results from that code. Given the amount of Fortran code, blindly using -fdefault-integer-8 and -fdefault-real-8 is not a good idea. > And on ia64 is does not seem to be supported, > and -fdefault-real8 has no effect on ia64: I don't have access to ia64, so can't look into gfortran's behavior. > $ cat z.f90 > complex*16 :: z > z = (1,2) > write (*,*) dimag(z) > end > $ gfortran46 -Wall z.f90 > $ ./a.out > 2.0000000000000000 > $ gfortran46 -Wall -fdefault-real-8 z.f90 > $ ./a.out > 2.0000000000000000 You need to look at -fdump-tree-original. This produces gcc's intermediate code, and may show the promotion. > I agree with you that this routine from the > Aster code is not very well written, i.e. > is not written with portability in mind. > However, code_Aster is massive and I don't think > it likely the developers will want to fix > issues like this. I suspect that the code_aster developers have no idea how dangerous these options are, or understand their limitations. If the code_aster developers do not want to do a proper port of the Fortran code from single precision to double precision, then they probably should use -freal-4-real-8, which is likely closers to what they want. -- Steve
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130712051417.GA71107>