The second order accuracy of TR-BDF2 method











up vote
0
down vote

favorite












The following method is called the TR-BDF2:
$$U^* = U^n+frac k4(f(U^n)+f(U^{*}))$$
$$U^{n+1}= frac 13(4U^* - U^n+kf(U^{n+1})).$$
Apparently, this one-step method is second-order accurate while being a one-step method. But I am stuck on proving the said second-order accuracy using Taylor expansion. The issue is that when I write the local truncation error, I get the following:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u^*+u(t_n)) - f(u(t_{n+1})) = -dfrac{k}{96}u'''(t_n)-frac {k^2} {12}u'''(t_n).$$
This means that I am dealing with the implicit, trapezoidal method step incorrectly. Basically, what should $u^*$ be in this case? If it is exactly $u(t_{n+frac{1}{2}})$, then there is no point even doing the implicit first step in the first place.



I would appreciate if someone makes this issue clear to me.



EDIT: So the only issue I am having is I do not know how to make sense of $U^*.$ That is, if there was $U^{n+0.5}$ instead, then everything is simple because I can expand $u(t_{n+1}), u(t_{n+0.5})$ all in Taylor expansion around the point $t = t_n$ and so establishing the desired order of accuracy is merely a task of some algebra. If this was the case, then the local truncation error will read as:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u(t_{n+0.5})+u(t_n)) - f(u(t_{n+1}))$$
and this is very simple to work with. So to sum up, my issue is what do I replace $U^*$ in the local truncation error?










share|cite|improve this question
























  • What is $k$? Is it the time step?
    – Ian
    Nov 19 at 0:51












  • @Ian, yes $k$ is the time step.
    – dezdichado
    Nov 19 at 1:37






  • 2




    @Ian: It's a two-stage, one-step method. A two-step method (such as BDF2 by itself) would use both $U^{n-1}$ and $U^n$ for computing $U^{n+1}$.
    – Rahul
    Nov 19 at 20:59






  • 1




    Could you add some of your intermediate results? It seems strange that you get the same derivative with different powers of $k$, there could be some problem in unpacking the local error of the first stage while inserting in the second stage. For instance, inserting the first into the second stage one may get $U_{n+1}-U_n=frac k3(f(U_n)+f(U_*)+f(U_{n+1}))$ which is composite trapezoidal up to the error in $U_*$ to $U_{n+1/2}$.
    – LutzL
    Nov 20 at 10:20








  • 1




    Treat the first stage as an instance of the trapezoidal rule, and compute the error in $U^*$ with respect to $u(t_{n+1/2})$. Then plug it into the second stage.
    – Rahul
    Nov 21 at 15:05















up vote
0
down vote

favorite












The following method is called the TR-BDF2:
$$U^* = U^n+frac k4(f(U^n)+f(U^{*}))$$
$$U^{n+1}= frac 13(4U^* - U^n+kf(U^{n+1})).$$
Apparently, this one-step method is second-order accurate while being a one-step method. But I am stuck on proving the said second-order accuracy using Taylor expansion. The issue is that when I write the local truncation error, I get the following:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u^*+u(t_n)) - f(u(t_{n+1})) = -dfrac{k}{96}u'''(t_n)-frac {k^2} {12}u'''(t_n).$$
This means that I am dealing with the implicit, trapezoidal method step incorrectly. Basically, what should $u^*$ be in this case? If it is exactly $u(t_{n+frac{1}{2}})$, then there is no point even doing the implicit first step in the first place.



I would appreciate if someone makes this issue clear to me.



EDIT: So the only issue I am having is I do not know how to make sense of $U^*.$ That is, if there was $U^{n+0.5}$ instead, then everything is simple because I can expand $u(t_{n+1}), u(t_{n+0.5})$ all in Taylor expansion around the point $t = t_n$ and so establishing the desired order of accuracy is merely a task of some algebra. If this was the case, then the local truncation error will read as:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u(t_{n+0.5})+u(t_n)) - f(u(t_{n+1}))$$
and this is very simple to work with. So to sum up, my issue is what do I replace $U^*$ in the local truncation error?










share|cite|improve this question
























  • What is $k$? Is it the time step?
    – Ian
    Nov 19 at 0:51












  • @Ian, yes $k$ is the time step.
    – dezdichado
    Nov 19 at 1:37






  • 2




    @Ian: It's a two-stage, one-step method. A two-step method (such as BDF2 by itself) would use both $U^{n-1}$ and $U^n$ for computing $U^{n+1}$.
    – Rahul
    Nov 19 at 20:59






  • 1




    Could you add some of your intermediate results? It seems strange that you get the same derivative with different powers of $k$, there could be some problem in unpacking the local error of the first stage while inserting in the second stage. For instance, inserting the first into the second stage one may get $U_{n+1}-U_n=frac k3(f(U_n)+f(U_*)+f(U_{n+1}))$ which is composite trapezoidal up to the error in $U_*$ to $U_{n+1/2}$.
    – LutzL
    Nov 20 at 10:20








  • 1




    Treat the first stage as an instance of the trapezoidal rule, and compute the error in $U^*$ with respect to $u(t_{n+1/2})$. Then plug it into the second stage.
    – Rahul
    Nov 21 at 15:05













up vote
0
down vote

favorite









up vote
0
down vote

favorite











The following method is called the TR-BDF2:
$$U^* = U^n+frac k4(f(U^n)+f(U^{*}))$$
$$U^{n+1}= frac 13(4U^* - U^n+kf(U^{n+1})).$$
Apparently, this one-step method is second-order accurate while being a one-step method. But I am stuck on proving the said second-order accuracy using Taylor expansion. The issue is that when I write the local truncation error, I get the following:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u^*+u(t_n)) - f(u(t_{n+1})) = -dfrac{k}{96}u'''(t_n)-frac {k^2} {12}u'''(t_n).$$
This means that I am dealing with the implicit, trapezoidal method step incorrectly. Basically, what should $u^*$ be in this case? If it is exactly $u(t_{n+frac{1}{2}})$, then there is no point even doing the implicit first step in the first place.



I would appreciate if someone makes this issue clear to me.



EDIT: So the only issue I am having is I do not know how to make sense of $U^*.$ That is, if there was $U^{n+0.5}$ instead, then everything is simple because I can expand $u(t_{n+1}), u(t_{n+0.5})$ all in Taylor expansion around the point $t = t_n$ and so establishing the desired order of accuracy is merely a task of some algebra. If this was the case, then the local truncation error will read as:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u(t_{n+0.5})+u(t_n)) - f(u(t_{n+1}))$$
and this is very simple to work with. So to sum up, my issue is what do I replace $U^*$ in the local truncation error?










share|cite|improve this question















The following method is called the TR-BDF2:
$$U^* = U^n+frac k4(f(U^n)+f(U^{*}))$$
$$U^{n+1}= frac 13(4U^* - U^n+kf(U^{n+1})).$$
Apparently, this one-step method is second-order accurate while being a one-step method. But I am stuck on proving the said second-order accuracy using Taylor expansion. The issue is that when I write the local truncation error, I get the following:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u^*+u(t_n)) - f(u(t_{n+1})) = -dfrac{k}{96}u'''(t_n)-frac {k^2} {12}u'''(t_n).$$
This means that I am dealing with the implicit, trapezoidal method step incorrectly. Basically, what should $u^*$ be in this case? If it is exactly $u(t_{n+frac{1}{2}})$, then there is no point even doing the implicit first step in the first place.



I would appreciate if someone makes this issue clear to me.



EDIT: So the only issue I am having is I do not know how to make sense of $U^*.$ That is, if there was $U^{n+0.5}$ instead, then everything is simple because I can expand $u(t_{n+1}), u(t_{n+0.5})$ all in Taylor expansion around the point $t = t_n$ and so establishing the desired order of accuracy is merely a task of some algebra. If this was the case, then the local truncation error will read as:
$$tau_{n+1} = frac 1k(3u(t_{n+1}) - 4u(t_{n+0.5})+u(t_n)) - f(u(t_{n+1}))$$
and this is very simple to work with. So to sum up, my issue is what do I replace $U^*$ in the local truncation error?







differential-equations analysis pde numerical-methods






share|cite|improve this question















share|cite|improve this question













share|cite|improve this question




share|cite|improve this question








edited Nov 21 at 3:03

























asked Nov 19 at 0:48









dezdichado

5,9341929




5,9341929












  • What is $k$? Is it the time step?
    – Ian
    Nov 19 at 0:51












  • @Ian, yes $k$ is the time step.
    – dezdichado
    Nov 19 at 1:37






  • 2




    @Ian: It's a two-stage, one-step method. A two-step method (such as BDF2 by itself) would use both $U^{n-1}$ and $U^n$ for computing $U^{n+1}$.
    – Rahul
    Nov 19 at 20:59






  • 1




    Could you add some of your intermediate results? It seems strange that you get the same derivative with different powers of $k$, there could be some problem in unpacking the local error of the first stage while inserting in the second stage. For instance, inserting the first into the second stage one may get $U_{n+1}-U_n=frac k3(f(U_n)+f(U_*)+f(U_{n+1}))$ which is composite trapezoidal up to the error in $U_*$ to $U_{n+1/2}$.
    – LutzL
    Nov 20 at 10:20








  • 1




    Treat the first stage as an instance of the trapezoidal rule, and compute the error in $U^*$ with respect to $u(t_{n+1/2})$. Then plug it into the second stage.
    – Rahul
    Nov 21 at 15:05


















  • What is $k$? Is it the time step?
    – Ian
    Nov 19 at 0:51












  • @Ian, yes $k$ is the time step.
    – dezdichado
    Nov 19 at 1:37






  • 2




    @Ian: It's a two-stage, one-step method. A two-step method (such as BDF2 by itself) would use both $U^{n-1}$ and $U^n$ for computing $U^{n+1}$.
    – Rahul
    Nov 19 at 20:59






  • 1




    Could you add some of your intermediate results? It seems strange that you get the same derivative with different powers of $k$, there could be some problem in unpacking the local error of the first stage while inserting in the second stage. For instance, inserting the first into the second stage one may get $U_{n+1}-U_n=frac k3(f(U_n)+f(U_*)+f(U_{n+1}))$ which is composite trapezoidal up to the error in $U_*$ to $U_{n+1/2}$.
    – LutzL
    Nov 20 at 10:20








  • 1




    Treat the first stage as an instance of the trapezoidal rule, and compute the error in $U^*$ with respect to $u(t_{n+1/2})$. Then plug it into the second stage.
    – Rahul
    Nov 21 at 15:05
















What is $k$? Is it the time step?
– Ian
Nov 19 at 0:51






What is $k$? Is it the time step?
– Ian
Nov 19 at 0:51














@Ian, yes $k$ is the time step.
– dezdichado
Nov 19 at 1:37




@Ian, yes $k$ is the time step.
– dezdichado
Nov 19 at 1:37




2




2




@Ian: It's a two-stage, one-step method. A two-step method (such as BDF2 by itself) would use both $U^{n-1}$ and $U^n$ for computing $U^{n+1}$.
– Rahul
Nov 19 at 20:59




@Ian: It's a two-stage, one-step method. A two-step method (such as BDF2 by itself) would use both $U^{n-1}$ and $U^n$ for computing $U^{n+1}$.
– Rahul
Nov 19 at 20:59




1




1




Could you add some of your intermediate results? It seems strange that you get the same derivative with different powers of $k$, there could be some problem in unpacking the local error of the first stage while inserting in the second stage. For instance, inserting the first into the second stage one may get $U_{n+1}-U_n=frac k3(f(U_n)+f(U_*)+f(U_{n+1}))$ which is composite trapezoidal up to the error in $U_*$ to $U_{n+1/2}$.
– LutzL
Nov 20 at 10:20






Could you add some of your intermediate results? It seems strange that you get the same derivative with different powers of $k$, there could be some problem in unpacking the local error of the first stage while inserting in the second stage. For instance, inserting the first into the second stage one may get $U_{n+1}-U_n=frac k3(f(U_n)+f(U_*)+f(U_{n+1}))$ which is composite trapezoidal up to the error in $U_*$ to $U_{n+1/2}$.
– LutzL
Nov 20 at 10:20






1




1




Treat the first stage as an instance of the trapezoidal rule, and compute the error in $U^*$ with respect to $u(t_{n+1/2})$. Then plug it into the second stage.
– Rahul
Nov 21 at 15:05




Treat the first stage as an instance of the trapezoidal rule, and compute the error in $U^*$ with respect to $u(t_{n+1/2})$. Then plug it into the second stage.
– Rahul
Nov 21 at 15:05










1 Answer
1






active

oldest

votes

















up vote
1
down vote



accepted










Define the difference in the first stage as $U^*=U^n+frac{k}2V$. Then
begin{align}
V&=frac12left[f(U^n)+fBigl(U^n+frac{k}2VBigr)right]\
&=f(U^n)+frac{k}4f'(U^n)V+frac{k^2}{16}f''(U^n)V^2+O(k^3)
end{align}

which can be solved to third order as
begin{align}
V&=f(U^n)+frac{k}4f'(U^n)left[f(U^n)+frac{k}4f'(U^n)V+O(k^2)right]
+frac{k^2}{16}f''(U^n)left[f(U^n)+O(k)right]^2+O(k^3)
\
&=f(U^n)+frac{k}4f'(U^n)f(U^n)+frac{k^2}{16}f'(U^n)^2f(U^n)+frac{k^2}{16}f''(U^n)f(U^n)^2+O(k^3)
end{align}

On the other hand,
begin{align}
U^{n+1/2}&=U^n+frac{k}2f(U^n)+frac{k^2}8f'(U^n)f(U^n)+frac{k^3}{48}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4) \
&=U^*-frac{k^3}{96}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4)
end{align}

so that on any exact solution one gets $U^*=u(t_n+frac k2)+frac{k^3}{96}u'''(t_n)$.



This should then contribute a second degree term, not a first degree term, in the error formula for the second stage.






share|cite|improve this answer





















  • ah, I see it now. Thanks!
    – dezdichado
    Nov 21 at 22:55











Your Answer





StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "69"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3004355%2fthe-second-order-accuracy-of-tr-bdf2-method%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
1
down vote



accepted










Define the difference in the first stage as $U^*=U^n+frac{k}2V$. Then
begin{align}
V&=frac12left[f(U^n)+fBigl(U^n+frac{k}2VBigr)right]\
&=f(U^n)+frac{k}4f'(U^n)V+frac{k^2}{16}f''(U^n)V^2+O(k^3)
end{align}

which can be solved to third order as
begin{align}
V&=f(U^n)+frac{k}4f'(U^n)left[f(U^n)+frac{k}4f'(U^n)V+O(k^2)right]
+frac{k^2}{16}f''(U^n)left[f(U^n)+O(k)right]^2+O(k^3)
\
&=f(U^n)+frac{k}4f'(U^n)f(U^n)+frac{k^2}{16}f'(U^n)^2f(U^n)+frac{k^2}{16}f''(U^n)f(U^n)^2+O(k^3)
end{align}

On the other hand,
begin{align}
U^{n+1/2}&=U^n+frac{k}2f(U^n)+frac{k^2}8f'(U^n)f(U^n)+frac{k^3}{48}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4) \
&=U^*-frac{k^3}{96}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4)
end{align}

so that on any exact solution one gets $U^*=u(t_n+frac k2)+frac{k^3}{96}u'''(t_n)$.



This should then contribute a second degree term, not a first degree term, in the error formula for the second stage.






share|cite|improve this answer





















  • ah, I see it now. Thanks!
    – dezdichado
    Nov 21 at 22:55















up vote
1
down vote



accepted










Define the difference in the first stage as $U^*=U^n+frac{k}2V$. Then
begin{align}
V&=frac12left[f(U^n)+fBigl(U^n+frac{k}2VBigr)right]\
&=f(U^n)+frac{k}4f'(U^n)V+frac{k^2}{16}f''(U^n)V^2+O(k^3)
end{align}

which can be solved to third order as
begin{align}
V&=f(U^n)+frac{k}4f'(U^n)left[f(U^n)+frac{k}4f'(U^n)V+O(k^2)right]
+frac{k^2}{16}f''(U^n)left[f(U^n)+O(k)right]^2+O(k^3)
\
&=f(U^n)+frac{k}4f'(U^n)f(U^n)+frac{k^2}{16}f'(U^n)^2f(U^n)+frac{k^2}{16}f''(U^n)f(U^n)^2+O(k^3)
end{align}

On the other hand,
begin{align}
U^{n+1/2}&=U^n+frac{k}2f(U^n)+frac{k^2}8f'(U^n)f(U^n)+frac{k^3}{48}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4) \
&=U^*-frac{k^3}{96}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4)
end{align}

so that on any exact solution one gets $U^*=u(t_n+frac k2)+frac{k^3}{96}u'''(t_n)$.



This should then contribute a second degree term, not a first degree term, in the error formula for the second stage.






share|cite|improve this answer





















  • ah, I see it now. Thanks!
    – dezdichado
    Nov 21 at 22:55













up vote
1
down vote



accepted







up vote
1
down vote



accepted






Define the difference in the first stage as $U^*=U^n+frac{k}2V$. Then
begin{align}
V&=frac12left[f(U^n)+fBigl(U^n+frac{k}2VBigr)right]\
&=f(U^n)+frac{k}4f'(U^n)V+frac{k^2}{16}f''(U^n)V^2+O(k^3)
end{align}

which can be solved to third order as
begin{align}
V&=f(U^n)+frac{k}4f'(U^n)left[f(U^n)+frac{k}4f'(U^n)V+O(k^2)right]
+frac{k^2}{16}f''(U^n)left[f(U^n)+O(k)right]^2+O(k^3)
\
&=f(U^n)+frac{k}4f'(U^n)f(U^n)+frac{k^2}{16}f'(U^n)^2f(U^n)+frac{k^2}{16}f''(U^n)f(U^n)^2+O(k^3)
end{align}

On the other hand,
begin{align}
U^{n+1/2}&=U^n+frac{k}2f(U^n)+frac{k^2}8f'(U^n)f(U^n)+frac{k^3}{48}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4) \
&=U^*-frac{k^3}{96}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4)
end{align}

so that on any exact solution one gets $U^*=u(t_n+frac k2)+frac{k^3}{96}u'''(t_n)$.



This should then contribute a second degree term, not a first degree term, in the error formula for the second stage.






share|cite|improve this answer












Define the difference in the first stage as $U^*=U^n+frac{k}2V$. Then
begin{align}
V&=frac12left[f(U^n)+fBigl(U^n+frac{k}2VBigr)right]\
&=f(U^n)+frac{k}4f'(U^n)V+frac{k^2}{16}f''(U^n)V^2+O(k^3)
end{align}

which can be solved to third order as
begin{align}
V&=f(U^n)+frac{k}4f'(U^n)left[f(U^n)+frac{k}4f'(U^n)V+O(k^2)right]
+frac{k^2}{16}f''(U^n)left[f(U^n)+O(k)right]^2+O(k^3)
\
&=f(U^n)+frac{k}4f'(U^n)f(U^n)+frac{k^2}{16}f'(U^n)^2f(U^n)+frac{k^2}{16}f''(U^n)f(U^n)^2+O(k^3)
end{align}

On the other hand,
begin{align}
U^{n+1/2}&=U^n+frac{k}2f(U^n)+frac{k^2}8f'(U^n)f(U^n)+frac{k^3}{48}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4) \
&=U^*-frac{k^3}{96}[f''(U^n)f(U^n)^2+f'(U^n)^2f(U^n)]+O(k^4)
end{align}

so that on any exact solution one gets $U^*=u(t_n+frac k2)+frac{k^3}{96}u'''(t_n)$.



This should then contribute a second degree term, not a first degree term, in the error formula for the second stage.







share|cite|improve this answer












share|cite|improve this answer



share|cite|improve this answer










answered Nov 21 at 16:42









LutzL

54.6k41953




54.6k41953












  • ah, I see it now. Thanks!
    – dezdichado
    Nov 21 at 22:55


















  • ah, I see it now. Thanks!
    – dezdichado
    Nov 21 at 22:55
















ah, I see it now. Thanks!
– dezdichado
Nov 21 at 22:55




ah, I see it now. Thanks!
– dezdichado
Nov 21 at 22:55


















draft saved

draft discarded




















































Thanks for contributing an answer to Mathematics Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3004355%2fthe-second-order-accuracy-of-tr-bdf2-method%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

mysqli_query(): Empty query in /home/lucindabrummitt/public_html/blog/wp-includes/wp-db.php on line 1924

How to change which sound is reproduced for terminal bell?

Can I use Tabulator js library in my java Spring + Thymeleaf project?