An error occurred while processing the template.
The following has evaluated to null or missing:
==> .vars['reserved-article-group-id']  [in template "161555#161602#ARTICLE-PAGE---HERO" at line 14, column 20]

----
Tip: It's the final [] step that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign groupId = .vars["reserved-art...  [in template "161555#161602#ARTICLE-PAGE---HERO" at line 14, column 1]
----
1<#assign namespace = randomNamespace /> 
2<#assign JSONFactoryUtil = staticUtil["com.liferay.portal.kernel.json.JSONFactoryUtil"] /> 
3<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
4<#assign containerId = randomNamespace /> 
5<#assign shareURL = themeDisplay.getPortalURL()+themeDisplay.getURLCurrent()/> 
6 
7<#-- Auto-assign ALL category to every article --> 
8<#assign assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") /> 
9<#assign assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") /> 
10<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
11  
12<#-- Get current JournalArticle --> 
13<#assign articleId = .vars['reserved-article-id'].data /> 
14<#assign groupId = .vars['reserved-article-group-id'].data?number /> 
15<#assign journalArticle = journalArticleLocalService.getArticle(groupId, articleId) /> 
16  
17<#-- Get AssetEntry for this article --> 
18<#assign assetEntry = assetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()) /> 
19  
20<#-- Your ALL category ID --> 
21<#assign allCategoryId = 4614994 /> 
22  
23<#-- Assign ALL category if not already set --> 
24<#if !assetEntry.getCategories()?seq_contains(assetCategoryLocalService.getCategory(allCategoryId))> 
25    <#assign categoryIds = assetEntry.getCategoryIds() + [allCategoryId] /> 
26    ${assetEntryLocalService.updateEntry( 
27        assetEntry.getUserId(), 
28        assetEntry.getGroupId(), 
29        assetEntry.getClassName(), 
30        assetEntry.getClassPK(), 
31        assetEntry.getUuid(), 
32        assetEntry.getClassTypeId(), 
33        categoryIds, 
34        assetEntry.getTagNames() 
35    )} 
36</#if> 
37 
38<div class="hero jmarticle__hero-main-container"> 
39    <div class="container"> 
40        <div class="row"> 
41            <div class="article__cont"> 
42                <h1 class="article__heading">${Title.getData()}</h1> 
43                <#if (SubTitle.getData())??> 
44                    <p class="article__para"> 
45                        ${SubTitle.getData()} 
46                    </p> 
47                </#if> 
48 
49                <#assign Date_Data=getterUtil.getString(Date.getData())> 
50                <#if validator.isNotNull(Date_Data)> 
51                    <p class="article__date"> 
52                        <#assign Date_DateObj=dateUtil.parseDate("yyyy-MM-dd", Date_Data, locale)> 
53                        ${dateUtil.getDate(Date_DateObj, "dd MMMM yyyy", locale)} 
54                    </p> 
55                </#if> 
56 
57                <#if Link_Title?? && Link_Title.getData()?has_content> 
58                    <#list Link_Title.getSiblings() as cur_Link_Title> 
59						<#if cur_Link_Title?? && cur_Link_Title.getData()?has_content> 
60							<#assign linkHref="#" /> 
61							<#assign target="" /> 
62							 
63							<#assign rowId = containerId + cur_Link_Title?index /> 
64							<#if cur_Link_Title.Link_Internal?? && cur_Link_Title.Link_Internal.getFriendlyUrl()?has_content> 
65								<#assign linkHref=cur_Link_Title.Link_Internal.getFriendlyUrl() /> 
66							<#elseif cur_Link_Title.Link_Media?? && cur_Link_Title.Link_Media.getData()?has_content> 
67								<#assign linkHref=cur_Link_Title.Link_Media.getData() /> 
68							<#elseif cur_Link_Title.Link_Mailto?? && cur_Link_Title.Link_Mailto.getData()?has_content> 
69								<#assign linkHref="mailto:" + cur_Link_Title.Link_Mailto.getData() /> 
70							<#elseif cur_Link_Title.Link_External?? && cur_Link_Title.Link_External.getData()?has_content> 
71								<#assign linkHref=cur_Link_Title.Link_External.getData() /> 
72							</#if> 
73							<#if (cur_Link_Title.Link_Target??) && (cur_Link_Title.Link_Target.getData())?has_content> 
74								<#assign target=cur_Link_Title.Link_Target.getData() /> 
75							</#if> 
76							<div id="blue_button_click_div" data-analytics-asset-type="custom"> 
77								<div class="jmarticle__hero-btn-list"> 
78									<a id="panel_blue_button_${rowId}" class="article__btn" href="${linkHref}" title="${cur_Link_Title.getData()}" target="${target}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)" > 
79										<span class="btn__text">${cur_Link_Title.getData()}</span> 
80										<span class="arrow__forward"></span> 
81									</a> 
82								</div> 
83							</div> 
84						</#if> 
85					</#list> 
86                </#if> 
87				  <div class="article-download-share"> 
88                
89                    <#if PDFTitle?? && PDFTitle.getData()?has_content> 
90                        <#assign title = PDFTitle.getData() /> 
91                        <#assign pdf_link = "#" /> 
92                        <#assign pdfrowId = containerId /> 
93                        <#if PDFTitle.PDF?? && PDFTitle.PDF.getData()?has_content> 
94                            <#assign pdf_link = PDFTitle.PDF.getData() /> 
95                        </#if> 
96                        <div class="article-download"> 
97                            <div id="blue_button_click_div" data-analytics-asset-type="custom"> 
98                                <div class="jmarticle__hero-btn-list"> 
99                                    <a id="panel_blue_button_${pdfrowId}" class="article__btn" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)"> 
100                                        <span class="btn__text">${title}</span> 
101                                        <span class="arrow__forward"></span> 
102                                    </a> 
103                                   <a id="panel_blue_button_${pdfrowId}" class="article__btn-mobile" href="${pdf_link}"             title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)"> 
104                                       <img src="${themeDisplay.getPathThemeImages()}/new__jm__images/download-white-icon.svg" alt="twitter image"/> 
105                                    </a> 
106                                </div> 
107                            </div> 
108                        </div> 
109                    </#if> 
110                                 
111                </div> 
112                 
113            </div> 
114        </div> 
115       <#if (ImageLarge.getData())?? && ImageLarge.getData() != ""> 
116            <div class="row jmarticle__hero-banner" id="jmarticle__hero-${namespace}"  
117            style="background-image: url(${ImageLarge.getData()})"> 
118        </#if> 
119 
120        </div> 
121    </div> 
122</div> 
123 
124<#if Author?? && Author.getData()?has_content> 
125    <div class="jmarticle__author-info"> 
126        <div class="container"> 
127            <div class="hero__bar"> 
128                     <#list Author.getSiblings() as cur_Author> 
129                            <#if cur_Author?? && cur_Author.getData()?has_content> 
130                                <#assign 
131                                    webContentData = jsonFactoryUtil.createJSONObject(cur_Author.getData()) 
132                                    gId = groupId 
133                                    journalArticle = journalArticleLocalService.getArticleByUrlTitle(gId, webContentData.title) 
134                                    docXML = saxReaderUtil.read(journalArticle.getContent()) 
135 
136                                    fName = docXML.valueOf("//dynamic-element[@name='FullName']/dynamic-content/text()") 
137                                    jobTitle = docXML.valueOf("//dynamic-element[@name='JobTitle']/dynamic-content/text()") 
138                                    role = docXML.valueOf("//dynamic-element[@name='ContactInfo']/dynamic-content/text()") 
139                                    photoXML = docXML.valueOf("//dynamic-element[@name='Photo']/dynamic-content/text()") 
140                                    photoSrc = JSONFactoryUtil.createJSONObject(photoXML).getString("uuid") 
141                                    fullName = docXML.valueOf("//dynamic-element[@name='Title']/dynamic-content/text()") 
142                                    authorImageXML = docXML.valueOf("//dynamic-element[@name='ImageLarge']/dynamic-content/text()") 
143                                    authImageSrc = JSONFactoryUtil.createJSONObject(authorImageXML).getString("uuid") 
144                                    summary = docXML.valueOf("//dynamic-element[@name='Summary']/dynamic-content/text()") 
145                                /> 
146 
147                                    <div class="author"> 
148                                        <figure class="author__image"> 
149                                            <#if authImageSrc?? && authImageSrc?has_content> 
150                                                <img src="/documents/${groupId}/${authImageSrc}" alt="${fullName}" class="author_img_class_new"> 
151                                            <#elseif photoSrc?? && photoSrc?has_content> 
152                                                <img src="/documents/${groupId}/${photoSrc}" alt="${fName}" class="author_img_class_new"> 
153                                            </#if> 
154                                        </figure> 
155                                        <div class="author__details d-flex flex-column"> 
156                                            <h3 class="author__name"> 
157                                                <a rel="author"> 
158                                                    <#if fullName?? && fullName?has_content> 
159                                                        ${fullName} 
160                                                    <#elseif fName?? && fName?has_content> 
161                                                        ${fName} 
162                                                    </#if> 
163                                                </a> 
164                                            </h3> 
165                                            <p class="author__desc text-size-a author_job_title"> 
166                                                <#if jobTitle?? && jobTitle?has_content> 
167                                                    ${jobTitle} 
168                                                </#if> 
169                                            </p> 
170                                            <span> 
171                                                <p class="author__desc text-size-a"> 
172                                                    <#if summary?? && summary?has_content> 
173                                                        ${summary} 
174                                                    </#if> 
175                                                    <#if role?? && role?has_content> 
176                                                        ${role} 
177                                                    </#if> 
178                                                </p> 
179                                            </span> 
180                                        </div> 
181                                        <div> 
182                                            <div class="author__contact"> 
183                                                <ul class="author__contact-list"> 
184                                                </ul> 
185                                            </div> 
186                                        </div> 
187                                    </div> 
188                             </#if> 
189                     </#list> 
190            </div> 
191    	</div> 
192    </div> 
193</#if> 
194 
195 
196 
197<div class="container"> 
198    <div class="row"> 
199        <div class="article__intro"> 
200            <#if (Introduction.getData())??> 
201            	${Introduction.getData()} 
202            </#if> 
203 
204           <div class="article-download-share"> 
205                
206                    <#if PDFTitle?? && PDFTitle.getData()?has_content> 
207                        <#assign title = PDFTitle.getData() /> 
208                        <#assign pdf_link = "#" /> 
209                        <#assign pdfrowId = containerId /> 
210                        <#if PDFTitle.PDF?? && PDFTitle.PDF.getData()?has_content> 
211                            <#assign pdf_link = PDFTitle.PDF.getData() /> 
212                        </#if> 
213                        <div class="article-download"> 
214                            <div id="blue_button_click_div" data-analytics-asset-type="custom"> 
215                                <div class="jmarticle__hero-btn-list"> 
216                                    <a id="panel_blue_button_${pdfrowId}" class="article__btn" href="${pdf_link}" title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)"> 
217                                        <span class="btn__text">${title}</span> 
218                                        <span class="arrow__forward"></span> 
219                                    </a> 
220                                   <a id="panel_blue_button_${pdfrowId}" class="article__btn-mobile" href="${pdf_link}"             title="${title}" data-analytics-asset-action="click" onclick="onBlueButtonClick(this)"> 
221                                       <img src="${themeDisplay.getPathThemeImages()}/new__jm__images/download-white-icon.svg" alt="twitter image"/> 
222                                    </a> 
223                                </div> 
224                            </div> 
225                        </div> 
226                    </#if>               
227                
228                   
229               <div class="article-share"> 
230                   <a href="https://linkedin.com/shareArticle?url=${shareURL}&title=<#if (Title.getData())??>${Title.getData()}</#if>" target="_blank"> 
231                       <img class="socialicons__img" src="${themeDisplay.getPathThemeImages()}/new__jm__images/social_icons-LinkedIN.png" alt="twitter image"/> 
232                    </a> 
233                      <a  href="https://twitter.com/share?url=${shareURL}&text=<#if (Title.getData())??>${Title.getData()}</#if>" target="_blank"> 
234                       <img class="socialicons__img" src="${themeDisplay.getPathThemeImages()}/new__jm__images/social_icons-Twitter.png" alt="twitter image"/> 
235                    </a> 
236                </div> 
237            </div> 
238       
239        </div> 
240    </div> 
241</div> 
242 
243<style> 
244    img.author_img_class_new { 
245        width: 100% !important; 
246        height: 100% !important; 
247        position: absolute; 
248        margin: auto; 
249        top: 0; 
250        bottom: 0; 
251
252     
253    .article__btn:focus-visible { 
254    outline: 2px solid blue !important; 
255
256 
257@media (min-width: 320px) and (max-width: 650px) { 
258	.article__intro li { 
259	   margin-left: -32px !important;		 
260
261	.journal-content-article .container .article__intro { 
262    margin-top: 22px !important; 
263
264
265@media (min-width: 540px) and (max-width: 834px) { 
266    .article__intro li { 
267	      margin-left: -32px !important;		 
268
269    .article__intro { 
270        margin: 60px 15px 0 5px !important;         
271
272
273  
274@media (min-width: 320px) and (max-width: 539px){ 
275.jmarticle__author-info { 
276    padding: 0px 0; 
277
278.jmarticle__author-info .author__image { 
279    width: 39px; 
280    height: 40px; 
281
282 
283.jmarticle__author-info .author__name a { 
284    line-height: 0px; 
285    font-size: 18px !important; 
286    margin-right: 10px; 
287
288 
289.jmarticle__author-info .author__desc { 
290     
291    line-height: 14px; 
292    font-size: 12px !important; 
293    margin-bottom: 7px; 
294
295
296  
297</style> 

The simplest and most abundant element in the universe is increasingly seen as holding the key to tackling Earth’s most challenging problem – climate change. It’s an oft-repeated joke that ‘hydrogen is the fuel of the future, and always will be’, but its time really has come at last. Soon we will see hydrogen working alongside other green technologies – cutting carbon emissions and helping to achieve net zero.

Hydrogen can help decarbonise activities that electrification cannot. Think shipping, HGV trucks and buses and industrial processes that need very high temperatures, such as steelmaking. We cannot reach net zero without it.

Technological advances in this field are everywhere. Johnson Matthey’s HyCOgenTM process, for example, uses clean hydrogen and atmospheric or waste CO2 to produce syngas, which can be upgraded into sustainable aviation fuel, for example, and dropped into existing supplies.

As a fuel, hydrogen leaves behind only water, and none of the CO2 or pollutants that are associated with fossil fuels. But before we can really declare this to be a clean-energy vector, we need to consider the carbon footprint associated with its production, and it’s here that things start to get complicated.

 

Front runners

Right now, most hydrogen is made by reforming natural gas – a process that creates so-called ‘grey hydrogen’. But this process also yields CO2, making it ripe for replacement. 

We will rely on two technologies in the future: the first is ‘blue hydrogen’ – created in the same way as grey, but with the troublesome CO2 captured and stored. Second, there is green hydrogen, produced by the electrolysis of water using electricity from renewable sources, such as wind or solar. There's a rainbow of other colours too, including pink (nuclear), turquoise (methane pyrolysis) and even white (naturally occurring and mined from rock). 

However, I believe the hydrogen colour-naming convention doesn’t tell the full story behind hydrogen production and this practice has now run its course. It has been an engaging and memorable way to classify what is, ironically, a colourless gas, but what’s needed now is a more nuanced approach to hydrogen nomenclature.

 

Let's talk carbon

It’s more appropriate to talk about the carbon intensity of hydrogen, rather than just declare one colour to be environmentally better than another. The ease of the colour-naming convention tends to invite overly simplistic comparisons of hydrogen production routes. For instance, it’s common to see arguments favouring green hydrogen (electrolysis from renewable electricity) over blue hydrogen (natural gas + CCS) because the blue variant still produces CO2, and dealing with this is both expensive and has a carbon footprint all of its own.  

However, this argument fails to acknowledge the ease with which existing grey hydrogen plants can be retrofitted with CCS to make them blue – a process that has a much smaller carbon footprint than building a green hydrogen plant from scratch. For instance, JM’s suite of CLEANPACETM technologies enables the revamp of steam methane reformers with existing, proven technology to achieve CO2 emission reductions of up to 95%. Such retrofitted blue-hydrogen plants have an important role to play; expanding the hydrogen market in which new blue hydrogen plants, and green hydrogen electrolysis facilities, can then thrive.

The colour naming convention also fails to take into account the technology variations within these categories. As analysis by the Hydrogen Council shows, the greenhouse gas emissions associated with green hydrogen production depend on how the electricity was generated. 

Similarly, a blue hydrogen analysis by UK government department BEIS highlights the impact of the reforming method on lifecycle emissions, with autothermal reformers (ATR) being more efficient and more compatible with CCS than steam methane reforming (SMR). Though, it's also worth noting that half of the hydrogen produced through SMR actually comes from the water used, not the methane. At JM, our own LCHTM technology captures more than 95% of associated CO2 emissions, and has best-in-class environmental credentials for ATR blue hydrogen production.

Blue hydrogen is often looked on as an intermediate technology – something to tide us over until green hydrogen electrolysis plants are ready to take over. We don’t see things this way. 

 

Complementary solutions

Rather than two opponents – one in the blue corner, the other in the green corner, slugging it out for supremacy – we see blue hydrogen and green hydrogen as being pieces of the same jigsaw. In the future, we’ll need both methods, working together to diversify supply and boost energy security. Diversity is important to insulate the market from price fluctuations. Both of these hydrogen generation methods have dependencies: CCS network capacity and natural gas prices in the case of blue hydrogen; and the availability and price of low carbon electricity for green.

Other factors to consider are speed and scale: blue hydrogen is ready to go now; green hydrogen will need until about 2030. At JM we believe every molecule of CO2 entering the atmosphere is a problem – and something that blue hydrogen can help prevent in the short and medium term. Blue hydrogen’s potential to ‘move the needle’ quickly can be seen in the HyNet clean hydrogen project in the north of England, which has adopted JM’s LCH technology. When this comes on-stream in 2025, production capacity will be 3 TWh, with the potential to scale to 30 TWh by 2030. In contrast, Shell Rotterdam – reported to be Europe’s biggest renewable electrolytic hydrogen production facility, will produce about 1 TWh when it comes onstream in 2025. 

The suitability of hydrogen production methods will also change according to location. Newly built blue hydrogen plants will often be more attractive to countries that have reserves of natural gas and the geological formations to deal with the captured CO2. The HyNet project in the UK is a great example. 

On the other hand, green hydrogen will suit territories that have an abundance of renewable electricity. For example, in NEOM – Saudi Arabia’s futuristic city under construction – the country’s bountiful solar and wind resources will help produce 1.2 million tonnes of green hydrogen every year by 2026. And in California, approximately 1TW of solar electricity is wasted every year, because an outdated electricity grid can’t take it. That’s an amount of energy equivalent to four nuclear reactors, all of which could be stored in the form of green hydrogen – or converted into a high-density energy carrier such as ammonia.

 

Language matters

For us to move away from colours and concentrate on carbon footprint, we’ll need to change our language around hydrogen. Defining and implementing proper low carbon hydrogen standards is essential if all stakeholders are to know what ‘clean hydrogen’ actually means. Grouping hydrogen production by carbon intensity – not colour – as the US has proposed in its Inflation Reduction act, gives clarity and freedom to project developers when choosing technology and seeking funding.

To achieve a low carbon hydrogen economy, we are calling for technologically agnostic standards to be adopted as soon as possible. These should be global, or at least be regionally aligned, to facilitate a worldwide market for clean hydrogen – something that would blur the distinction between colours even more. But where there are standards there also needs to be regulation, and there are important questions that need to be addressed here. Implementation and adoption are key but who will regulate, incentivise and direct the use of these standards? Will it be left to national governments, or an international agency?

Numerous low carbon hydrogen standards are already in development. While we are happy to work within any framework, we want to see the inclusion of upstream emissions (such as fugitive methane emissions and escaping CO2). To this end, the most sensible approach seems to be a standard that covers well-to-gate emissions associated with hydrogen production.

Having a global infrastructure standard for pipe and fittings would also help lower hydrogen proliferation costs.


The Hydrogen Council estimates that 18% of all our energy will be made from hydrogen sources every year by 2050. Just as there’s no magic bullet for providing the world’s green energy needs, so there is no one-size-fits-all approach to clean hydrogen production. We need a diverse network of suppliers around the world, each using the right method for them. 

Our language – and our preconceptions about existing technologies – must change and new ways of measuring carbon intensity must be found. It’s an incredibly exciting time to be involved with hydrogen – and at JM we’re proud to be at the heart of it

 

This article was originally published in the November 2022 issue of Decarbonising Technology

Read more

Products and services

Find out about JM's hydrogen offer

Explore