<div dir="ltr">Hi Erik,<div><br></div><div>thank you very much for your assistance and explanations!</div><div><br></div><div>I&#39;ll try to implement this and see what happens.</div><div><br></div><div>Best,</div><div>Gabriele</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Mar 8, 2021 at 8:38 AM Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu">schnetter@cct.lsu.edu</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Gabriele<br>
<br>
No, I think prolongation=&quot;copy&quot; would choose the spatial prolongation<br>
operator. InterpNumTimelevels = 1 might be the right choice. If you<br>
declare and allocate only a single time level, then the code will<br>
automatically fail if it tries to use older time levels.<br>
<br>
-erik<br>
<br>
On Mon, Mar 8, 2021 at 10:32 AM Gabriele Bozzola<br>
&lt;<a href="mailto:bozzola.gabriele@gmail.com" target="_blank">bozzola.gabriele@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi Erik,<br>
&gt;<br>
&gt;&gt; In this case, you can declare the grid function to use 0-th order time<br>
&gt;&gt; interpolation, and allocate only a single time level. This would do<br>
&gt;&gt; the same thing. I think the respective time prolongtation operator is<br>
&gt;&gt; called &quot;copy&quot;.<br>
&gt;<br>
&gt;<br>
&gt; Do I achieve this by setting the tags prolongation=&quot;copy&quot; and InterpNumTimelevels = 1<br>
&gt; in the declaration of the grid function in the interface.ccl?<br>
&gt;<br>
&gt; Thanks again,<br>
&gt; Gabriele<br>
&gt;<br>
&gt; On Sun, Mar 7, 2021 at 10:05 AM Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Sat, Mar 6, 2021 at 1:58 PM Gabriele Bozzola<br>
&gt;&gt; &lt;<a href="mailto:bozzola.gabriele@gmail.com" target="_blank">bozzola.gabriele@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Hi Erik,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; thanks for your response: it is very useful.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; &gt; &gt; Also, is it a problem if I don&#39;t worry about the boundaries If I<br>
&gt;&gt; &gt; &gt; &gt; want to interpolate the constraints onto a sphere?<br>
&gt;&gt; &gt; &gt;<br>
&gt;&gt; &gt; &gt; Yes it is. Interpolation requires a stencil, which requires boundaries.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I suspected so. Then, going back to the question in the first email, you<br>
&gt;&gt; &gt; said that I am essentially forced to compute the diagnostic at<br>
&gt;&gt; &gt; each timestep. The diagnostic I want to compute is very expensive,<br>
&gt;&gt; &gt; and it would slow down dramatically the evolution, so I really want to<br>
&gt;&gt; &gt; compute it only when I am going to output it. What I had in mind was<br>
&gt;&gt; &gt; to copy grid function to the previous timelevels by setting _p and _p_p.<br>
&gt;&gt; &gt; If I copy the same values as the one at the current time, this would<br>
&gt;&gt; &gt; essentially disable time interpolation. But, if I output only when all<br>
&gt;&gt; &gt; the refinement levels at the same time, this should not be a problem,<br>
&gt;&gt; &gt; because there shouldn&#39;t be a need for time prolongation, right?<br>
&gt;&gt;<br>
&gt;&gt; In this case, you can declare the grid function to use 0-th order time<br>
&gt;&gt; interpolation, and allocate only a single time level. This would do<br>
&gt;&gt; the same thing. I think the respective time prolongtation operator is<br>
&gt;&gt; called &quot;copy&quot;.<br>
&gt;&gt;<br>
&gt;&gt; -erik<br>
&gt;&gt;<br>
&gt;&gt; &gt; Thanks again for your help,<br>
&gt;&gt; &gt; Gabriele<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; On Sat, Mar 6, 2021 at 7:45 AM Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; On Fri, Mar 5, 2021 at 8:01 PM Gabriele Bozzola<br>
&gt;&gt; &gt;&gt; &lt;<a href="mailto:bozzola.gabriele@gmail.com" target="_blank">bozzola.gabriele@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Hi Erik,<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; thank you very much for your answer.<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Just a clarification: what is &#39;boundary&#39; exactly in this context?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &quot;Boundary&quot; in the context are all grid points where the constraints<br>
&gt;&gt; &gt;&gt; cannot be calculated directly, i.e. by evaluating finite differences.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; Also, is it a problem if I don&#39;t worry about the boundaries If I<br>
&gt;&gt; &gt;&gt; &gt; want to interpolate the constraints onto a sphere?<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Yes it is. Interpolation requires a stencil, which requires boundaries.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Cactus interpolation supports taking derivatives during interpolation.<br>
&gt;&gt; &gt;&gt; You can thus interpolate the ADM variables and their derivatives onto<br>
&gt;&gt; &gt;&gt; a sphere, and calculate the constraints there. You won&#39;t need to take<br>
&gt;&gt; &gt;&gt; derivatives on the sphere since you interpolated all derivatives, so<br>
&gt;&gt; &gt;&gt; evaluating the constraints on points on a sphere is then a point-wise<br>
&gt;&gt; &gt;&gt; operation. The horizon finder does this (calculating the expansion,<br>
&gt;&gt; &gt;&gt; not the constraints, but both have equivalent requirements).<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; -erik<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; Thanks,<br>
&gt;&gt; &gt;&gt; &gt; Gabriele<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt; writes:<br>
&gt;&gt; &gt;&gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt; Gabriele<br>
&gt;&gt; &gt;&gt; &gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt; If you do not use the constraints, then you do not need to set<br>
&gt;&gt; &gt;&gt; &gt; &gt; the<br>
&gt;&gt; &gt;&gt; &gt; &gt; boundaries. That would simplify many things; for example, you<br>
&gt;&gt; &gt;&gt; &gt; &gt; can<br>
&gt;&gt; &gt;&gt; &gt; &gt; calculate them at any time, and you do not need to worry about<br>
&gt;&gt; &gt;&gt; &gt; &gt; time<br>
&gt;&gt; &gt;&gt; &gt; &gt; levels. However, you then need to be careful about visualization<br>
&gt;&gt; &gt;&gt; &gt; &gt; and<br>
&gt;&gt; &gt;&gt; &gt; &gt; reductions: You need to ensure that you don&#39;t accidentally<br>
&gt;&gt; &gt;&gt; &gt; &gt; visualize<br>
&gt;&gt; &gt;&gt; &gt; &gt; the boundaries, and you cannot perform vertex-centred reductions<br>
&gt;&gt; &gt;&gt; &gt; &gt; in<br>
&gt;&gt; &gt;&gt; &gt; &gt; Carpet because they need some boundary values.<br>
&gt;&gt; &gt;&gt; &gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt; If you do need boundaries, then you need three time levels to<br>
&gt;&gt; &gt;&gt; &gt; &gt; allow<br>
&gt;&gt; &gt;&gt; &gt; &gt; prolongation on boundaries, and you are essentially forced to<br>
&gt;&gt; &gt;&gt; &gt; &gt; evaluate<br>
&gt;&gt; &gt;&gt; &gt; &gt; the constraints at every iteration. I recommend the schedule bin<br>
&gt;&gt; &gt;&gt; &gt; &gt; &quot;MoL_PseudoEvolution&quot; for this, which runs once per time step,<br>
&gt;&gt; &gt;&gt; &gt; &gt; after<br>
&gt;&gt; &gt;&gt; &gt; &gt; MoL&#39;s loop, at the right time (i.e. before restriction).<br>
&gt;&gt; &gt;&gt; &gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt; -erik<br>
&gt;&gt; &gt;&gt; &gt; &gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt; On Fri, Mar 5, 2021 at 11:01 AM Gabriele Bozzola<br>
&gt;&gt; &gt;&gt; &gt; &gt; &lt;<a href="mailto:bozzola.gabriele@gmail.com" target="_blank">bozzola.gabriele@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; Hello,<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; suppose (for clarity) that I want to write a thorn that<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; computes the constraint violations<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; as grid functions. Since this is a diagnostic, I don&#39;t need to<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; compute it at every iteration,<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; so I will add a parameter &quot;compute every&quot; and I will schedule<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; the computations in<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; CCTK_ANALYSIS. Then, I will be careful and make sure that<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; compute_every is a<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; multiple of when all the refinement levels are synced up.<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; How are boundary conditions handled in this case?<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; I can call Boundary_SelectGroupForBC every &quot;compute_every&quot; and<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; schedule the<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; corresponding functions in the scheduler. But, do I need to (1)<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; allocate multiple timelevels<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; for my grid functions, (2) do anything about filling previous<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; timelevels?<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; I am looking at WeylScal4 as an example. The thorn has<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; parameters &quot;compute_every&quot;,<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; the grid functions have 3 time levels, and<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; Boundary_SelectGroupForBC is called<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; every &quot;compute_every&quot;, but nothing is done to fill the previous<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; timelevels. How does this<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; work?<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; Assuming that the boundary conditions are &#39;flat&#39;, is there any<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; way to just work with one<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; timelevel?<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; Thanks,<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; Gabriele<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; _______________________________________________<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; Users mailing list<br>
&gt;&gt; &gt;&gt; &gt; &gt;&gt; <a href="mailto:Users@einsteintoolkit.org" target="_blank">Users@einsteintoolkit.org</a><br>
&gt;&gt; &gt;&gt; &gt; &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;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; --<br>
&gt;&gt; &gt;&gt; Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt;<br>
&gt;&gt; &gt;&gt; <a href="http://www.perimeterinstitute.ca/personal/eschnetter/" rel="noreferrer" target="_blank">http://www.perimeterinstitute.ca/personal/eschnetter/</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Erik Schnetter &lt;<a href="mailto:schnetter@cct.lsu.edu" target="_blank">schnetter@cct.lsu.edu</a>&gt;<br>
&gt;&gt; <a href="http://www.perimeterinstitute.ca/personal/eschnetter/" rel="noreferrer" target="_blank">http://www.perimeterinstitute.ca/personal/eschnetter/</a><br>
<br>
<br>
<br>
-- <br>
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/" rel="noreferrer" target="_blank">http://www.perimeterinstitute.ca/personal/eschnetter/</a><br>
</blockquote></div>