{"id":389,"date":"2023-04-29T11:28:37","date_gmt":"2023-04-29T02:28:37","guid":{"rendered":"http:\/\/ec.me.tut.ac.jp\/?page_id=389"},"modified":"2026-09-12T19:11:34","modified_gmt":"2026-09-12T10:11:34","slug":"publications","status":"publish","type":"page","link":"https:\/\/ec.me.tut.ac.jp\/en\/publications","title":{"rendered":"Publications"},"content":{"rendered":"\n<p class=\"has-medium-font-size wp-block-paragraph\">Hiroshi Yokoyama<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/researchmap.jp\/h-yokoyama\/?lang=en\">Researchmap (en)<\/a>, <a href=\"https:\/\/www.scopus.com\/authid\/detail.uri?authorId=51563039800\">Scopus<\/a>, <a href=\"https:\/\/ec.me.tut.ac.jp\/yokoyama\/pub\/index.html\">Full list<\/a><\/p>\n\n\n\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\">Takashi Kuraishi <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/researchmap.jp\/kuraishi_19?lang=en\">Researchmap (en)<\/a><\/p>\n\n\n\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">Recent publications<\/mark><\/strong><\/p>\n\n\n\n    <div\n        id=\"scopus-publications-82857\"\n        class=\"scopus-recent-publications\"\n    >\n        <p class=\"scopus-loading\">\n            Loading publications...\n        <\/p>\n    <\/div>\n\n    <script>\n    (function () {\n\n        const container =\n            document.getElementById(\n                \"scopus-publications-82857\"            );\n\n        const scopusApiKey =\n            \"3045e403a1a6a5942a7066ae012d8e52\";\n\n        const scopusAuthorId =\n            String(\n                \"51563039800\"            );\n\n        const targetOrcid =\n            \"0000-0003-1857-665X\";\n\n        const publicationLimit =\n            10;\n\n        const batchSize =\n            25;\n\n        const maxScan =\n            100;\n\n\n        \/*\n         * Normalize ORCID.\n         *\/\n        function normalizeOrcid(value) {\n\n            if (!value) {\n                return '';\n            }\n\n            return String(value)\n                .replace('https:\/\/orcid.org\/', '')\n                .replace('http:\/\/orcid.org\/', '')\n                .trim()\n                .toUpperCase();\n        }\n\n\n        \/*\n         * Normalize DOI.\n         *\/\n        function normalizeDoi(value) {\n\n            if (!value) {\n                return '';\n            }\n\n            return String(value)\n                .replace(\/^https?:\\\/\\\/(dx\\.)?doi\\.org\\\/\/i, '')\n                .trim()\n                .toLowerCase();\n        }\n\n\n        \/*\n         * Get Scopus URL.\n         *\/\n        function getScopusURL(publication) {\n\n            if (!Array.isArray(publication.link)) {\n                return '';\n            }\n\n            for (const link of publication.link) {\n\n                if (\n                    link['@ref'] === 'scopus' &&\n                    link['@href']\n                ) {\n                    return link['@href'];\n                }\n            }\n\n            return '';\n        }\n\n\n        \/*\n         * Fetch one batch from Scopus.\n         *\n         * STANDARD view is used so that the search\n         * works outside the institutional network.\n         *\/\n        async function fetchScopusBatch(start) {\n\n            const query =\n                'AU-ID(' + scopusAuthorId + ')';\n\n            const params =\n                new URLSearchParams({\n                    query: query,\n                    count: String(batchSize),\n                    start: String(start),\n                    sort: '-coverDate',\n                    view: 'STANDARD',\n                    apiKey: scopusApiKey,\n                    httpAccept: 'application\/json'\n                });\n\n            const apiURL =\n                'https:\/\/api.elsevier.com\/content\/search\/scopus?' +\n                params.toString();\n\n            const response =\n                await fetch(apiURL);\n\n            if (!response.ok) {\n\n                throw new Error(\n                    'Scopus API returned HTTP ' +\n                    response.status\n                );\n            }\n\n            return response.json();\n        }\n\n\n        \/*\n         * Fetch OpenAlex records for multiple DOIs\n         * in one request.\n         *\/\n        async function fetchOpenAlexByDois(dois) {\n\n            if (!Array.isArray(dois) || dois.length === 0) {\n                return new Map();\n            }\n\n            const doiValues =\n                dois.map(function(doi) {\n                    return (\n                        'https:\/\/doi.org\/' +\n                        normalizeDoi(doi)\n                    );\n                });\n\n            const params =\n                new URLSearchParams({\n                    filter:\n                        'doi:' + doiValues.join('|'),\n                    per_page:\n                        String(doiValues.length),\n                    select:\n                        'doi,authorships'\n                });\n\n            const apiURL =\n                'https:\/\/api.openalex.org\/works?' +\n                params.toString();\n\n            const response =\n                await fetch(apiURL);\n\n            if (!response.ok) {\n\n                throw new Error(\n                    'OpenAlex API returned HTTP ' +\n                    response.status\n                );\n            }\n\n            const data =\n                await response.json();\n\n            const workMap =\n                new Map();\n\n            if (!Array.isArray(data.results)) {\n                return workMap;\n            }\n\n            data.results.forEach(function(work) {\n\n                const doi =\n                    normalizeDoi(work.doi);\n\n                if (doi) {\n                    workMap.set(doi, work);\n                }\n            });\n\n            return workMap;\n        }\n\n\n        \/*\n         * Check whether the target ORCID is\n         * first or last author.\n         *\/\n        function isTargetFirstOrLast(work) {\n\n            if (\n                !work ||\n                !Array.isArray(work.authorships)\n            ) {\n                return false;\n            }\n\n            const normalizedTargetOrcid =\n                normalizeOrcid(targetOrcid);\n\n            return work.authorships.some(\n                function(authorship) {\n\n                    if (\n                        !authorship.author ||\n                        !authorship.author.orcid\n                    ) {\n                        return false;\n                    }\n\n                    const authorOrcid =\n                        normalizeOrcid(\n                            authorship.author.orcid\n                        );\n\n                    const position =\n                        authorship.author_position || '';\n\n                    return (\n                        authorOrcid ===\n                            normalizedTargetOrcid &&\n                        (\n                            position === 'first' ||\n                            position === 'last'\n                        )\n                    );\n                }\n            );\n        }\n\n\n        \/*\n         * Obtain author names from OpenAlex\n         * in publication order.\n         *\/\n        function getOpenAlexAuthorNames(work) {\n\n            if (\n                !work ||\n                !Array.isArray(work.authorships)\n            ) {\n                return [];\n            }\n\n            return work.authorships\n                .map(function(authorship) {\n\n                    if (authorship.raw_author_name) {\n                        return authorship.raw_author_name;\n                    }\n\n                    if (\n                        authorship.author &&\n                        authorship.author.display_name\n                    ) {\n                        return (\n                            authorship.author.display_name\n                        );\n                    }\n\n                    return '';\n                })\n                .filter(function(name) {\n                    return name !== '';\n                });\n        }\n\n\n        \/*\n         * Find recent papers for which the target\n         * author is first or last author.\n         *\/\n        async function findPublications() {\n\n            const selected = [];\n\n            let start = 0;\n            let totalResults = null;\n\n            while (\n                selected.length < publicationLimit &&\n                start < maxScan\n            ) {\n\n                const data =\n                    await fetchScopusBatch(start);\n\n                if (\n                    !data['search-results'] ||\n                    !Array.isArray(\n                        data['search-results']['entry']\n                    )\n                ) {\n                    break;\n                }\n\n                const searchResults =\n                    data['search-results'];\n\n                const publications =\n                    searchResults.entry;\n\n                if (totalResults === null) {\n\n                    totalResults =\n                        parseInt(\n                            searchResults[\n                                'opensearch:totalResults'\n                            ] || 0,\n                            10\n                        );\n                }\n\n\n                \/*\n                 * Collect DOIs from this Scopus batch.\n                 *\/\n                const dois = [];\n\n                publications.forEach(\n                    function(publication) {\n\n                        const doi =\n                            normalizeDoi(\n                                publication['prism:doi']\n                            );\n\n                        if (doi) {\n                            dois.push(doi);\n                        }\n                    }\n                );\n\n\n                \/*\n                 * Obtain authorship information\n                 * from OpenAlex in one batch request.\n                 *\/\n                const openAlexWorks =\n                    await fetchOpenAlexByDois(dois);\n\n\n                \/*\n                 * Keep only first\/last-author papers.\n                 *\/\n                for (const publication of publications) {\n\n                    const doi =\n                        normalizeDoi(\n                            publication['prism:doi']\n                        );\n\n                    if (!doi) {\n                        continue;\n                    }\n\n                    const openAlexWork =\n                        openAlexWorks.get(doi);\n\n                    if (\n                        !openAlexWork ||\n                        !isTargetFirstOrLast(\n                            openAlexWork\n                        )\n                    ) {\n                        continue;\n                    }\n\n                    selected.push({\n                        scopus: publication,\n                        openalex: openAlexWork\n                    });\n\n                    if (\n                        selected.length >=\n                        publicationLimit\n                    ) {\n                        break;\n                    }\n                }\n\n\n                start += batchSize;\n\n                if (\n                    publications.length < batchSize ||\n                    start >= totalResults\n                ) {\n                    break;\n                }\n            }\n\n            return selected;\n        }\n\n\n        \/*\n         * Create one publication entry.\n         *\/\n        function createPublicationItem(record) {\n\n            const publication =\n                record.scopus;\n\n            const openAlexWork =\n                record.openalex;\n\n            const item =\n                document.createElement('li');\n\n\n            \/*\n             * Title.\n             *\/\n            const title =\n                publication['dc:title'] || '';\n\n            const doi =\n                publication['prism:doi'] || '';\n\n            const titleElement =\n                document.createElement('strong');\n\n            if (doi) {\n\n                const titleLink =\n                    document.createElement('a');\n\n                titleLink.href =\n                    'https:\/\/doi.org\/' + doi;\n\n                titleLink.target =\n                    '_blank';\n\n                titleLink.rel =\n                    'noopener noreferrer';\n\n                titleLink.textContent =\n                    title;\n\n                titleElement.appendChild(\n                    titleLink\n                );\n\n            } else {\n\n                titleElement.textContent =\n                    title;\n            }\n\n            item.appendChild(titleElement);\n\n\n            \/*\n             * Authors from OpenAlex.\n             *\/\n            const authorNames =\n                getOpenAlexAuthorNames(\n                    openAlexWork\n                );\n\n            if (authorNames.length > 0) {\n\n                item.appendChild(\n                    document.createElement('br')\n                );\n\n                const authorLine =\n                    document.createElement('span');\n\n                authorLine.textContent =\n                    authorNames.join(', ');\n\n                item.appendChild(authorLine);\n            }\n\n\n            \/*\n             * Journal information from Scopus.\n             *\/\n            const journal =\n                publication[\n                    'prism:publicationName'\n                ] || '';\n\n            const volume =\n                publication[\n                    'prism:volume'\n                ] || '';\n\n            const issue =\n                publication[\n                    'prism:issueIdentifier'\n                ] || '';\n\n            const pages =\n                publication[\n                    'prism:pageRange'\n                ] || '';\n\n            const date =\n                publication[\n                    'prism:coverDate'\n                ] || '';\n\n            const year =\n                date\n                    ? date.substring(0, 4)\n                    : '';\n\n            const info = [];\n\n            if (journal) {\n                info.push(journal);\n            }\n\n            if (volume) {\n                info.push(\n                    'Vol. ' + volume\n                );\n            }\n\n            if (issue) {\n                info.push(\n                    'No. ' + issue\n                );\n            }\n\n            if (pages) {\n                info.push(\n                    'pp. ' + pages\n                );\n            }\n\n            if (year) {\n                info.push(year);\n            }\n\n            if (info.length > 0) {\n\n                item.appendChild(\n                    document.createElement('br')\n                );\n\n                const infoElement =\n                    document.createElement('span');\n\n                infoElement.textContent =\n                    info.join(', ');\n\n                item.appendChild(\n                    infoElement\n                );\n            }\n\n\n            \/*\n             * DOI.\n             *\/\n            if (doi) {\n\n                item.appendChild(\n                    document.createElement('br')\n                );\n\n                item.appendChild(\n                    document.createTextNode(\n                        'DOI: '\n                    )\n                );\n\n                const doiLink =\n                    document.createElement('a');\n\n                doiLink.href =\n                    'https:\/\/doi.org\/' + doi;\n\n                doiLink.target =\n                    '_blank';\n\n                doiLink.rel =\n                    'noopener noreferrer';\n\n                doiLink.textContent =\n                    doi;\n\n                item.appendChild(doiLink);\n            }\n\n\n            \/*\n             * Scopus link.\n             *\/\n            const scopusURL =\n                getScopusURL(publication);\n\n            if (scopusURL) {\n\n                item.appendChild(\n                    document.createElement('br')\n                );\n\n                const scopusLink =\n                    document.createElement('a');\n\n                scopusLink.href =\n                    scopusURL;\n\n                scopusLink.target =\n                    '_blank';\n\n                scopusLink.rel =\n                    'noopener noreferrer';\n\n                scopusLink.textContent =\n                    'View on Scopus';\n\n                item.appendChild(scopusLink);\n            }\n\n            return item;\n        }\n\n\n        \/*\n         * Main process.\n         *\/\n        findPublications()\n\n        .then(function(publications) {\n\n            if (publications.length === 0) {\n\n                container.innerHTML =\n                    '<p>No matching publications found.<\/p>';\n\n                return;\n            }\n\n            const list =\n                document.createElement('ol');\n\n            publications.forEach(\n                function(publication) {\n\n                    list.appendChild(\n                        createPublicationItem(\n                            publication\n                        )\n                    );\n                }\n            );\n\n            container.innerHTML = '';\n\n            container.appendChild(list);\nconst attribution =\n    document.createElement('p');\n\nattribution.className =\n    'scopus-attribution';\n\nattribution.textContent =\n    'Publication data provided by Scopus. ' +\n    'Author information supplemented by OpenAlex.';\n\ncontainer.appendChild(attribution);\n        })\n\n        .catch(function(error) {\n\n            console.error(\n                'Publication retrieval:',\n                error\n            );\n\n            container.innerHTML =\n                '<p>Publications could not be retrieved.<\/p>';\n        });\n\n    })();\n    <\/script>\n\n    \n\n\n\n<div style=\"height:31px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-medium-font-size wp-block-paragraph\"><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">News<\/mark><\/strong><\/p>\n\n\n<ul class=\"wp-block-latest-posts__list wp-block-latest-posts is-layout-flow wp-block-latest-posts-is-layout-flow\"><li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ec.me.tut.ac.jp\/en\/archives\/1198\">Journal of Sound and Vibration, vol.644<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ec.me.tut.ac.jp\/en\/archives\/1185\">Applied Thermal Engineering, vol.304<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ec.me.tut.ac.jp\/en\/archives\/1098\">International Journal of Heat and Mass Transfer, 2026<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ec.me.tut.ac.jp\/en\/archives\/1068\">The 11th JSME-KSME Thermal and Fluids Engineering Conference<\/a><\/li>\n<li><a class=\"wp-block-latest-posts__post-title\" href=\"https:\/\/ec.me.tut.ac.jp\/en\/archives\/913\">Generation of aerodynamic sound around an expanding pipe with orifice plates, J. Fluid Sci. Tech.<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Hiroshi Yokoyama Researchmap (en), Scopus, Full list Takashi Kuraishi Researchmap (en) Recent publications News<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_locale":"en_US","_original_post":"http:\/\/ec.me.tut.ac.jp\/wp\/?page_id=168","_vk_print_noindex":"","sitemap_hide":"","vkExUnit_sitemap":"","_veu_custom_css":"","veu_display_promotion_alert":"common","_exclude_from_list_pages":"","vkexunit_cta_each_option":"","vkExUnit_childPageIndex":"","vkExUnit_pageList_ancestor":"","vkExUnit_contact_enable":"","footnotes":""},"class_list":["post-389","page","type-page","status-publish","hentry","en-US"],"veu_head_title_object":{"title":"","add_site_title":""},"_links":{"self":[{"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/pages\/389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/comments?post=389"}],"version-history":[{"count":14,"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/pages\/389\/revisions"}],"predecessor-version":[{"id":1414,"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/pages\/389\/revisions\/1414"}],"wp:attachment":[{"href":"https:\/\/ec.me.tut.ac.jp\/wp-json\/wp\/v2\/media?parent=389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}