<div dir="ltr">Bernard<div><br></div><div>I usually define some constants in each routine or module:</div><div><br></div><div>CCTK_REAL, parameter :: zero = 0</div><div>integer, parameter :: rkind = kind(zero)<br></div><div><br></div><div>and then I can write &quot;cmplx(x, kind=rk)&quot;.</div><div><br></div><div>-erik</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jul 20, 2015 at 12:09 PM, Bernard Kelly <span dir="ltr">&lt;<a href="mailto:physicsbeany@gmail.com" target="_blank">physicsbeany@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Thanks, Erik.<br>
<br>
I wasn&#39;t taking any magnitudes, but it looks like my problem was just<br>
blindly using the &quot;cmplx&quot; function to form the complex variable<br>
without a KIND argument, and it defaults to KIND=1 (i.e.<br>
single-precision) even if the real &amp; imaginary components enter as<br>
double-precision.<br>
<br>
For now, I&#39;ve switched to the GNU &quot;complex&quot; method, which seems to<br>
have fixed my problem on my Macbook.<br>
<br>
Bernard<br>
<span class=""><br>
On 19 July 2015 at 14:52, Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu">schnetter@cct.lsu.edu</a>&gt; wrote:<br>
&gt; Bernard<br>
&gt;<br>
&gt; In Fortran, real(z) (where z is complex) does maintain precision. The<br>
&gt; problem is likely caused by your using &quot;-Ofast&quot;, &quot;-ffast-math&quot;, or an Intel<br>
&gt; compiler that uses the equivalent by default (so you have to explicitly<br>
&gt; switch it off). With such an optimization, e.g. abs(z) is implemented as<br>
&gt; sqrt(real(z)**2 + aimag(z)**2), which overflows the intermediate squares.<br>
&gt; Without -ffast-math, compilers use a more expensive implementation that does<br>
&gt; not overflow.<br>
&gt;<br>
&gt; In your case, I&#39;d assume that the problem is no the call to real, but other<br>
&gt; complex or real functions. Can you show us a larger part of the code, and<br>
&gt; the compiler vendor, version, and options you are using?<br>
&gt;<br>
&gt; The C functions CCTK_Cmplx* are deprecated. These days, C compilers<br>
&gt; implement complex numbers as defined by the standard, and you&#39;d use the<br>
&gt; respective C standard function instead.<br>
&gt;<br>
&gt; -erik<br>
&gt;<br>
&gt;<br>
</span>&gt; On Sun, Jul 19, 2015 at 2:16 PM, Bernard Kelly &lt;<a href="mailto:physicsbeany@gmail.com">physicsbeany@gmail.com</a>&gt;<br>
<span class="">&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hi all.<br>
&gt;&gt;<br>
&gt;&gt; The Cactus documentation shows a set of C routines CCTK_CmplxXXXXXX<br>
&gt;&gt; that presumably preserve precision between CCTK_REAL and CCTK_COMPLEX<br>
&gt;&gt; types. Is there a &quot;right&quot; way to handle this in Cactus with Fortran<br>
&gt;&gt; (that isn&#39;t &quot;recode in C&quot;)?<br>
&gt;&gt;<br>
&gt;&gt; Context: I have some Fortran code in a Cactus thorn that works with<br>
&gt;&gt; real &amp; complex fields. I&#39;ve noticed that when the numbers are very<br>
&gt;&gt; large in magnitude, taking a simple real(z) drops precision --- a<br>
&gt;&gt; finite but large real part ends up as +/- Inf instead. I suspect it&#39;s<br>
&gt;&gt; dropping to single precision at some stage. Switching to &quot;dreal&quot;<br>
&gt;&gt; doesn&#39;t help, and avoiding the use of CCTK_COMPLEX altogether ---<br>
&gt;&gt; while possible --- leads to longer, less readable code.<br>
&gt;&gt;<br>
&gt;&gt; Thanks,<br>
&gt;&gt;<br>
&gt;&gt; Bernard<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; Users mailing list<br>
</span>&gt;&gt; <a href="mailto:Users@einsteintoolkit.org">Users@einsteintoolkit.org</a><br>
&gt;&gt; <a href="http://lists.einsteintoolkit.org/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.einsteintoolkit.org/mailman/listinfo/users</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
<span class="HOEnZb"><font color="#888888">&gt;<br>
&gt; --<br>
&gt; Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu">schnetter@cct.lsu.edu</a>&gt;<br>
&gt; <a href="http://www.perimeterinstitute.ca/personal/eschnetter/" rel="noreferrer" target="_blank">http://www.perimeterinstitute.ca/personal/eschnetter/</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt;<br><a href="http://www.perimeterinstitute.ca/personal/eschnetter/" target="_blank">http://www.perimeterinstitute.ca/personal/eschnetter/</a></div>
</div>