diff --git a/.github/workflows/update-search.yml b/.github/workflows/update-search.yml index b7fdb3c..2316383 100644 --- a/.github/workflows/update-search.yml +++ b/.github/workflows/update-search.yml @@ -2,7 +2,7 @@ name: Update Search Database on: schedule: - - cron: '0 */4 * * *' # Run every 4 hours + - cron: '0 */12 * * *' # Run every 12 hours workflow_dispatch: # Allow manual trigger push: branches: [ main ] @@ -10,6 +10,8 @@ on: - '**/*.md' - '**/*.html' - 'scripts/generate_search_db.rb' + - 'scripts/fetch_blog_content.js' + - 'scripts/package.json' jobs: update-search: @@ -24,13 +26,30 @@ jobs: ruby-version: '3.2' bundler-cache: true - - name: Install dependencies + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: scripts/package-lock.json + + - name: Install Ruby dependencies run: | gem install bundler bundle config path vendor/bundle bundle install gem install nokogiri + - name: Install Node.js dependencies + run: | + cd scripts + npm ci + + - name: Fetch blog content + run: | + cd scripts + node fetch_blog_content.js + - name: Generate search database run: ruby scripts/generate_search_db.rb diff --git a/.gitignore b/.gitignore index 9b9b004..a16477c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +# Jekyll build output _site/ .sass-cache/ .jekyll-cache/ @@ -10,3 +11,28 @@ vendor/ .cursorrules **/copilot-instructions.md .DS_Store + +# Node.js dependencies +node_modules/ +scripts/node_modules/ +scripts/package-lock.json +scripts/blog_content.json + +# IDE and editor files +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS generated files +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Search database (generated file) +assets/js/search_db.json +_site/assets/js/search_db.json diff --git a/README.md b/README.md index 89b989e..b9efa02 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ A static website for the Computational Multiphase Physics Laboratory, built with [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=DOI&message=NUMBER&color=orange)](URL) [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=Open%20Access&color=orange)](URL) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](URL) - [![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](URL) + [![Blog](https://img.shields.io/badge/Blog-blogs.comphy--lab.org-blue?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org) ``` ### Search Functionality diff --git a/_layouts/default.html b/_layouts/default.html index be6352c..abde1b0 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -121,7 +121,7 @@
  • Team
  • Research
  • Join Us
  • -
  • Blog
  • +
  • Blog
  • diff --git a/_layouts/research.html b/_layouts/research.html index efe5af7..69fca97 100644 --- a/_layouts/research.html +++ b/_layouts/research.html @@ -177,7 +177,8 @@
  • About
  • Team
  • Research
  • -
  • Blog
  • +
  • Join Us
  • +
  • Blog
  • @@ -362,7 +363,7 @@

    Contents

    // Handle inline badges const paragraphs = researchContent.getElementsByTagName('p'); for (let p of paragraphs) { - const badges = p.querySelectorAll('a[href*="arxiv.org"], a[href*="github.com"], a[href*="blogs-comphy-lab.org"]'); + const badges = p.querySelectorAll('a[href*="arxiv.org"], a[href*="github.com"], a[href*="blogs.comphy-lab.org"]'); if (badges.length > 0) { const badgeContainer = document.createElement('span'); badgeContainer.className = 'badge-container'; @@ -380,7 +381,7 @@

    Contents

    } } else if (node.nodeType === 1) { // Element node const href = node.getAttribute('href'); - if (!href || (!href.includes('arxiv.org') && !href.includes('github.com') && !href.includes('blogs-comphy-lab.org'))) { + if (!href || (!href.includes('arxiv.org') && !href.includes('github.com') && !href.includes('blogs.comphy-lab.org'))) { textContent += node.outerHTML; hasNonBadgeContent = true; } diff --git a/_layouts/team.html b/_layouts/team.html index 709b31e..97e4022 100644 --- a/_layouts/team.html +++ b/_layouts/team.html @@ -95,7 +95,8 @@
  • About
  • Team
  • Research
  • -
  • Blog
  • +
  • Join Us
  • +
  • Blog
  • diff --git a/_research/index.md b/_research/index.md index ab4bfb6..048f258 100644 --- a/_research/index.md +++ b/_research/index.md @@ -30,7 +30,7 @@ title: Research [![arXiv](https://img.shields.io/static/v1.svg?style=flat-square&label=arXiv&message=2501.05532&color=green)](https://arxiv.org/abs/2501.05532) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/VatsalSy/jumping-bubbles) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -40,7 +40,7 @@ title: Research [![arXiv](https://img.shields.io/static/v1.svg?style=flat-square&label=arXiv&message=2408.05089&color=green)](https://arxiv.org/abs/2408.05089) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/comphy-lab/Viscoelastic-Worthington-jets-and-droplets-produced-by-bursting-bubbles) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -51,7 +51,7 @@ title: Research [![arXiv](https://img.shields.io/static/v1.svg?style=flat-square&label=arXiv&message=2408.12714&color=green)](https://arxiv.org/abs/2408.12714) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/VatsalSy/Impact-forces-of-water-drops-falling-on-superhydrophobic-surfaces.git) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) ![Parameter space of drop impact](https://www.dropbox.com/scl/fi/rwrl444r73nayhw1jl4j2/SL2-theory_num.png?rlkey=ekywyjaui2n79djl4qtgevegn&raw=1){: width="75%" .center-block style="display: block; margin-left: auto; margin-right: auto;"} @@ -62,7 +62,7 @@ title: Research [![arXiv](https://img.shields.io/static/v1.svg?style=flat-square&label=arXiv&message=2409.00515&color=green)](https://arxiv.org/abs/2409.00515) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/VatsalSy/Asymmetries-in-coalescence) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -75,7 +75,7 @@ title: Research [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=OA&color=orange)](https://doi.org/10.1017/jfm.2024.982) [![arXiv](https://img.shields.io/static/v1.svg?style=flat-square&label=arXiv&message=2311.03012&color=green)](https://arxiv.org/abs/2311.03012) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/VatsalSy/The-role-of-viscosity-on-drop-impact-forces) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -88,7 +88,7 @@ title: Research [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=OA&color=orange)](https://doi.org/10.1017/jfm.2024.1089) [![arXiv](https://img.shields.io/static/v1.svg?style=flat-square&label=arXiv&message=2406.05416&color=green)](https://arxiv.org/abs/2406.05416) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/comphy-lab/concentricWave) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -100,7 +100,7 @@ title: Research [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=OA&color=orange)](https://doi.org/10.1017/jfm.2024.1073) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/comphy-lab/2023_Bubble-bursting-in-an-elasto-viscoplastic-medium) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -114,7 +114,7 @@ title: Research DropsBouncingDissipative anamoly [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=OA&color=orange)](https://doi.org/10.1017/jfm.2023.55) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -124,7 +124,7 @@ title: Research DropsBouncingSuperhydrophobic surfaces [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=OA&color=orange)](https://doi.org/10.1017/jfm.2023.13) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -138,14 +138,14 @@ title: Research [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=UT&message=link&color=orange)](https://doi.org/10.3990/1.9789036554077) [![LaTeX](https://img.shields.io/static/v1.svg?style=flat-square&logo=github&label=LaTeX&message=source%20code)](https://github.com/VatsalSy/VatsalPhDThesis) [![Defense](https://img.shields.io/static/v1.svg?style=flat-square&logo=vimeo&label=Defense&message=Watch%20online&color=green)](https://vimeo.com/730545548) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public)

    [9] Sanjay, V. Taylor--Culick retractions and the influence of the surroundings. J. Fluid Mech., 948, A14 (2022).

    SheetsDissipative anamolyRetraction [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=OA&color=orange)](https://doi.org/10.1017/jfm.2022.671) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -157,7 +157,7 @@ title: Research [![PDF](https://img.shields.io/static/v1.svg?logo=adobeacrobatreader&style=flat-square&label=PDF&message=Download&color=green)](https://qrco.de/bd9aV3) [![arXiv](https://img.shields.io/static/v1.svg?style=flat-square&label=arXiv&message=2202.02437&color=green)](https://arxiv.org/abs/2202.02437) [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=Phys.%20Rev.%20Lett.&message=DOI:%2010.1103/PhysRevLett.129.104501&color=orange)](https://doi.org/10.1103/PhysRevLett.129.104501) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -175,7 +175,7 @@ title: Research [![JFM](https://img.shields.io/static/v1.svg?style=flat-square&label=JFM&message=OA&color=orange)](https://doi.org/10.1017/jfm.2021.489) [![arXiv](https://img.shields.io/badge/arXiv-2101.07744-green?style=flat-square)](https://arxiv.org/abs/2101.07744) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/VatsalSy/Bursting-Bubble-In-a-Viscoplastic-Medium) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -188,7 +188,7 @@ title: Research [![Sci. Adv.](https://img.shields.io/static/v1.svg?style=flat-square&label=Sci.%20Adv.&message=OA&color=orange)](https://doi.org/10.1126/sciadv.aba4330) [![arXiv](https://img.shields.io/badge/arXiv-1912.02667-green?style=flat-square)](https://arxiv.org/abs/1912.02667) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/VatsalSy/Lifting-a-sessile-drop) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -200,7 +200,7 @@ title: Research [![PDF](https://img.shields.io/static/v1.svg?style=flat-square&label=PDF&message=Available&color=green)](https://www.dropbox.com/s/ug7njhulcy9zq8lib911j/2019-Vatsal-_Consequences-of-Inclined-and-Dual-Jet-Impingement-in-Stagnant-Liquid-and-Stratified-Layers.pdf?rlkey=l00thknv7wt55sb0bcuiy8isw&dl=0) [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=DOI&message=10.1002/aic.16373&color=orange)](https://doi.org/10.1002/aic.16373) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -212,7 +212,7 @@ title: Research [![PDF](https://img.shields.io/static/v1.svg?style=flat-square&label=PDF&message=Available&color=green)](https://www.dropbox.com/s/ranuyet8h7nub3s/%5B2018-Vatsal-preprint%5D_Formation%20of%20fluid%20structures%20due%20to%20jet-jet%20and%20jet-sheet%20interactions.pdf?dl=0) [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=DOI&message=10.1016/j.ces.2018.06.055&color=orange)](https://doi.org/10.1016/j.ces.2018.06.055) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -222,7 +222,7 @@ title: Research [![PDF](https://img.shields.io/static/v1.svg?style=flat-square&label=PDF&message=Available&color=green)](https://www.dropbox.com/s/6kfiem9zcvjr2vf/%5B2018-Vatsal%5D_Numerical%20assessment%20of%20hazard%20in%20compartmental%20fire%20having%20steady%20heat%20release%20rate%20from%20the%20source.pdf?dl=0) [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=DOI&message=10.1007/s12273-017-0411-y&color=orange)](https://doi.org/10.1007/s12273-017-0411-y) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -235,7 +235,7 @@ title: Research [![PDF](https://img.shields.io/static/v1.svg?style=flat-square&label=PDF&message=Available&color=green)](https://www.dropbox.com/s/e9uo0hcrm9es8hr/%5B2017-Vatsal-preprint%5D_Formation%20of%20liquid%20chain%20by%20collision%20of%20two%20laminar%20jets.pdf?dl=0) [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=DOI&message=10.1063/1.4998288&color=orange)](https://doi.org/10.1063/1.4998288) [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/VatsalSy/FluidChains) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) @@ -245,6 +245,6 @@ title: Research [![PDF](https://img.shields.io/static/v1.svg?style=flat-square&label=PDF&message=Available&color=green)](https://www.dropbox.com/s/bm49xi8ic6i3icf/%5B2017-Vatsal-preprint%5D_On%20Air%20Entrainment%20in%20a%20Water%20pool%20by%20Impingement%20of%20a%20Jet.pdf?dl=0) [![DOI](https://img.shields.io/static/v1.svg?style=flat-square&label=DOI&message=10.1002/aic.15828&color=orange)](https://doi.org/10.1002/aic.15828) -[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs-comphy-lab.org/0_ToDo-Blog-public) +[![Blog](https://img.shields.io/badge/Blog-Coming%20Soon-yellow?style=flat-square&logo=obsidian&logoColor=white)](https://blogs.comphy-lab.org/0_ToDo-Blog-public) \ No newline at end of file diff --git a/assets/js/search_db.json b/assets/js/search_db.json deleted file mode 100644 index 23a6a9b..0000000 --- a/assets/js/search_db.json +++ /dev/null @@ -1,436 +0,0 @@ -[ - { - "title": "Vatsal Sanjay (PI)", - "content": "[](https://github.com/VatsalSy)\n[](https://scholar.google.com/citations?user=tHb_qZoAAAAJ&hl=en)\n[](https://bsky.app/profile/comphy-lab.org)\n\n\"Vatsal\n\n- [Postdoc, Phys. Fluids - Univ. Twente / 2022-25](https://pof.tnw.utwente.nl/people/profile/1330)\n- [Ph.D., Phys. Fluids - Univ. Twente / 2018-22](https://doi.org/10.3990/1.9789036554077)\n- [B.Tech + M.Tech, Two-Phase Flow & Instability Lab, IIT-Roorkee / 2013-18](http://dx.doi.org/10.13140/RG.2.2.22294.04166)\n- [Personal Website](https://vatsalsanjay.com)\n\n**Research Interest:** See [here](https://comphy-lab.org/research)\n\n[Download CV](https://raw.githubusercontent.com/VatsalSy/Vatsal_CV/master/Vatsal_CV.pdf){: .cv-button}", - "url": "/team/#vatsal-sanjay-pi-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Ayush Dixit (Ph.D)", - "content": "[](https://github.com/ayushkumardixit)\n[](https://scholar.google.com/citations?hl=en&user=ws43SmkAAAAJ)\n\n\"Ayush\n\nJoint with [Detlef Lohse](https://en.wikipedia.org/wiki/Detlef_Lohse)\n\n- [Ph.D. Student, Phys. Fluids - Univ. Twente / 2023-now](https://pof.tnw.utwente.nl/people/profile/2068)\n- [B.Tech + M.Tech, Two-Phase Flow & Instability Lab, IIT-Roorkee / 2018-23](http://dx.doi.org/10.13140/RG.2.2.23218.79040)\n\n**Research Interest:** Viscoelastic Flows, Bursting Bubbles, Respiratory Drops.", - "url": "/team/#ayush-dixit-ph-d-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Aman Bhargava (Ph.D)", - "content": "[](https://github.com/amanb1901)\n[](https://scholar.google.com/citations?hl=en&user=AmGOP8gAAAAJ)\n\n\"Aman\n\nJoint with [Detlef Lohse](https://en.wikipedia.org/wiki/Detlef_Lohse)\n\n- [Ph.D. Student, Phys. Fluids - Univ. Twente / 2024-now](https://pof.tnw.utwente.nl/people/profile/2120)\n- M.Sc. Chemical Engineering, Purdue University / 2022-23\n- B.Tech. (Hons.) Chemical Engineering, IIT-Bombay / 2018-22\n\n**Research Interest:** Inertial Contact Line, Drop Retraction.", - "url": "/team/#aman-bhargava-ph-d-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Jnandeep Talukdar (M.Sc.)", - "content": "[](https://github.com/spilltheT)\n[](https://scholar.google.com/citations?hl=en&user=Coxj4VQAAAAJ)\n[](https://bsky.app/profile/jnandeep.bsky.social)\n\n\"Jnandeep\n\nJoint with [Detlef Lohse](https://en.wikipedia.org/wiki/Detlef_Lohse)\n\n- Ph.D. Student, Phys. Fluids - Univ. Twente / **starting** May 2025\n- [M.Sc. Student, Phys. Fluids - Univ. Twente / 2023-25](https://pof.tnw.utwente.nl/people/profile/1938)\n- B.Tech. Mechanical Engineering, IIT-Patna / 2019-23\n\n**Research Interest:** Surfactant Dynamics, Dissipative Anomaly, Soft Wetting.", - "url": "/team/#jnandeep-talukdar-m-sc-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Saumili Jana (M.Sc.)", - "content": "[](https://github.com/SaumiliJana)\n\n\"Saumili\n\nJoint with [Detlef Lohse](https://en.wikipedia.org/wiki/Detlef_Lohse)\n\n- Ph.D. Student, Phys. Fluids - Univ. Twente / **starting** Jul 2025\n- B.Tech.+M.Tech. Student, IIT-Kharagpur / 2020-25\n- [Research Intern, Phys. Fluids - Univ. Twente / 2024](https://pof.tnw.utwente.nl/people/profile/2152)\n\n**Research Interest:** Soft Impact.", - "url": "/team/#saumili-jana-m-sc-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Floris Hoek (M.Sc.)", - "content": "[](https://github.com/Floris-Hoek)\n\n\"Floris\n\nJoint with [Martin van der Hoef](https://pof.tnw.utwente.nl/people/profile/244) and [Alvaro Marin](https://pof.tnw.utwente.nl/people/profile/243)\n\n- [M.Sc. Student, Phys. Fluids - Univ. Twente / 2024](https://pof.tnw.utwente.nl/people/profile/1937)\n\n**Research Interest:** Molecular Dynamics Simulations of Evaporation-Driven Colloidal Self-Assembly.", - "url": "/team/#floris-hoek-m-sc-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Xiangyu Zhang (Intern)", - "content": "[](https://github.com/zhangxyPHD)\n\n\"Xiangyu\n\nJoint with [Detlef Lohse](https://en.wikipedia.org/wiki/Detlef_Lohse)\n\n- [Guest Researcher, Phys. Fluids - Univ. Twente / 2024](https://pof.tnw.utwente.nl/people/profile/2209)\n- City University of Hong Kong, China\n\n**Research Interest:** Viscoplastic Drop Impact.", - "url": "/team/#xiangyu-zhang-intern-", - "type": "team_member", - "priority": 1 - }, - { - "title": "We need you!", - "content": "\"Join\n\nSee: [Join Us](https://github.com/VatsalSy/Project-ideas-for-prospective-students) for ongoing projects.", - "url": "/team/#we-need-you-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Detlef Lohse", - "content": "[](https://scholar.google.com/citations?user=WvP_pIUAAAAJ)\n[](https://x.com/detlef_lohse)\n\n- [Professor, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/3)\n\n**Collaboration on:** Drop Impact, Viscoelastic Flows, Dissipative Anomaly, Surfactant Dynamics, Electrolysis, Bubbles, and Everything in Between.", - "url": "/team/#detlef-lohse", - "type": "team_member", - "priority": 1 - }, - { - "title": "Jacco Snoeijer", - "content": "[](https://scholar.google.com/citations?user=7qdux_4AAAAJ&hl=nl)\n\n- [Professor, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/21)\n\n**Collaboration on:** Elastic Sheets, Viscoelasticity vs. Elasticity, Spinning Pizza.", - "url": "/team/#jacco-snoeijer", - "type": "team_member", - "priority": 1 - }, - { - "title": "Dominik Krug", - "content": "[](https://scholar.google.com/citations?user=qGEpq7IAAAAJ&hl=en&inst=5726176096060060532&oi=ao)\n\n- [Professor, RWTH Aachen University](https://www.aia.rwth-aachen.de/)\n- [Adjunct Professor, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1199)\n\n**Collaboration on:** Electrolysis, Bubble Coalescence, Swimming Bubbles.", - "url": "/team/#dominik-krug", - "type": "team_member", - "priority": 1 - }, - { - "title": "Maziyar Jalaal (Mazi)", - "content": "[](https://scholar.google.com/citations?user=FE8TQeUAAAAJ)\n[](https://x.com/maziyarj)\n[](https://bsky.app/profile/mazi1.bsky.social)\n\n- [Associate Professor, Fluid Lab, Univ. Amsterdam](https://www.fluidlab.nl/)\n\n**Collaboration on:** Plastocapillarity, Viscoplastic Flows.", - "url": "/team/#maziyar-jalaal-mazi-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Uddalok Sen (Udo)", - "content": "[](https://scholar.google.com/citations?user=a6h2uMQAAAAJ)\n\n- [Assistant Professor, PhySM, Wageningen University and Research](https://www.physm-lab.org/)\n\n**Collaboration on:** Drop Impact, Sheet Retraction.", - "url": "/team/#uddalok-sen-udo-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Alvaro Marin", - "content": "[](https://scholar.google.com/citations?user=0_jOqqkAAAAJ)\n[](https://github.com/alvarogum)\n[](https://x.com/AlvaroGMarin)\n[](https://bsky.app/profile/alvaromarin.bsky.social)\n\n- [Adjunct Professor, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/243)\n\n**Collaboration on:** Colloidal Systems, Evaporation, Shell Formation.", - "url": "/team/#alvaro-marin", - "type": "team_member", - "priority": 1 - }, - { - "title": "Christian Diddens", - "content": "[](https://scholar.google.com/citations?user=3QSyucwAAAAJ&hl=en&inst=5726176096060060532&oi=ao)\n[](https://github.com/cdiddens)\n\n\n- [Group Leader, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1143)\n- [Developer of pyoomph](https://pyoomph.github.io/)\n\n**Collaboration on:** Surfactant Dynamics in Free Surface Flows, Dissipative Anomaly, Sliding Drops.", - "url": "/team/#christian-diddens", - "type": "team_member", - "priority": 1 - }, - { - "title": "Gareth McKinley", - "content": "[](https://scholar.google.com/citations?user=uLxFfGkAAAAJ)\n[](https://en.wikipedia.org/wiki/Gareth_H._McKinley)\n[](https://x.com/garethmckinley)\n\n- [Professor, MIT](https://nnf.mit.edu/)\n\n**Collaboration on:** Die-Swelling, Viscoelastic Flows.", - "url": "/team/#gareth-mckinley", - "type": "team_member", - "priority": 1 - }, - { - "title": "John Kolinski", - "content": "[](https://scholar.google.com/citations?user=BDzF8kMAAAAJ)\n[](https://en.wikipedia.org/wiki/John_Martin_Kolinski)\n\n- [Asst. Professor, EPFL (École Polytechnique Fédérale de Lausanne)](https://people.epfl.ch/john.kolinski)\n\n**Collaboration on:** Soft Impact", - "url": "/team/#john-kolinski", - "type": "team_member", - "priority": 1 - }, - { - "title": "C. Ricardo Constante-Amores", - "content": "[](https://scholar.google.com/citations?user=ncqnphMAAAAJ)\n[](https://github.com/rcrc15)\n\n\n- [Asst. Professor, Univ. Illinois Urbana-Champaign](https://publish.illinois.edu/constanteamores/home/)\n\n**Collaboration on:** Non-Newtonian Flows, Bubble Bursting, Herschel--Bulkley Fluids, Elastic Coating.", - "url": "/team/#c-ricardo-constante-amores", - "type": "team_member", - "priority": 1 - }, - { - "title": "Radu Cimpeanu", - "content": "[](https://scholar.google.com/citations?user=6grZnhQAAAAJ&hl=en&inst=5726176096060060532&oi=ao)\n[](https://x.com/rcimpeanu)\n[](https://github.com/RaduCimpeanu)\n\n- [Assc. Professor, Univ. Warwick](https://www.raducimpeanu.com/)\n\n**Collaboration on:** Open-Source Code Development, Non-Coalescence Impacts.", - "url": "/team/#radu-cimpeanu", - "type": "team_member", - "priority": 1 - }, - { - "title": "Jie Feng", - "content": "[](https://scholar.google.com/citations?user=226dDBAAAAAJ)\n[](https://x.com/FengFluidsLab)\n\n- [Asst. Professor, Univ. Illinois Urbana-Champaign](https://fengfluidslab.web.illinois.edu/wp/)\n\n**Collaboration on:** Elastic Coating, Bursting Bubbles.", - "url": "/team/#jie-feng", - "type": "team_member", - "priority": 1 - }, - { - "title": "Omar Matar", - "content": "[](https://scholar.google.com/citations?user=mLXz_NAAAAAJ&hl=en)\n[](https://x.com/okmatar?lang=en)\n\n- [Professor, Imperial College London](https://profiles.imperial.ac.uk/o.matar)\n\n**Collaboration on:** Surfactant Dynamics, Viscoelastic Drop Impact.", - "url": "/team/#omar-matar", - "type": "team_member", - "priority": 1 - }, - { - "title": "Ratul Dasgupta", - "content": "[](https://scholar.google.com/citations?user=I1jFG_oAAAAJ)\n[](https://x.com/RatulDG)\n\n- [Assc. Professor, IIT-Bombay](https://sites.google.com/view/ratuldasgupta/home)\n\n**Collaboration on:** Waves, Dissipative Anomaly.", - "url": "/team/#ratul-dasgupta", - "type": "team_member", - "priority": 1 - }, - { - "title": "Eric Lauga", - "content": "[](https://scholar.google.com/citations?hl=en&user=5ObY7hsAAAAJ)\n\n- [Professor, Univ. Cambridge](https://www.damtp.cam.ac.uk/user/lauga/)\n\n**Collaboration on:** Mycofluidic Transport.", - "url": "/team/#eric-lauga", - "type": "team_member", - "priority": 1 - }, - { - "title": "Saikat Datta", - "content": "[](https://scholar.google.com/citations?user=o4mXtIgAAAAJ)\n\n- Senior Lecturer, Swansea University\n\n**Collaboration on:** Multiscale Simulation, Ice Nucleation and Removal, Hydrogen Storage.", - "url": "/team/#saikat-datta", - "type": "team_member", - "priority": 1 - }, - { - "title": "Doris Vollmer", - "content": "[](https://orcid.org/0000-0001-9599-5589)\n\n- [Apl. Professor, Max Planck Institute for Polymer Research, Mainz, Germany.](https://www.mpip-mainz.mpg.de/en/butt/groups/vollmer)\n\n**Collaboration on:** Contact Line, Drop Impact, Superhydrophobic Surfaces.", - "url": "/team/#doris-vollmer", - "type": "team_member", - "priority": 1 - }, - { - "title": "Stéphane Zaleski", - "content": "[](https://scholar.google.com/citations?hl=en&user=no1GX_QAAAAJ)\n[](https://x.com/zaleski)\n\n- [Professor, Sorbonne Universite](http://www.ida.upmc.fr/~zaleski/zaleski.html)\n\n**Collaboration on:** Holey Sheets.", - "url": "/team/#st-phane-zaleski", - "type": "team_member", - "priority": 1 - }, - { - "title": "Pierre Chantelot", - "content": "[](https://scholar.google.nl/citations?user=BQWXUKYAAAAJ)\n\n- [Postdoc, Institut Langevin, ESPCI Paris](https://sites.google.com/view/pierre-chantelot/)\n\n**Collaboration on:** Drop Impact", - "url": "/team/#pierre-chantelot", - "type": "team_member", - "priority": 1 - }, - { - "title": "Aleksandr Bashkatov", - "content": "[](https://scholar.google.com/citations?user=9_vPSFsAAAAJ&hl=en&inst=5726176096060060532&oi=ao)\n\n- [Postdoc, RWTH Aachen University](https://scholar.google.com/citations?user=9_vPSFsAAAAJ&hl=en&inst=5726176096060060532&oi=ao)\n\n**Collaboration on:** Electrolysis, Bubble Coalescence, Swimming Bubbles.", - "url": "/team/#aleksandr-bashkatov", - "type": "team_member", - "priority": 1 - }, - { - "title": "Vincent Bertin", - "content": "[](https://scholar.google.com/citations?user=jO_RTLR2xBYC&hl=en&inst=5726176096060060532&oi=ao)\n\n- [Postdoc, University Aix-Marseille ](https://vincent-bertin.github.io/)\n\n**Collaboration on:** Elastic Sheets, Spinning Pizza.", - "url": "/team/#vincent-bertin", - "type": "team_member", - "priority": 1 - }, - { - "title": "Alexandros Oratis", - "content": "[](https://scholar.google.com/citations?user=2lOr8WQAAAAJ&hl=en&inst=5726176096060060532&oi=ao)\n\n- [Postdoc, TU Delft](https://garbinlab.org/people/)\n\n**Collaboration on:** Electrolysis, Bubble Coalescence, Swimming Bubbles.", - "url": "/team/#alexandros-oratis", - "type": "team_member", - "priority": 1 - }, - { - "title": "Arivazhagan Balasubramanian (Ari)", - "content": "[](https://scholar.google.com/citations?user=xyheRZ8AAAAJ)\n[](https://github.com/GbArivazhagan)\n[](https://bsky.app/profile/gbarivaz.bsky.social)\n\n- [Ph.D. Student, KTH Sweden](https://www.kth.se/profile/argb?l=en)\n\n**Collaboration on:** Elastoviscoplastic Flows, Bursting Bubbles", - "url": "/team/#arivazhagan-balasubramanian-ari-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Konstantinos Zinelis (Costis)", - "content": "[](https://scholar.google.com/citations?user=dZrR_z8AAAAJ&hl=en&inst=5726176096060060532&oi=ao)\n[](https://x.com/KZinelis)\n\n- [Postdoc, MIT](https://qigroup.mit.edu/team/)\n\n**Collaboration on:** Viscoelastic Flows, Drop Impact.", - "url": "/team/#konstantinos-zinelis-costis-", - "type": "team_member", - "priority": 1 - }, - { - "title": "Milan Sent", - "content": "[](https://github.com/mdjsent)\n\n- **2025:** Graduated with B.Sc., Univ. Twente\n- **Thesis:** [Spinning Pizza](https://tinyurl.com/2ycunjcr)", - "url": "/team/#milan-sent", - "type": "team_member", - "priority": 1 - }, - { - "title": "Valentin Rosario", - "content": "[](https://www.linkedin.com/in/valentin-rosario-6377602b2/?originalSubdomain=nl)\n[](https://github.com/ValeRos9)\n\n- **2024:** Graduated with M.Sc., Univ. Amsterdam\n- **Thesis:** [Modelling the Ward--Hunt ice-shelf as viscoelastic solid](https://tinyurl.com/2cjsjvr4)", - "url": "/team/#valentin-rosario", - "type": "team_member", - "priority": 1 - }, - { - "title": "Swen van den Heuvel", - "content": "[](https://www.linkedin.com/in/swen-van-den-heuvel-33a1901aa/)\n\n- **Now:** [Ph.D. Student, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/2119)\n- **2023:** [Graduated with M.Sc., Univ. Twente](https://pof.tnw.utwente.nl/people/profile/2119)\n- **Thesis:** [Hydrodynamic forces acting on vertically rising bubbles](https://bit.ly/4er5VaH)", - "url": "/team/#swen-van-den-heuvel", - "type": "team_member", - "priority": 1 - }, - { - "title": "Niels Kuipers", - "content": "[](https://www.linkedin.com/in/nielskuipers1/)\n\n- **Now:** M.Sc. Student, Adv. Technology - Univ. Twente\n- **2023:** [Graduated with B.Sc., Univ. Twente](https://pof.tnw.utwente.nl/people/profile/2064)\n- **Thesis:** [Partial coalescence of drops on viscous films](https://tinyurl.com/258jvdyv)", - "url": "/team/#niels-kuipers", - "type": "team_member", - "priority": 1 - }, - { - "title": "C. H. (Luuk) Maurits", - "content": "- **2023:** [Graduated with M.Sc., Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1741)\n- **Thesis:** [When Laplace meets Marangoni](https://bit.ly/ThesisLuuk)", - "url": "/team/#c-h-luuk-maurits", - "type": "team_member", - "priority": 1 - }, - { - "title": "Tom Appleford", - "content": "- **Now:** [Ph.D. Student, Fluid Lab - Univ. Amsterdam](https://www.fluidlab.nl/team)\n- **2022:** [Graduated with M.Sc., Univ. Amsterdam](https://pof.tnw.utwente.nl/people/profile/1741)\n- **Thesis:** [The deformation of a droplet in a viscoplastic simple shear flow](https://bit.ly/ThesisTom)", - "url": "/team/#tom-appleford", - "type": "team_member", - "priority": 1 - }, - { - "title": "Twan Heijink", - "content": "[](https://www.linkedin.com/in/twanheijink/)\n\n- **Now:** Software IVQA Engineer at Thales\n- **2021:** [Graduated with B.Sc., Saxion Univ.](https://pof.tnw.utwente.nl/people/profile/1822)\n- **Thesis:** [Standing waves at a fluid-fluid interface with plastocapillarity](https://bit.ly/ThesisTwanHeijink)", - "url": "/team/#twan-heijink", - "type": "team_member", - "priority": 1 - }, - { - "title": "Steven Meuleman", - "content": "[](https://www.linkedin.com/in/steven-meuleman/)\n\n- **Now:** Mechanical Engineer at VIRO\n- **2020:** Graduated with B.Sc., Univ. Twente\n- **Thesis:** [Simulations of foam generation for a custom axisymmetric core-shell nozzle](https://bit.ly/ThesisStevenM)", - "url": "/team/#steven-meuleman", - "type": "team_member", - "priority": 1 - }, - { - "title": "Thijmen Kroeze", - "content": "[](https://www.linkedin.com/in/thijmen-kroeze-535aa3207/)\n\n- **Now:** CFD Engineer, Brink Climate Systems\n- **2020:** [Graduated with B.Sc., Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1630)\n- **Thesis:** [Singular jet dynamics of drop impacts at high Bond numbers](https://bit.ly/ThesisThijmenKroeze)", - "url": "/team/#thijmen-kroeze", - "type": "team_member", - "priority": 1 - }, - { - "title": "Coen Verschuur", - "content": "- **Now:** [Ph.D. Student, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1709)\n- **2020:** [Graduated with B.Sc., Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1709)\n- **Thesis:** [Early time dynamics in immiscible drop impacts](https://bit.ly/ThesisCoenVerschuur)", - "url": "/team/#coen-verschuur", - "type": "team_member", - "priority": 1 - }, - { - "title": "Pim J. Dekker", - "content": "[](https://www.linkedin.com/in/pim-dekker/)\n\n- **Now:** [Ph.D. Student, Phys. Fluids - Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1431)\n- **2019:** [Graduated with B.Sc., Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1431)\n- **Thesis:** [Spreading of a drop on a water-air interface](https://bit.ly/ThesisPimDekker)", - "url": "/team/#pim-j-dekker", - "type": "team_member", - "priority": 1 - }, - { - "title": "Laurence Bruggink", - "content": "[](https://www.linkedin.com/in/laurence-bruggink-b733b222a/)\n\n- **Now:** Research Engineer at Alfen\n- **2019:** [Graduated with B.Sc., Univ. Twente](https://pof.tnw.utwente.nl/people/profile/1518)\n- **Thesis:** [Bursting bubble in a Herschel--Bulkley fluid](https://bit.ly/ThesisLaurenceBruggink)", - "url": "/team/#laurence-bruggink", - "type": "team_member", - "priority": 1 - }, - { - "title": "About Us", - "content": "We are based at the Physics of Fluids Department at the University of Twente, where we investigate [**non-Newtonian free-surface flows**](/research/?tag=Non-Newtonian) and [**soft matter singularities**](/research/?tag=Soft-matter-singularities). Our group employs a synergy of continuum simulations, experiments (through collaborations), and theoretical analysis to understand phenomena ranging involving drops, bubbles, jets, sheets, and more. We strive to connect fundamental findings with real-world applications, from industrial processes to everyday fluid dynamics.", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "About Us", - "content": "We are based at the Physics of Fluids Department at the University of Twente, where we investigate [**non-Newtonian free-surface flows**](/research/?tag=Non-Newtonian) and [**soft matter singularities**](/research/?tag=Soft-matter-singularities). Our group employs a synergy of continuum simulations, experiments (through collaborations), and theoretical analysis to understand phenomena ranging involving drops, bubbles, jets, sheets, and more. We strive to connect fundamental findings with real-world applications, from industrial processes to everyday fluid dynamics.", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Soft Matter Singularities", - "content": "We examine topological transitions in fluid systems—such as [**droplet impact**](/research/?tag=Drops), [**bubble bursting**](/research/?tag=Bubbles), and [**sheet fragmentation**](/research/?tag=Sheets) — where local instabilities drive fast, often dramatic flow dynamics. Our goal is to expose the universal mechanisms governing these [**singular**]((/research/?tag=Soft-matter-singularities)) events in soft matter.", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "Soft Matter Singularities", - "content": "We examine topological transitions in fluid systems—such as [**droplet impact**](/research/?tag=Drops), [**bubble bursting**](/research/?tag=Bubbles), and [**sheet fragmentation**](/research/?tag=Sheets) — where local instabilities drive fast, often dramatic flow dynamics. Our goal is to expose the universal mechanisms governing these [**singular**]((/research/?tag=Soft-matter-singularities)) events in soft matter.", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Non-Newtonian Flows as the `Drosophila' of Continuum Mechanics", - "content": "From [**elastoviscoplastic**]((/research/?tag=Non-Newtonian)) bubble bursting and elastic sheet break-up to champagne [**bubble**](/research/?tag=Bubbles) bursting and classical Taylor–Culick retractions, non-Newtonian fluids serve as model systems to explore the fundamentals of continuum mechanics. By integrating high-fidelity simulations, analytical frameworks, and collaborative experiments, we reveal how microstructural stresses affect fluid and solid dynamics. This research provides key insights for industrial and environmental applications.", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "Non-Newtonian Flows as the `Drosophila' of Continuum Mechanics", - "content": "From [**elastoviscoplastic**]((/research/?tag=Non-Newtonian)) bubble bursting and elastic sheet break-up to champagne [**bubble**](/research/?tag=Bubbles) bursting and classical Taylor–Culick retractions, non-Newtonian fluids serve as model systems to explore the fundamentals of continuum mechanics. By integrating high-fidelity simulations, analytical frameworks, and collaborative experiments, we reveal how microstructural stresses affect fluid and solid dynamics. This research provides key insights for industrial and environmental applications.", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Viscous Free-Surface Flows", - "content": "We investigate various viscous free-surface flows including inertial contact lines, [**bubble**](/research/?tag=Bubbles) removal, and focusing of [**waves**](/research/?tag=Waves). These phenomena are critical to energy transitions and manufacturing. For instance, a key challenge is optimizing bubble detachment in electrolysis to boost efficiency. This research involves advanced numerical methods and industry partnerships, with the broader aim of advancing technologies from chemical reactors to printing processes.", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "Viscous Free-Surface Flows", - "content": "We investigate various viscous free-surface flows including inertial contact lines, [**bubble**](/research/?tag=Bubbles) removal, and focusing of [**waves**](/research/?tag=Waves). These phenomena are critical to energy transitions and manufacturing. For instance, a key challenge is optimizing bubble detachment in electrolysis to boost efficiency. This research involves advanced numerical methods and industry partnerships, with the broader aim of advancing technologies from chemical reactors to printing processes.", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Commitment to Open Science", - "content": "Open exchange of ideas drives our progress. We share our codes from the earliest stages of development, embracing transparent research practices to foster collaboration and reproducibility. We welcome inquiries and partnerships from the broader scientific community. Watchout for [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/comphy-lab) and [](https://github.com/comphy-lab) on this website to interact with our codes. \n\nFeel free to contact us for discussions about our work or anything else related to fluid physics. Nothing is more exhilarating than a healthy scientific discussion.", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "Commitment to Open Science", - "content": "Open exchange of ideas drives our progress. We share our codes from the earliest stages of development, embracing transparent research practices to foster collaboration and reproducibility. We welcome inquiries and partnerships from the broader scientific community. Watchout for [![GitHub](https://img.shields.io/badge/GitHub-100000?style=flat-square&logo=github&logoColor=white)](https://github.com/comphy-lab) and [](https://github.com/comphy-lab) on this website to interact with our codes.", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Commitment to Open Science", - "content": "Feel free to contact us for discussions about our work or anything else related to fluid physics. Nothing is more exhilarating than a healthy scientific discussion.", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Location & Website", - "content": "[![Location](https://img.shields.io/badge/-Physics%20of%20Fluids-4285F4?style=flat&logo=googlemaps&logoColor=white)](https://maps.app.goo.gl/jSTCYnfcndF1uZPV8)\n[![Website](https://img.shields.io/badge/-comphy--lab.org-4285F4?style=flat&logo=googlechrome&logoColor=white)](http://www.comphy-lab.org)\n[![Email](https://img.shields.io/badge/-mailto:vatsalsy@comphy--lab.org-EA4335?style=flat&logo=gmail&logoColor=white)](mailto:vatsalsy@comphy-lab.org)\n\n
    \n vatsalsy@comphy-lab.org\n \n
    ", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "Location & Website", - "content": "[![Location](https://img.shields.io/badge/-Physics%20of%20Fluids-4285F4?style=flat&logo=googlemaps&logoColor=white)](https://maps.app.goo.gl/jSTCYnfcndF1uZPV8)\n[![Website](https://img.shields.io/badge/-comphy--lab.org-4285F4?style=flat&logo=googlechrome&logoColor=white)](http://www.comphy-lab.org)\n[![Email](https://img.shields.io/badge/-mailto:vatsalsy@comphy--lab.org-EA4335?style=flat&logo=gmail&logoColor=white)](mailto:vatsalsy@comphy-lab.org)", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Academic Profiles", - "content": "[![Google Scholar](https://img.shields.io/badge/-Google%20Scholar-4285F4?style=flat&logo=googlescholar&logoColor=white)](https://scholar.google.com/citations?user=tHb_qZoAAAAJ&hl=en)\n[![ORCID](https://img.shields.io/badge/-ORCID-A6CE39?style=flat&logo=orcid&logoColor=white)](https://orcid.org/0000-0002-4293-6099)\n[![arXiv](https://img.shields.io/badge/-arXiv-B31B1B?style=flat&logo=arxiv&logoColor=white)](https://arxiv.org/search/?query=vatsal+sanjay&searchtype=all&source=header)\n[![ResearchGate](https://img.shields.io/badge/-ResearchGate-00CCBB?style=flat&logo=researchgate&logoColor=white)](https://www.researchgate.net/profile/Vatsal-Sanjay-2)", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "Academic Profiles", - "content": "[![Google Scholar](https://img.shields.io/badge/-Google%20Scholar-4285F4?style=flat&logo=googlescholar&logoColor=white)](https://scholar.google.com/citations?user=tHb_qZoAAAAJ&hl=en)\n[![ORCID](https://img.shields.io/badge/-ORCID-A6CE39?style=flat&logo=orcid&logoColor=white)](https://orcid.org/0000-0002-4293-6099)\n[![arXiv](https://img.shields.io/badge/-arXiv-B31B1B?style=flat&logo=arxiv&logoColor=white)](https://arxiv.org/search/?query=vatsal+sanjay&searchtype=all&source=header)\n[![ResearchGate](https://img.shields.io/badge/-ResearchGate-00CCBB?style=flat&logo=researchgate&logoColor=white)](https://www.researchgate.net/profile/Vatsal-Sanjay-2)", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Social Media", - "content": "[![X](https://img.shields.io/badge/-@VatsalSanjay-000000?style=flat&logo=x&logoColor=white)](https://twitter.com/VatsalSanjay)\n[![Bluesky](https://img.shields.io/badge/-@comphy--lab.org-0285FF?style=flat&logo=bluesky&logoColor=white)](https://bsky.app/profile/comphy-lab.org)\n\nFor supplementary videos and teaser of our upcoming work:\n\n\n \n \n \"Vatsal's\n \n", - "url": "/#about", - "type": "markdown_section", - "priority": 3 - }, - { - "title": "Social Media", - "content": "[![X](https://img.shields.io/badge/-@VatsalSanjay-000000?style=flat&logo=x&logoColor=white)](https://twitter.com/VatsalSanjay)\n[![Bluesky](https://img.shields.io/badge/-@comphy--lab.org-0285FF?style=flat&logo=bluesky&logoColor=white)](https://bsky.app/profile/comphy-lab.org)", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - }, - { - "title": "Social Media", - "content": "For supplementary videos and teaser of our upcoming work:", - "url": "/#about", - "type": "markdown_text", - "priority": 3 - } -] \ No newline at end of file diff --git a/scripts/fetch_blog_content.js b/scripts/fetch_blog_content.js new file mode 100644 index 0000000..147c965 --- /dev/null +++ b/scripts/fetch_blog_content.js @@ -0,0 +1,139 @@ +const puppeteer = require('puppeteer'); +const fs = require('fs').promises; +const path = require('path'); + +const BLOG_URL = 'https://blogs.comphy-lab.org'; +const OUTPUT_FILE = path.join(__dirname, 'blog_content.json'); + +async function wait(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +async function extractContent(page) { + return await page.evaluate(() => { + const entries = []; + + // Wait for Obsidian's content to load + const content = document.querySelector('.markdown-preview-view, .markdown-preview-sizer, .markdown-rendered'); + if (!content) return entries; + + // Get page title and check if it's README + const title = document.title; + const isReadme = title.toLowerCase().includes('readme'); + + // Get all headings + const headings = content.querySelectorAll('h1, h2, h3, h4, h5, h6'); + + headings.forEach(heading => { + let contentNodes = []; + let node = heading.nextElementSibling; + + // Collect content until next heading + while (node && !node.matches('h1, h2, h3, h4, h5, h6')) { + if (node.textContent.trim()) { + contentNodes.push(node.textContent.trim()); + } + node = node.nextElementSibling; + } + + if (contentNodes.length > 0) { + // Skip small sections that are likely navigation or metadata + const combinedContent = contentNodes.join(' '); + if (combinedContent.length < 50) return; + + entries.push({ + title: heading.textContent.trim(), + content: combinedContent, + url: window.location.href + '#' + heading.id, + type: 'blog_section', + priority: isReadme ? 4 : 3 // Lower priority for README sections + }); + } + }); + + // Only add full page entry if it's not a README and has substantial content + const fullContent = content.textContent.trim(); + if (!isReadme && fullContent.length > 200) { + entries.push({ + title: title, + content: fullContent, + url: window.location.href, + type: 'blog_page', + priority: 2 + }); + } + + return entries; + }); +} + +async function getInternalLinks(page) { + return await page.evaluate((blogUrl) => { + const links = new Set(); + document.querySelectorAll('a[href]').forEach(link => { + const href = link.href; + if (href.startsWith(blogUrl)) { + links.add(href); + } + }); + return Array.from(links); + }, BLOG_URL); +} + +async function crawlBlog() { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + + const visitedUrls = new Set(); + const urlsToVisit = [BLOG_URL]; + const allEntries = []; + + try { + while (urlsToVisit.length > 0) { + const url = urlsToVisit.shift(); + if (visitedUrls.has(url)) continue; + + console.log(`Fetching ${url}...`); + + try { + await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 }); + await wait(2000); // Wait for dynamic content to load + + const entries = await extractContent(page); + allEntries.push(...entries); + + const links = await getInternalLinks(page); + links.forEach(link => { + if (!visitedUrls.has(link)) { + urlsToVisit.push(link); + } + }); + + visitedUrls.add(url); + } catch (error) { + console.error(`Error processing ${url}:`, error.message); + } + + // Be nice to the server + await wait(1000); + } + } finally { + await browser.close(); + } + + return allEntries; +} + +(async () => { + try { + console.log('Starting blog crawl...'); + const entries = await crawlBlog(); + console.log(`Found ${entries.length} entries`); + + await fs.writeFile(OUTPUT_FILE, JSON.stringify(entries, null, 2)); + console.log(`Written blog content to ${OUTPUT_FILE}`); + } catch (error) { + console.error('Error:', error); + process.exit(1); + } +})(); \ No newline at end of file diff --git a/scripts/generate_search_db.rb b/scripts/generate_search_db.rb index ebc6744..128b3c2 100644 --- a/scripts/generate_search_db.rb +++ b/scripts/generate_search_db.rb @@ -5,6 +5,8 @@ require 'open-uri' require 'net/http' require 'uri' +require 'set' +require 'thread' # This provides Queue # Get the project root directory (one level up from scripts) ROOT_DIR = File.expand_path('..', __dir__) @@ -68,12 +70,13 @@ def generate_anchor(text) # Process markdown files first Dir.glob(File.join(ROOT_DIR, '*.md')).each do |file| - next if file.end_with?('README.md') # Skip README next if file.start_with?(File.join(ROOT_DIR, '_team')) # Skip team members + next if file == File.join(ROOT_DIR, 'README.md') # Skip root README.md puts "Processing markdown file #{file}..." content = File.read(file) + is_readme = file.end_with?('README.md') # Split content by headers sections = content.split(/^#+\s+/) @@ -88,33 +91,41 @@ def generate_anchor(text) content = lines[1..].join.strip next if header.empty? || content.empty? + next if content.length < 50 # Skip very short sections + + # Skip navigation-like sections + next if header.match?(/^(navigation|menu|contents|index)$/i) # Create entry for the section entry = { 'title' => header, 'content' => content, - 'url' => '/#about', - 'type' => 'markdown_section', - 'priority' => 3 # Lower priority for regular content + 'url' => is_readme ? '/README.md' : '/#about', + 'type' => is_readme ? 'readme_section' : 'markdown_section', + 'priority' => is_readme ? 4 : 3 # Lower priority for README sections } search_db << entry - # Also create entries for individual paragraphs - paragraphs = content.split(/\n\n+/) - paragraphs.each do |para| - para = para.strip - next if para.empty? - next if para.start_with?('```') # Skip code blocks - next if para.start_with?('<') # Skip HTML - - entry = { - 'title' => header, - 'content' => para, - 'url' => '/#about', - 'type' => 'markdown_text', - 'priority' => 3 # Lower priority for regular content - } - search_db << entry + # Only create paragraph entries for non-README content + unless is_readme + # Also create entries for individual paragraphs + paragraphs = content.split(/\n\n+/) + paragraphs.each do |para| + para = para.strip + next if para.empty? + next if para.length < 100 # Only include substantial paragraphs + next if para.start_with?('```') # Skip code blocks + next if para.start_with?('<') # Skip HTML + + entry = { + 'title' => header, + 'content' => para, + 'url' => '/#about', + 'type' => 'markdown_text', + 'priority' => 3 + } + search_db << entry + end end end end @@ -277,82 +288,145 @@ def generate_anchor(text) end # Fetch and index external blog content -BLOG_URL = "https://blogs-comphy-lab.org" -BLOG_API_URL = "https://publish-01.obsidian.md" -BLOG_UID = "2b614a95ee2a1dd00a42a8bf3fab3099" -FETCH_DELAY = 1 # seconds between requests - -def fetch_url(url, headers = {}) - uri = URI(url) - http = Net::HTTP.new(uri.host, uri.port) - http.use_ssl = true - - request = Net::HTTP::Get.new(uri) - headers.each { |k,v| request[k] = v } - request['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' - request['Origin'] = BLOG_URL - request['Accept'] = '*/*' - - response = http.request(request) - - if response.is_a?(Net::HTTPSuccess) - response.body - else - puts "Failed to fetch #{url}: #{response.code} #{response.message}" - nil - end -end - -begin - puts "Generating search database..." +def fetch_blog_content + puts "Reading blog content from Node.js output..." + blog_content_file = File.join(File.dirname(__FILE__), 'blog_content.json') - # First get the main page to extract metadata - if main_page = fetch_url(BLOG_URL) - doc = Nokogiri::HTML(main_page) - - # Extract site info - site_info = nil - doc.css('script').each do |script| - if script.text =~ /window\.siteInfo\s*=\s*({.*?});/m - site_info = JSON.parse($1) - break - end - end - - if site_info - # Get the cache data - cache_url = "#{BLOG_API_URL}/access/#{site_info['uid']}/0_README.md" - if cache_data = fetch_url(cache_url, { - 'Referer' => BLOG_URL, - 'Accept' => 'text/markdown', - 'Host' => URI(BLOG_API_URL).host - }) - # Parse the README to get structure - sections = cache_data.split(/^#+\s+/) + if File.exist?(blog_content_file) + begin + blog_entries = JSON.parse(File.read(blog_content_file)) + puts "Found #{blog_entries.length} blog entries" + + processed_entries = [] + + blog_entries.each do |entry| + # Skip empty entries + next if entry['content'].nil? || entry['content'].strip.empty? + + # Clean up the content first + content = entry['content'] + .gsub(/^(created|status|modified|author|date published):.*$/, '') # Remove metadata lines + .gsub(/\n+/, "\n") # Normalize newlines + .strip + + # First, try to split by headers + sections = content.split(/(?=^#+\s+)/).map(&:strip).reject(&:empty?) + + # If no headers found, treat the whole content as one section + sections = [content] if sections.empty? + sections.each do |section| - next if section.strip.empty? + # Get section title + title = if section.match?(/^#+\s+/) + # If section starts with header, use it as title + header = section.lines.first.strip + section = section.sub(/^#+\s+[^\n]+\n/, '').strip # Remove header from content + header.gsub(/^#+\s+/, '') + .sub(/\s*-\s*aliases:?\s*$/i, '') # Remove "- aliases" suffix + else + # Otherwise use first sentence or phrase as title + first_line = section.lines.first.strip + first_line.split(/[.!?]/).first + .sub(/\s*-\s*aliases:?\s*$/i, '') # Remove "- aliases" suffix + end - # Extract header and content - lines = section.lines - header = lines.first.strip - content = lines[1..].join.strip + # Clean up the title + title = title.gsub(/\s+/, ' ').strip # Normalize spaces - next if header.empty? || content.empty? + # Generate a more descriptive title by combining blog title and section title + blog_title = entry['title'].sub(/\s+-\s+.*$/, '').strip + section_title = if title.downcase.start_with?(blog_title.downcase) + title # Use section title if it already includes blog title + else + "#{blog_title} - #{title}" # Combine blog title with section title + end + + # Skip if no content left after title + next if section.strip.empty? - # Create entry for blog section - entry = { - 'title' => header, - 'content' => content.gsub(/\[([^\]]+)\]\(([^\)]+)\)/, '\1') # Remove markdown formatting - .gsub(/[*_]{1,2}([^*_]+)[*_]{1,2}/, '\1'), - 'url' => "#{BLOG_URL}/0_README##{generate_anchor(header)}", - 'type' => 'blog_post', - 'priority' => 3 # Lower priority for blog posts - } - search_db << entry + # Split content into paragraphs + paragraphs = section.split(/\n\n+/).map(&:strip).reject(&:empty?) + + paragraphs.each do |para| + # Skip code blocks and HTML + next if para.start_with?('```') || para.start_with?('<') + next if para.match?(/^[\s#*\-]+$/) # Skip lines that are just formatting + + # Split long paragraphs into smaller chunks + if para.length > 300 + # Split by sentences + sentences = para.split(/(?<=[.!?])\s+(?=[A-Z])/) + current_chunk = [] + current_length = 0 + + sentences.each do |sentence| + if current_length + sentence.length > 300 + # Store current chunk if not empty + if current_chunk.any? + chunk_text = current_chunk.join(' ').strip + if chunk_text.length >= 50 # Only store substantial chunks + processed_entries << { + 'title' => section_title, + 'content' => chunk_text, + 'url' => entry['url'], + 'type' => 'blog_excerpt', + 'priority' => 3 + } + end + current_chunk = [] + current_length = 0 + end + end + current_chunk << sentence + current_length += sentence.length + end + + # Store any remaining content + if current_chunk.any? + chunk_text = current_chunk.join(' ').strip + if chunk_text.length >= 50 + processed_entries << { + 'title' => section_title, + 'content' => chunk_text, + 'url' => entry['url'], + 'type' => 'blog_excerpt', + 'priority' => 3 + } + end + end + else + # For shorter paragraphs, store as is if substantial + if para.length >= 50 + processed_entries << { + 'title' => section_title, + 'content' => para, + 'url' => entry['url'], + 'type' => 'blog_excerpt', + 'priority' => 3 + } + end + end + end end end + + puts "Generated #{processed_entries.length} searchable entries from blog content" + processed_entries + rescue JSON::ParserError => e + puts "Error parsing blog content: #{e.message}" + [] end + else + puts "No blog content file found. Run 'node scripts/fetch_blog_content.js' first." + [] end +end + +begin + puts "Generating search database..." + + # Add blog entries to search database + search_db.concat(fetch_blog_content) # Write to JSON file in source assets/js directory first source_file = File.join(File.dirname(__FILE__), '..', 'assets', 'js', 'search_db.json') diff --git a/scripts/package.json b/scripts/package.json new file mode 100644 index 0000000..9b22750 --- /dev/null +++ b/scripts/package.json @@ -0,0 +1,12 @@ +{ + "name": "comphy-lab-blog-crawler", + "version": "1.0.0", + "description": "Blog content crawler for CoMPhy Lab website", + "private": true, + "scripts": { + "fetch": "node fetch_blog_content.js" + }, + "dependencies": { + "puppeteer": "^22.0.0" + } +} \ No newline at end of file