From 75060e45772e38839184885786a256a9541d999d Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 27 Nov 2024 12:11:43 +0100 Subject: [PATCH 01/40] Simplified Psydac installation --- chapter1/install.md | 14 ++++---------- requirements.txt | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/chapter1/install.md b/chapter1/install.md index d846439..b1bccf3 100644 --- a/chapter1/install.md +++ b/chapter1/install.md @@ -6,23 +6,17 @@ It is recommanded to use a virtual environement. ```shell # create a virtual environement -python3 -m venv .iga-python +python3 -m venv iga-python-env # activate this environement using -source .iga-python/bin/activate +source iga-python-env/bin/activate ``` Then install dependencies using ```shell -pip3 install wheel -pip3 install numpy -pip3 install pyccel -pip3 install ipykernel -pip3 install git+https://github.com/pyccel/sympde.git -pip3 install git+https://github.com/pyccel/gelato.git -pip3 install git+https://github.com/pyccel/psydac.git -pip3 install git+https://github.com/girving/igakit.git +pip3 install 'psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac' +pip3 install notebook ``` Adding the virtual environement to Jupyter notebook, can be done using diff --git a/requirements.txt b/requirements.txt index 1841b8a..5a40e83 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,4 @@ sphinx-proof matplotlib pyccel ipykernel -git+https://github.com/pyccel/psydac.git +psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac \ No newline at end of file From c80436265122bac47c8ee4a4da52350290f70922 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 27 Nov 2024 12:32:00 +0100 Subject: [PATCH 02/40] CI: Simplified dependency installation --- .github/workflows/deploy-book.yml | 38 ++++++++++++------------------- requirements.txt | 1 + 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index b8bb9be..a1c487e 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -2,40 +2,32 @@ name: Build and Deploy Jupyter Book on: push: - branches: - - master + branches: [ master ] + pull_request: + branches: [ master ] jobs: deploy-book: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v2 + - name: Set up Python 3.12 + uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.12' + cache: 'pip' + cache-dependency-path: | + requirements.txt - - name: Install dependencies - run: | - python -m pip install --upgrade pip - sudo apt-get update - sudo apt-get install gfortran - sudo apt-get install openmpi-bin libopenmpi-dev - sudo apt-get install libhdf5-openmpi-dev - git clone https://github.com/pyccel/psydac.git - cd psydac - python -m pip install -r requirements.txt - python -m pip install -r requirements_extra.txt --no-build-isolation - pip install . - pip install jupyter-book ghp-import sphinx_proof - python -m ipykernel install --user --name .iga-python --display-name "IGA-Python" - python -m ipykernel install --user --name v_psydac --display-name "Python (v_psydac)" + - name: Install Jupyter Book and Psydac + run: pip3 install -r requirements.txt - name: Build Jupyter Book run: jupyter-book build . - name: Deploy to GitHub Pages + if: github.ref == 'refs/heads/master' run: ghp-import -n -p -f _build/html env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 5a40e83..024f065 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,5 @@ sphinx-proof matplotlib pyccel ipykernel +notebook psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac \ No newline at end of file From f09510c7baac31e994c9c0ef8a725c510f0de463 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 27 Nov 2024 12:51:47 +0100 Subject: [PATCH 03/40] CI: Install Psdyac dependencies --- .github/workflows/deploy-book.yml | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index a1c487e..3132e75 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -1,4 +1,4 @@ -name: Build and Deploy Jupyter Book +name: Build IGA-Python Jupyter Book on: push: @@ -20,8 +20,28 @@ jobs: cache-dependency-path: | requirements.txt + - name: Install non-Python dependencies on Ubuntu + if: matrix.os == 'ubuntu-latest' + uses: awalsh128/cache-apt-pkgs-action@latest + with: + packages: gfortran openmpi-bin libopenmpi-dev libhdf5-openmpi-dev + version: 1.0 + execute_install_scripts: true + + # When loading cached apt packages, the default MPI compiler isn't set. + # Workaround is to 'reinstall' openmpi-bin, which doesn't actually perform + # installation (since openmpi-bin already exists), but instead reruns + # `update-alternatives` which fixes the symlinks to mpicc/mpif90. + - name: Set default MPI and HDF5 C compilers on Ubuntu + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt-get update + sudo apt-get install --reinstall openmpi-bin libhdf5-openmpi-dev + - name: Install Jupyter Book and Psydac - run: pip3 install -r requirements.txt + run: | + pip3 install --upgrade pip + pip3 install -r requirements.txt - name: Build Jupyter Book run: jupyter-book build . From addbe4adb310e4bbc800dce41c4ed624aa3c7187 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 27 Nov 2024 12:55:11 +0100 Subject: [PATCH 04/40] CI: matrix.os == 'ubuntu-latest' is unnecessary --- .github/workflows/deploy-book.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 3132e75..1616abf 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -17,11 +17,9 @@ jobs: with: python-version: '3.12' cache: 'pip' - cache-dependency-path: | - requirements.txt + cache-dependency-path: requirements.txt - - name: Install non-Python dependencies on Ubuntu - if: matrix.os == 'ubuntu-latest' + - name: Install GCC and OpenMPI uses: awalsh128/cache-apt-pkgs-action@latest with: packages: gfortran openmpi-bin libopenmpi-dev libhdf5-openmpi-dev @@ -32,8 +30,7 @@ jobs: # Workaround is to 'reinstall' openmpi-bin, which doesn't actually perform # installation (since openmpi-bin already exists), but instead reruns # `update-alternatives` which fixes the symlinks to mpicc/mpif90. - - name: Set default MPI and HDF5 C compilers on Ubuntu - if: matrix.os == 'ubuntu-latest' + - name: Set default MPI and HDF5 C compilers run: | sudo apt-get update sudo apt-get install --reinstall openmpi-bin libhdf5-openmpi-dev From a8b34b821e2e303338e9d66921cb6eec6d329cb1 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 27 Nov 2024 13:46:34 +0100 Subject: [PATCH 05/40] Fixed jupyter-book complaints in references.bib * Duplicate entries * 'keywords' field can't be repeated --- references.bib | 371 +++++++++++++++++++++++-------------------------- 1 file changed, 174 insertions(+), 197 deletions(-) diff --git a/references.bib b/references.bib index e383e38..d84914e 100644 --- a/references.bib +++ b/references.bib @@ -320,7 +320,11 @@ @article{Buffa2011b url = {http://dx.doi.org/10.1002/fld.2337}, doi = {10.1002/fld.2337}, pages = {1407--1422}, -keywords = {IsoGeometric Analysis, NURBS, stability, incompressibility, Stokes flow}, +keywords = {IsoGeometric Analysis, + NURBS, + stability, + incompressibility, + Stokes flow}, year = {2011}, } @@ -386,11 +390,11 @@ @article{Vuong2010 doi = "10.1016/j.cagd.2010.06.006", url = "http://www.sciencedirect.com/science/article/pii/S0167839610000713", author = "A.-V. Vuong and Ch. Heinrich and B. Simeon", -keywords = "Isogeometric Analysis", -keywords = "MATLAB", -keywords = "NURBS", -keywords = "Exact geometry", -keywords = "Tutorial code" +keywords = {"Isogeometric Analysis", + "MATLAB", + "NURBS", + "Exact geometry", + "Tutorial code"} } @article{Gomez2010, @@ -429,16 +433,16 @@ @article{deFalco2011 doi = "10.1016/j.advengsoft.2011.06.010", url = "http://www.sciencedirect.com/science/article/pii/S0965997811001839", author = "C. de Falco and A. Reali and R. Vázquez", -keywords = "Isogeometric Analysis", -keywords = "Finite element method", -keywords = "NURBS", -keywords = "B-Splines", -keywords = "Matlab", -keywords = "Octave" +keywords = {"Isogeometric Analysis", + "Finite element method", + "NURBS", + "B-Splines", + "Matlab", + "Octave"} } -@article{Manni2011, -title = "Isogeometric analysis in advection¿diffusion problems: Tension splines approximation", +@article{Manni2011a, +title = "Isogeometric analysis in advection-diffusion problems: Tension splines approximation", journal = "Journal of Computational and Applied Mathematics", volume = "236", number = "4", @@ -449,11 +453,11 @@ @article{Manni2011 doi = "10.1016/j.cam.2011.05.029", url = "http://www.sciencedirect.com/science/article/pii/S037704271100286X", author = "Carla Manni and Francesca Pelosi and M. Lucia Sampoli", -keywords = "Advection¿diffusion problems", -keywords = "Isogeometric Analysis", -keywords = "Variable degree splines", -keywords = "Exponential splines", -keywords = "Splines in tension" +keywords = {"Advection-diffusion problems", + "Isogeometric Analysis", + "Variable degree splines", + "Exponential splines", + "Splines in tension"} } @article{Costantini2010, @@ -468,12 +472,12 @@ @article{Costantini2010 doi = "10.1016/j.cagd.2010.07.004", url = "http://www.sciencedirect.com/science/article/pii/S0167839610000762", author = "Paolo Costantini and Carla Manni and Francesca Pelosi and M. Lucia Sampoli", -keywords = "Quasi-interpolation", -keywords = "Isogeometric analysis", -keywords = "Generalized B-splines" +keywords = {"Quasi-interpolation", + "Isogeometric analysis", + "Generalized B-splines"} } -@article{Manni2011, +@article{Manni2011b, title = "Generalized B-splines as a tool in isogeometric analysis", journal = "Computer Methods in Applied Mechanics and Engineering", volume = "200", @@ -485,10 +489,10 @@ @article{Manni2011 doi = "10.1016/j.cma.2010.10.010", url = "http://www.sciencedirect.com/science/article/pii/S0045782510002884", author = "Carla Manni and Francesca Pelosi and M. Lucia Sampoli", -keywords = "Isogeometric analysis", -keywords = "Generalized B-splines", -keywords = "NURBS", -keywords = "CAD" +keywords = {"Isogeometric analysis", + "Generalized B-splines", + "NURBS", + "CAD"} } @article{Farouki2012, @@ -503,12 +507,12 @@ @article{Farouki2012 doi = "10.1016/j.cagd.2012.03.001", url = "http://www.sciencedirect.com/science/article/pii/S0167839612000192", author = "Rida T. Farouki", -keywords = "Bernstein basis", -keywords = "Weierstrass theorem", -keywords = "Polynomial approximation", -keywords = "Bézier curves and surfaces", -keywords = "Numerical stability", -keywords = "Polynomial algorithms" +keywords = {"Bernstein basis", + "Weierstrass theorem", + "Polynomial approximation", + "Bézier curves and surfaces", + "Numerical stability", + "Polynomial algorithms"} } @article{Schillinger2012, @@ -523,12 +527,12 @@ @article{Schillinger2012 doi = "10.1016/j.cma.2012.03.017", url = "http://www.sciencedirect.com/science/article/pii/S004578251200093X", author = "Dominik Schillinger and Luca Ded\`e and Michael A. Scott and John A. Evans and Michael J. Borden and Ernst Rank and Thomas J.R. Hughes", -keywords = "Isogeometric analysis", -keywords = "Hierarchical refinement", -keywords = "Adaptivity with NURBS", -keywords = "Immersed boundary analysis", -keywords = "Finite cell method", -keywords = "T-spline CAD surfaces" +keywords = {"Isogeometric analysis", + "Hierarchical refinement", + "Adaptivity with NURBS", + "Immersed boundary analysis", + "Finite cell method", + "T-spline CAD surfaces"} } @article{Schillinger2011, @@ -543,12 +547,12 @@ @article{Schillinger2011 doi = "10.1016/j.cma.2011.08.002", url = "http://www.sciencedirect.com/science/article/pii/S004578251100257X", author = "Dominik Schillinger and Ernst Rank", -keywords = "High-order B-spline finite elements", -keywords = "Regular grid", -keywords = "Hierarchical refinement", -keywords = "Interface problems", -keywords = "Complex geometries", -keywords = "Finite Cell Method" +keywords = {"High-order B-spline finite elements", + "Regular grid", + "Hierarchical refinement", + "Interface problems", + "Complex geometries", + "Finite Cell Method"} } @article{Collier2012, @@ -563,11 +567,11 @@ @article{Collier2012 doi = "10.1016/j.cma.2011.11.002", url = "http://www.sciencedirect.com/science/article/pii/S0045782511003392", author = "Nathan Collier and David Pardo and Lisandro Dalcin and Maciej Paszynski and V.M. Calo", -keywords = "Isogeometric analysis", -keywords = "Direct solvers", -keywords = "Multi-frontal solvers", -keywords = "k-Refinement", -keywords = "Performance" +keywords = {"Isogeometric analysis", + "Direct solvers", + "Multi-frontal solvers", + "k-Refinement", + "Performance"} } @article{Martin2010, @@ -582,9 +586,9 @@ @article{Martin2010 doi = "10.1016/j.cag.2010.03.011", url = "http://www.sciencedirect.com/science/article/pii/S0097849310000506", author = "Tobias Martin and Elaine Cohen", -keywords = "Trivariate b-spline modeling and generation", -keywords = "Volumetric parameterization", -keywords = "Model acquisition for simulation" +keywords = {"Trivariate b-spline modeling and generation", + "Volumetric parameterization", + "Model acquisition for simulation"} } @article{Martin2012, @@ -599,10 +603,10 @@ @article{Martin2012 doi = "10.1016/j.cag.2012.03.008", url = "http://www.sciencedirect.com/science/article/pii/S0097849312000477", author = "Tobias Martin and Elaine Cohen and Robert M. Kirby", -keywords = "Model completion", -keywords = "Volumetric parameterization", -keywords = "Meshing", -keywords = "Physically-based animation and simulation" +keywords = {"Model completion", + "Volumetric parameterization", + "Meshing", + "Physically-based animation and simulation"} } @article{Wang2011, @@ -617,11 +621,11 @@ @article{Wang2011 doi = "10.1016/j.cad.2011.08.026", url = "http://www.sciencedirect.com/science/article/pii/S0010448511002259", author = "Ping Wang and Jinlan Xu and Jiansong Deng and Falai Chen", -keywords = "Isogeometric analysis (IGA)", -keywords = "FEA", -keywords = "PHT-splines", -keywords = "RPHT-splines", -keywords = "Residual-based a posteriori error estimator" +keywords = {"Isogeometric analysis (IGA)", + "FEA", + "PHT-splines", + "RPHT-splines", + "Residual-based a posteriori error estimator"} } @article{NguyenThanh2011, @@ -636,10 +640,10 @@ @article{NguyenThanh2011 doi = "10.1016/j.cma.2011.01.018", url = "http://www.sciencedirect.com/science/article/pii/S0045782511000338", author = "N. Nguyen-Thanh and H. Nguyen-Xuan and S.P.A. Bordas and T. Rabczuk", -keywords = "Isogeometric analysis", -keywords = "T-spline", -keywords = "T-meshes", -keywords = "PHT-spline" +keywords = {"Isogeometric analysis", + "T-spline", + "T-meshes", + "PHT-spline"} } @article{Giannelli2012, @@ -654,10 +658,10 @@ @article{Giannelli2012 doi = "10.1016/j.cagd.2012.03.025", url = "http://www.sciencedirect.com/science/article/pii/S0167839612000519", author = "Carlotta Giannelli and Bert Juttler and Hendrik Speleers", -keywords = "Hierarchical tensor¿product B-splines", -keywords = "Truncated basis", -keywords = "Local refinement", -keywords = "Partition of unity" +keywords = {"Hierarchical tensor¿product B-splines", + "Truncated basis", + "Local refinement", + "Partition of unity"} } @article{Tian2011, @@ -672,11 +676,11 @@ @article{Tian2011 doi = "10.1016/j.cam.2011.05.016", url = "http://www.sciencedirect.com/science/article/pii/S0377042711002639", author = "Li Tian and Falai Chen and Qiang Du", -keywords = "Numerical PDEs", -keywords = "Adaptive finite element", -keywords = "Adaptive PHT-splines", -keywords = "A posteriori error estimations", -keywords = "Hierarchical T-meshes" +keywords = {"Numerical PDEs", + "Adaptive finite element", + "Adaptive PHT-splines", + "A posteriori error estimations", + "Hierarchical T-meshes"} } @article{Scott2012, @@ -691,10 +695,10 @@ @article{Scott2012 doi = "10.1016/j.cma.2011.11.022", url = "http://www.sciencedirect.com/science/article/pii/S0045782511003689", author = "M.A. Scott and X. Li and T.W. Sederberg and T.J.R. Hughes", -keywords = "Isogeometric analysis", -keywords = "T-splines", -keywords = "Local refinement", -keywords = "Bézier extraction" +keywords = {"Isogeometric analysis", + "T-splines", + "Local refinement", + "Bézier extraction"} } @article{Rypl2012, @@ -709,12 +713,12 @@ @article{Rypl2012 doi = "10.1016/j.advengsoft.2012.02.004", url = "http://www.sciencedirect.com/science/article/pii/S096599781200035X", author = "Daniel Rypl and Boek Patzák", -keywords = "Isogeometric analysis", -keywords = "B-splines", -keywords = "NURBS", -keywords = "T-splines", -keywords = "Structural analysis", -keywords = "Object oriented environment" +keywords = {"Isogeometric analysis", + "B-splines", + "NURBS", + "T-splines", + "Structural analysis", + "Object oriented environment"} } @article{XinLi2012, @@ -729,11 +733,11 @@ @article{XinLi2012 doi = "10.1016/j.cagd.2011.08.005", url = "http://www.sciencedirect.com/science/article/pii/S0167839611000938", author = "Xin Li and Jianmin Zheng and Thomas W. Sederberg and Thomas J.R. Hughes and Michael A. Scott", -keywords = "T-splines", -keywords = "Blending functions", -keywords = "Linear independence", -keywords = "NURBS", -keywords = "Isogeometric analysis" +keywords = {"T-splines", + "Blending functions", + "Linear independence", + "NURBS", + "Isogeometric analysis"} } @article{daVeiga2011, @@ -748,10 +752,10 @@ @article{daVeiga2011 doi = "10.1016/j.cma.2011.02.005", url = "http://www.sciencedirect.com/science/article/pii/S0045782511000405", author = "L. Beir\`ao da Veiga and A. Buffa and D. Cho and G. Sangalli", -keywords = "IsoGeometric analysis", -keywords = "T-splines", -keywords = "Approximation", -keywords = "Error estimates" +keywords = {"IsoGeometric analysis", + "T-splines", + "Approximation", + "Error estimates"} } @article{Buffa2012, @@ -766,10 +770,10 @@ @article{Buffa2012 doi = "10.1016/j.cma.2011.09.005", url = "http://www.sciencedirect.com/science/article/pii/S0045782511002945", author = "A. Buffa and D. Cho and M. Kumar", -keywords = "Isogeometric analysis", -keywords = "T-splines", -keywords = "Characterization", -keywords = "Local refinement" +keywords = {"Isogeometric analysis", + "T-splines", + "Characterization", + "Local refinement"} } @article{daVeiga2012, @@ -784,10 +788,10 @@ @article{daVeiga2012 doi = "10.1016/j.cma.2012.02.025", url = "http://www.sciencedirect.com/science/article/pii/S0045782512000679", author = "L. Beir\`ao da Veiga and A. Buffa and D. Cho and G. Sangalli", -keywords = "Isogeometric analysis", -keywords = "Analysis-Suitable T-splines", -keywords = "Dual-Compatible T-splines", -keywords = "Dual basis" +keywords = {"Isogeometric analysis", + "Analysis-Suitable T-splines", + "Dual-Compatible T-splines", + "Dual basis"} } @article{Berdinsky2012, @@ -802,9 +806,9 @@ @article{Berdinsky2012 doi = "10.1016/j.cag.2012.03.005", url = "http://www.sciencedirect.com/science/article/pii/S0097849312000441", author = "Dmitry Berdinsky and Min-jae Oh and Tae-wan Kim and Bernard Mourrain", -keywords = "Spline space", -keywords = "T-mesh", -keywords = "Dimension" +keywords = {"Spline space", + "T-mesh", + "Dimension"} } @article{Xu2011b, @@ -819,11 +823,11 @@ @article{Xu2011b doi = "10.1016/j.cma.2011.03.005", url = "http://www.sciencedirect.com/science/article/pii/S0045782511001101", author = "Gang Xu and Bernard Mourrain and R\'egis Duvigneau and Andr\'e Galligo", -keywords = "Isogeometric analysis", -keywords = "Injectivity of B-spline parameterization", -keywords = "Constraint optimization method", -keywords = "A posteriori error estimation", -keywords = "r-Refinement" +keywords = {"Isogeometric analysis", + "Injectivity of B-spline parameterization", + "Constraint optimization method", + "A posteriori error estimation", + "r-Refinement"} } @article{Ratnani2012b, @@ -849,12 +853,12 @@ @article{Bazilevs2012 doi = "10.1016/j.cma.2012.03.028", url = "http://www.sciencedirect.com/science/article/pii/S0045782512001041", author = "Y. Bazilevs and M.-C. Hsu and M.A. Scott", -keywords = "Isogeometric analysis", -keywords = "NURBS", -keywords = "T-splines", -keywords = "Fluid-structure interaction", -keywords = "Non-matching interface discretizations", -keywords = "NREL 5 MW offshore wind turbine rotor" +keywords = {"Isogeometric analysis", + "NURBS", + "T-splines", + "Fluid-structure interaction", + "Non-matching interface discretizations", + "NREL 5 MW offshore wind turbine rotor"} } @article{Buffa2010, @@ -869,10 +873,10 @@ @article{Buffa2010 doi = "10.1016/j.cma.2009.12.002", url = "http://www.sciencedirect.com/science/article/pii/S0045782509004010", author = "A. Buffa and G. Sangalli and R. Vázquez", -keywords = "Isogeometric analysis", -keywords = "Compatible schemes", -keywords = "Maxwell equations", -keywords = "Eigenvalue problem" +keywords = {"Isogeometric analysis", + "Compatible schemes", + "Maxwell equations", + "Eigenvalue problem"} } @article{Xu2011a, @@ -887,11 +891,11 @@ @article{Xu2011a doi = "10.1016/j.cad.2011.05.007", url = "http://www.sciencedirect.com/science/article/pii/S0010448511001175", author = "Gang Xu and Bernard Mourrain and R\'egis Duvigneau and Andr\'e Galligo", -keywords = "Isogeometric analysis", -keywords = "Analysis-aware parameterization of computational domain", -keywords = "Injectivity", -keywords = "Shape optimization", -keywords = "Steepest descent method" +keywords = {"Isogeometric analysis", + "Analysis-aware parameterization of computational domain", + "Injectivity", + "Shape optimization", + "Steepest descent method"} } @article{Heinrich2012, title = "A finite volume method on NURBS geometries and its application in isogeometric fluid¿structure interaction", @@ -905,12 +909,12 @@ @article{Heinrich2012 doi = "10.1016/j.matcom.2012.03.008", url = "http://www.sciencedirect.com/science/article/pii/S0378475412000730", author = "Ch. Heinrich and B. Simeon and St. Boschert", -keywords = "Finite volume method", -keywords = "NURBS", -keywords = "Exact geometry", -keywords = "Navier¿Stokes equations", -keywords = "Fluid¿structure interaction", -keywords = "Matching interface" +keywords = {"Finite volume method", + "NURBS", + "Exact geometry", + "Navier¿Stokes equations", + "Fluid¿structure interaction", + "Matching interface"} } @article{Shojaee2012, @@ -925,11 +929,11 @@ @article{Shojaee2012 doi = "10.1016/j.finel.2012.06.005", url = "http://www.sciencedirect.com/science/article/pii/S0168874X12001199", author = "S. Shojaee and E. Izadpanah and N. Valizadeh and J. Kiendl", -keywords = "Free vibration", -keywords = "Plate", -keywords = "Isogeometric analysis", -keywords = "NURBS", -keywords = "Kirchhoff plate" +keywords = {"Free vibration", + "Plate", + "Isogeometric analysis", + "NURBS", + "Kirchhoff plate"} } @article{Bazilevs2010, @@ -944,14 +948,14 @@ @article{Bazilevs2010 doi = "10.1016/j.cma.2009.02.036", url = "http://www.sciencedirect.com/science/article/pii/S0045782509000875", author = "Y. Bazilevs and V.M. Calo and J.A. Cottrell and J.A. Evans and T.J.R. Hughes and S. Lipton and M.A. Scott and T.W. Sederberg", -keywords = "T-splines", -keywords = "NURBS", -keywords = "Isogeometric analysis", -keywords = "CAD", -keywords = "FEA", -keywords = "Fluid dynamics", -keywords = "Structural analysis", -keywords = "PB-splines" +keywords = {"T-splines", + "NURBS", + "Isogeometric analysis", + "CAD", + "FEA", + "Fluid dynamics", + "Structural analysis", + "PB-splines"} } @article{Bornemann2013, @@ -966,10 +970,10 @@ @article{Bornemann2013 doi = "10.1016/j.cma.2012.06.023", url = "http://www.sciencedirect.com/science/article/pii/S0045782512002204", author = "P.B. Bornemann and F. Cirak", -keywords = "Finite elements", -keywords = "Hierarchical b-splines", -keywords = "Subdivision schemes", -keywords = "Isogeometric analysis" +keywords = {"Finite elements", + "Hierarchical b-splines", + "Subdivision schemes", + "Isogeometric analysis"} } @article{daVeiga2012b, @@ -984,9 +988,9 @@ @article{daVeiga2012b doi = "10.1016/j.cma.2011.10.016", url = "http://www.sciencedirect.com/science/article/pii/S0045782511003379", author = "L. Beir{\~a}o da Veiga and D. Cho and G. Sangalli", -keywords = "Isogeometric analysis", -keywords = "Anisotropic refinement", -keywords = "Error estimates" +keywords = {"Isogeometric analysis", + "Anisotropic refinement", + "Error estimates"} } @article{Buffa2013a, @@ -1001,12 +1005,12 @@ @article{Buffa2013a doi = "http://dx.doi.org/10.1016/j.cma.2013.05.014", url = "http://www.sciencedirect.com/science/article/pii/S004578251300131X", author = "Annalisa Buffa and Helmut Harbrecht and Angela Kunoth and Giancarlo Sangalli", -keywords = "Isogeometric analysis", -keywords = "Elliptic PDE", -keywords = "B-splines", -keywords = "Multilevel preconditioning", -keywords = "BPX-preconditioner", -keywords = "Uniformly bounded condition number " +keywords = {"Isogeometric analysis", + "Elliptic PDE", + "B-splines", + "Multilevel preconditioning", + "BPX-preconditioner", + "Uniformly bounded condition number"} } @article{Gahalaut2013a, @@ -1021,11 +1025,11 @@ @article{Gahalaut2013a doi = "http://dx.doi.org/10.1016/j.cma.2013.07.002", url = "http://www.sciencedirect.com/science/article/pii/S0045782513001722", author = "K.P.S. Gahalaut and S.K. Tomar and J.K. Kraus", -keywords = "Isogeometric analysis", -keywords = "B-splines and NURBS", -keywords = "Explicit form of B-splines", -keywords = "AMLI methods", -keywords = "Hierarchical spaces " +keywords = {"Isogeometric analysis", + "B-splines and NURBS", + "Explicit form of B-splines", + "AMLI methods", + "Hierarchical spaces"} } % ******************************************************************** @@ -1202,9 +1206,9 @@ @article{Chen2015a doi = "http://dx.doi.org/10.1016/j.camwa.2015.04.016", url = "http://www.sciencedirect.com/science/article/pii/S0898122115001972", author = "Long Chen and Junping Wang and Yanqiu Wang and Xiu Ye", -keywords = "Weak Galerkin finite element methods", -keywords = "Multigrid", -keywords = "Preconditioner " +keywords = {"Weak Galerkin finite element methods", + "Multigrid", + "Preconditioner"} } @Article{Grasedyck2015a, @@ -1338,11 +1342,11 @@ @article{Li2015a doi = "http://dx.doi.org/10.1016/j.cam.2015.03.043", url = "http://www.sciencedirect.com/science/article/pii/S037704271500196X", author = "Binjie Li and Xiaoping Xie", -keywords = "Diffusion problem", -keywords = "Weak Galerkin finite element", -keywords = "Condition number", -keywords = "Two-level algorithm", -keywords = "X–Z identity " +keywords = {"Diffusion problem", + "Weak Galerkin finite element", + "Condition number", + "Two-level algorithm", + "X–Z identity"} } @article{Li2016a, @@ -1676,24 +1680,6 @@ @article{mazza2019 publisher={American Mathematical Society} } -@article{garoni2014, - author="Garoni, Carlo - and Manni, Carla - and Pelosi, Francesca - and Serra-Capizzano, Stefano - and Speleers, Hendrik", - title="On the spectrum of stiffness matrices arising from isogeometric analysis", - journal="Numerische Mathematik", - year="2014", - volume="127", - number="4", - pages="751--799", - issn="0945-3245", - doi="10.1007/s00211-013-0600-2", - url="http://dx.doi.org/10.1007/s00211-013-0600-2" -} - - @article{sangalli2016, author = {Sangalli, Giancarlo and Tani, Mattia}, title = {Isogeometric Preconditioners Based on Fast Solvers for the Sylvester Equation}, @@ -2235,15 +2221,6 @@ @article{bossavit1998whitney publisher={IET} } -@book{monk2003finite, - title={Finite element methods for Maxwell's equations}, - author={Monk, Peter}, - year={2003}, - publisher={Oxford University Press} -} - - - @book{hughes2012finite, title={Finite Element Method: A Practical Course}, author={Hughes, Thomas JR}, From 51eea068875251834f3fd3cf83953919d4e741ca Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 27 Nov 2024 14:42:31 +0100 Subject: [PATCH 06/40] Removed machine-specific metadata embedded in .ipynb files --- chapter1/poisson.ipynb | 53 ++++-------- chapter2/advection-diffusion-stabilized.ipynb | 62 ++++---------- chapter2/advection-diffusion.ipynb | 69 ++++----------- chapter2/biharmonic.ipynb | 83 ++++--------------- chapter2/elliptic-curl.ipynb | 53 ++++-------- chapter2/elliptic-div.ipynb | 69 ++++----------- chapter2/elliptic-general-form.ipynb | 49 +++-------- chapter2/linear-elasticity.ipynb | 41 +++------ chapter2/poisson-mixed-v1.ipynb | 48 +++-------- chapter2/poisson-mixed-v2.ipynb | 48 +++-------- chapter2/poisson-mixed.ipynb | 7 +- chapter2/poisson-nitsche.ipynb | 29 +++---- chapter2/poisson.ipynb | 53 ++++-------- chapter2/stokes-v1.ipynb | 32 +++---- chapter2/stokes-v2.ipynb | 32 +++---- chapter2/stokes.ipynb | 7 +- chapter2/vector-poisson.ipynb | 53 ++++-------- .../poisson-multi-subdomains-nitsche.ipynb | 49 +++-------- chapter4/poisson-two-subdomains-nitsche.ipynb | 49 +++-------- .../cfd/bingham_plastic_flow_in_a_pipe.ipynb | 7 +- .../buoyancy-driven_natural_convection.ipynb | 7 +- .../cfd/casson_fluid_flow_in_a_channel.ipynb | 7 +- .../cfd/compressible_flow_in_a_nozzle.ipynb | 7 +- ...tion-diffusion_equation_in_a_channel.ipynb | 7 +- ...ss_power_law_fluid_flow_in_a_channel.ipynb | 7 +- chapter5/cfd/free_surface_flow.ipynb | 7 +- chapter5/cfd/heat_conduction_in_a_solid.ipynb | 7 +- ...erschel-bulkley_fluid_flow_in_a_pipe.ipynb | 7 +- .../incompressible_flow_past_a_cylinder.ipynb | 7 +- chapter5/cfd/magnetohydrodynamics_flow.ipynb | 7 +- .../oldroyd-b_fluid_flow_in_a_channel.ipynb | 7 +- ...apanastasiou_fluid_flow_in_a_channel.ipynb | 7 +- chapter5/cfd/particle-laden_flow.ipynb | 7 +- .../power_law_fluid_flow_in_a_channel.ipynb | 7 +- .../stokes_flow_in_a_lid-driven_cavity.ipynb | 7 +- chapter5/cfd/two-phase_flow.ipynb | 7 +- ...re_interaction_in_a_flexible_channel.ipynb | 7 +- ...sis_of_a_flexible_wing_in_fluid_flow.ipynb | 7 +- ...luid-structure_interaction_in_a_tube.ipynb | 7 +- .../composite_beam_analysis.ipynb | 7 +- ..._materials_with_piezoelectric_fibers.ipynb | 7 +- ...ite_materials_with_thermal_expansion.ipynb | 7 +- .../composite_pressure_vessel_analysis.ipynb | 7 +- .../composite_shaft_analysis.ipynb | 7 +- .../composite_shell_structures.ipynb | 7 +- .../creep_in_viscoelastic_materials.ipynb | 7 +- ...ffusion_and_reaction_in_porous_media.ipynb | 7 +- .../elasticity_with_thermal_expansion.ipynb | 7 +- ...fiber-reinforced_composite_materials.ipynb | 7 +- ...lation_in_directed_energy_deposition.ipynb | 7 +- .../heat_conduction_with_phase_change.ipynb | 7 +- ...mogenization_of_composite_structures.ipynb | 7 +- .../laminate_plate_bending.ipynb | 7 +- ...erial_simulation_in_material_jetting.ipynb | 7 +- .../piezoelectric_material.ipynb | 7 +- ...imulation_in_selective_laser_melting.ipynb | 7 +- ...lation_in_fused_filament_fabrication.ipynb | 7 +- ..._conductivity_of_composite_materials.ipynb | 7 +- ...rmal_simulation_in_powder_bed_fusion.ipynb | 7 +- ...hysical_dynamo_in_a_stellar_interior.ipynb | 3 +- ...rrofluid_damper_in_mechanical_system.ipynb | 3 +- ...ofluid_flow_in_a_microfluidic_device.ipynb | 3 +- ...etic_fluid_actuator_in_valve_control.ipynb | 3 +- ...magnetic_targeting_in_a_blood_vessel.ipynb | 3 +- ...ting_in_the_eye_for_retinal_diseases.ipynb | 3 +- .../magnetic_targeting_in_tumor_tissue.ipynb | 3 +- ...accretion_disk_in_binary_star_system.ipynb | 3 +- ...hd_aluminum_electromagnetic_stirring.ipynb | 3 +- .../mhd/mhd_continuous_casting_of_steel.ipynb | 3 +- .../mhd/mhd_dynamo_in_a_rotating_sphere.ipynb | 3 +- ...sfer_in_a_cylindrical_fusion_reactor.ipynb | 3 +- ...transfer_in_a_magma_convection_model.ipynb | 3 +- ...eat_transfer_in_a_rectangular_domain.ipynb | 3 +- ...oltz_instability_in_magnetized_flows.ipynb | 7 +- ...tal_solidification_in_magnetic_field.ipynb | 3 +- ...or_instability_in_a_conducting_fluid.ipynb | 7 +- chapter5/mhd/mhd_solar_wind_simulation.ipynb | 3 +- ..._of_a_current-carrying_plasma_column.ipynb | 3 +- ...ar_formation_in_a_protostellar_cloud.ipynb | 3 +- .../mhd_turbulence_in_accretion_disks.ipynb | 3 +- ...mhd_turbulence_in_laboratory_plasmas.ipynb | 3 +- .../mhd/mhd_turbulence_in_solar_winds.ipynb | 3 +- .../mhd/simple_kinematic_dynamo_model.ipynb | 3 +- 83 files changed, 381 insertions(+), 865 deletions(-) diff --git a/chapter1/poisson.ipynb b/chapter1/poisson.ipynb index 5315ae7..233edf5 100644 --- a/chapter1/poisson.ipynb +++ b/chapter1/poisson.ipynb @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -116,7 +116,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -126,7 +126,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -137,7 +137,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "5999c62b", "metadata": {}, "outputs": [], @@ -162,7 +162,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -196,18 +196,10 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.49756716724664e-07\n" - ] - } - ], + "outputs": [], "source": [ "ue = sin(pi*x)*sin(pi*y)\n", "\n", @@ -236,18 +228,10 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.768702410721585e-05\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = SemiNorm(u - ue, domain, kind='h1')\n", @@ -272,18 +256,10 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.769164089397408e-05\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = Norm(u - ue, domain, kind='h1')\n", @@ -309,9 +285,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -322,8 +298,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/advection-diffusion-stabilized.ipynb b/chapter2/advection-diffusion-stabilized.ipynb index b1ad0f9..7ca9d8f 100644 --- a/chapter2/advection-diffusion-stabilized.ipynb +++ b/chapter2/advection-diffusion-stabilized.ipynb @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -102,18 +102,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "87e62069", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2*kappa*pi**2*sin(pi*x1)*sin(pi*x2) + 1.0*pi*sin(pi*x2)*cos(pi*x1)\n" - ] - } - ], + "outputs": [], "source": [ "from sympde.expr import TerminalExpr\n", "\n", @@ -130,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "e4bbd1a8", "metadata": {}, "outputs": [], @@ -186,7 +178,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -196,7 +188,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -207,24 +199,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "5999c62b", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -251,7 +229,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "67b32148", "metadata": {}, "outputs": [], @@ -262,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -289,19 +267,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">>> SUPG = 0.002139370600719921\n", - ">>> GLS = 0.00021873265193415864\n" - ] - } - ], + "outputs": [], "source": [ "u = element_of(V, name='u')\n", "\n", @@ -335,9 +304,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -348,8 +317,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/advection-diffusion.ipynb b/chapter2/advection-diffusion.ipynb index 144da7e..1e29a6a 100644 --- a/chapter2/advection-diffusion.ipynb +++ b/chapter2/advection-diffusion.ipynb @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -92,18 +92,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "87e62069", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2*kappa*pi**2*sin(pi*x1)*sin(pi*x2) + 1.0*pi*sin(pi*x2)*cos(pi*x1)\n" - ] - } - ], + "outputs": [], "source": [ "from sympde.expr import TerminalExpr\n", "\n", @@ -120,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "e4bbd1a8", "metadata": {}, "outputs": [], @@ -161,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -171,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -182,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "5999c62b", "metadata": {}, "outputs": [], @@ -209,7 +201,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "67b32148", "metadata": {}, "outputs": [], @@ -219,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -245,18 +237,10 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.00022156219679932395\n" - ] - } - ], + "outputs": [], "source": [ "u = element_of(V, name='u')\n", "\n", @@ -283,18 +267,10 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.013033907531543579\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = SemiNorm(u - ue, domain, kind='h1')\n", @@ -319,18 +295,10 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.013035790553238334\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = Norm(u - ue, domain, kind='h1')\n", @@ -356,9 +324,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -369,8 +337,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/biharmonic.ipynb b/chapter2/biharmonic.ipynb index a7a8bfb..19cf321 100644 --- a/chapter2/biharmonic.ipynb +++ b/chapter2/biharmonic.ipynb @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "811c0b9b", "metadata": {}, "outputs": [], @@ -72,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -120,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -141,24 +141,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "5999c62b", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -180,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -206,18 +192,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.5367871671842632\n" - ] - } - ], + "outputs": [], "source": [ "u = element_of(V, name='u')\n", "\n", @@ -244,18 +222,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.4343747827631277\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = SemiNorm(u - ue, domain, kind='h1')\n", @@ -280,18 +250,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2.492853996086961\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = Norm(u - ue, domain, kind='h1')\n", @@ -316,18 +278,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "8a4adf8d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.115861322114647\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h2norm = SemiNorm(u - ue, domain, kind='h2')\n", @@ -353,9 +307,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -366,8 +320,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/elliptic-curl.ipynb b/chapter2/elliptic-curl.ipynb index a545198..f517cfd 100644 --- a/chapter2/elliptic-curl.ipynb +++ b/chapter2/elliptic-curl.ipynb @@ -70,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -129,7 +129,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -139,7 +139,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -150,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "5999c62b", "metadata": {}, "outputs": [], @@ -175,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -209,18 +209,10 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.49756716724664e-07\n" - ] - } - ], + "outputs": [], "source": [ "#u = element_of(V, name='u')\n", "\n", @@ -247,18 +239,10 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.768702410721585e-05\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "#h1norm = SemiNorm(u - ue, domain, kind='h1')\n", @@ -283,18 +267,10 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.769164089397408e-05\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "#h1norm = Norm(u - ue, domain, kind='h1')\n", @@ -320,9 +296,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -333,8 +309,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/elliptic-div.ipynb b/chapter2/elliptic-div.ipynb index 11974c6..f0f8679 100644 --- a/chapter2/elliptic-div.ipynb +++ b/chapter2/elliptic-div.ipynb @@ -71,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -130,7 +130,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -140,7 +140,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -151,24 +151,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "5999c62b", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -190,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -216,18 +202,10 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.49756716724664e-07\n" - ] - } - ], + "outputs": [], "source": [ "#ue = sin(pi*x)*sin(pi*y)\n", "\n", @@ -256,18 +234,10 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.768702410721585e-05\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "#h1norm = SemiNorm(u - ue, domain, kind='h1')\n", @@ -292,18 +262,10 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9.769164089397408e-05\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "#h1norm = Norm(u - ue, domain, kind='h1')\n", @@ -329,9 +291,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -342,8 +304,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/elliptic-general-form.ipynb b/chapter2/elliptic-general-form.ipynb index 724edc4..12ff900 100644 --- a/chapter2/elliptic-general-form.ipynb +++ b/chapter2/elliptic-general-form.ipynb @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "c2cee2d9", "metadata": {}, "outputs": [], @@ -86,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "2b05c79f", "metadata": {}, "outputs": [], @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "d0d386a2", "metadata": {}, "outputs": [], @@ -132,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "96c29a27", "metadata": {}, "outputs": [], @@ -143,24 +143,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "ef6a9709", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -182,7 +168,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "3bafe9f5", "metadata": {}, "outputs": [], @@ -192,7 +178,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "b88daf50", "metadata": {}, "outputs": [], @@ -218,18 +204,10 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "3440e74a", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.00021948770944141364\n" - ] - } - ], + "outputs": [], "source": [ "u = element_of(V, name='u')\n", "\n", @@ -257,9 +235,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -270,8 +248,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/linear-elasticity.ipynb b/chapter2/linear-elasticity.ipynb index 72f2425..8f42c49 100644 --- a/chapter2/linear-elasticity.ipynb +++ b/chapter2/linear-elasticity.ipynb @@ -79,7 +79,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -111,11 +111,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "b16cc745", - "metadata": { - "scrolled": true - }, + "metadata": {}, "outputs": [], "source": [ "# bilinear form\n", @@ -124,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "0a0f152c", "metadata": {}, "outputs": [], @@ -167,7 +165,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -177,7 +175,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -188,24 +186,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "5999c62b", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -227,7 +211,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -246,9 +230,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -259,8 +243,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/poisson-mixed-v1.ipynb b/chapter2/poisson-mixed-v1.ipynb index 1f030b8..e5f1ac2 100644 --- a/chapter2/poisson-mixed-v1.ipynb +++ b/chapter2/poisson-mixed-v1.ipynb @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "bcb6daca", "metadata": {}, "outputs": [], @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "e5234456", "metadata": {}, "outputs": [], @@ -117,24 +117,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "1d8e59bb", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -158,7 +144,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "02abfb7d", "metadata": {}, "outputs": [], @@ -168,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "e2d935e8", "metadata": {}, "outputs": [], @@ -205,7 +191,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "b6c85077", "metadata": {}, "outputs": [], @@ -222,19 +208,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "52fdeaec", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">>> norm-l2 uh = 0.012985071480053038\n", - ">>> norm-l2 ph = 0.004127522959699811\n" - ] - } - ], + "outputs": [], "source": [ "l2norm = l2norm_uh.assemble(u=uh)\n", "print('>>> norm-l2 uh = ', l2norm)\n", @@ -262,9 +239,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -275,8 +252,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/poisson-mixed-v2.ipynb b/chapter2/poisson-mixed-v2.ipynb index f30b455..058bcc2 100644 --- a/chapter2/poisson-mixed-v2.ipynb +++ b/chapter2/poisson-mixed-v2.ipynb @@ -56,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "bcb6daca", "metadata": {}, "outputs": [], @@ -115,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "e5234456", "metadata": {}, "outputs": [], @@ -126,24 +126,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "1d8e59bb", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -167,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "02abfb7d", "metadata": {}, "outputs": [], @@ -177,7 +163,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "e2d935e8", "metadata": {}, "outputs": [], @@ -214,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "31967fb4", "metadata": {}, "outputs": [], @@ -231,19 +217,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "9c3f7e15", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">>> norm-l2 uh = 64.20821457571618\n", - ">>> norm-l2 ph = 3254706679445337.5\n" - ] - } - ], + "outputs": [], "source": [ "l2norm = l2norm_uh.assemble(u=uh)\n", "print('>>> norm-l2 uh = ', l2norm)\n", @@ -263,9 +240,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -276,8 +253,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/poisson-mixed.ipynb b/chapter2/poisson-mixed.ipynb index 15b28ee..686d6db 100644 --- a/chapter2/poisson-mixed.ipynb +++ b/chapter2/poisson-mixed.ipynb @@ -36,9 +36,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -49,8 +49,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/poisson-nitsche.ipynb b/chapter2/poisson-nitsche.ipynb index 68d5626..c475e64 100644 --- a/chapter2/poisson-nitsche.ipynb +++ b/chapter2/poisson-nitsche.ipynb @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "ecd1330a", "metadata": {}, "outputs": [], @@ -105,7 +105,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "3d86674b", "metadata": {}, "outputs": [], @@ -116,7 +116,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "94c83267", "metadata": {}, "outputs": [], @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "8f1b2d68", "metadata": {}, "outputs": [], @@ -151,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "e96f321c", "metadata": {}, "outputs": [], @@ -177,18 +177,10 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "068bdb95", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.00021402394834116976\n" - ] - } - ], + "outputs": [], "source": [ "u = element_of(V, name='u')\n", "\n", @@ -208,9 +200,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -221,8 +213,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/poisson.ipynb b/chapter2/poisson.ipynb index 0e26eb1..5ea4f82 100644 --- a/chapter2/poisson.ipynb +++ b/chapter2/poisson.ipynb @@ -46,7 +46,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -107,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -118,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "5999c62b", "metadata": {}, "outputs": [], @@ -143,7 +143,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "004dfdb3", "metadata": {}, "outputs": [], @@ -153,7 +153,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -187,18 +187,10 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.00042499840633644024\n" - ] - } - ], + "outputs": [], "source": [ "u = element_of(V, name='u')\n", "\n", @@ -225,18 +217,10 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.025283770887649267\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = SemiNorm(u - ue, domain, kind='h1')\n", @@ -261,18 +245,10 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.025287342563909892\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = Norm(u - ue, domain, kind='h1')\n", @@ -290,9 +266,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -303,8 +279,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/stokes-v1.ipynb b/chapter2/stokes-v1.ipynb index ee653e3..372fa28 100644 --- a/chapter2/stokes-v1.ipynb +++ b/chapter2/stokes-v1.ipynb @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -113,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -124,7 +124,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "5999c62b", "metadata": {}, "outputs": [], @@ -151,7 +151,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "6230e0ac", "metadata": {}, "outputs": [], @@ -161,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -198,7 +198,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "5925c6cd", "metadata": {}, "outputs": [], @@ -215,19 +215,10 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">>> norm-l2 uh = 5.852908166372369e-05\n", - ">>> norm-l2 ph = 0.01411215698700372\n" - ] - } - ], + "outputs": [], "source": [ "l2norm = l2norm_uh.assemble(u=uh)\n", "print('>>> norm-l2 uh = ', l2norm)\n", @@ -247,9 +238,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -260,8 +251,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/stokes-v2.ipynb b/chapter2/stokes-v2.ipynb index 72c8847..832186b 100644 --- a/chapter2/stokes-v2.ipynb +++ b/chapter2/stokes-v2.ipynb @@ -49,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -108,7 +108,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -119,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "5999c62b", "metadata": {}, "outputs": [], @@ -146,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -156,7 +156,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "504a182d", "metadata": {}, "outputs": [], @@ -193,7 +193,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "5925c6cd", "metadata": {}, "outputs": [], @@ -210,19 +210,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - ">>> norm-l2 uh = 1.860724404008467e-05\n", - ">>> norm-l2 ph = 0.024428172461472355\n" - ] - } - ], + "outputs": [], "source": [ "l2norm = l2norm_uh.assemble(u=uh)\n", "print('>>> norm-l2 uh = ', l2norm)\n", @@ -234,9 +225,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -247,8 +238,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/stokes.ipynb b/chapter2/stokes.ipynb index d53ca5a..f34b683 100644 --- a/chapter2/stokes.ipynb +++ b/chapter2/stokes.ipynb @@ -26,9 +26,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -39,8 +39,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter2/vector-poisson.ipynb b/chapter2/vector-poisson.ipynb index 26a1cec..328f079 100644 --- a/chapter2/vector-poisson.ipynb +++ b/chapter2/vector-poisson.ipynb @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "d742586c", "metadata": {}, "outputs": [], @@ -101,7 +101,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "a2a0a2a1", "metadata": {}, "outputs": [], @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "00e54163", "metadata": {}, "outputs": [], @@ -122,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "5999c62b", "metadata": {}, "outputs": [], @@ -147,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "541192ee", "metadata": {}, "outputs": [], @@ -181,18 +181,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "5925c6cd", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0003267962376349343\n" - ] - } - ], + "outputs": [], "source": [ "ue1 = sin(pi*x)*sin(pi*y)*sin(pi*z)\n", "ue2 = sin(pi*x)*sin(pi*y)*sin(pi*z)\n", @@ -226,18 +218,10 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "e5c1a8b8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.01956220393797005\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = SemiNorm(error, domain, kind='h1')\n", @@ -262,18 +246,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "d829e410", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.01956493339348906\n" - ] - } - ], + "outputs": [], "source": [ "# create the formal Norm object\n", "h1norm = Norm(error, domain, kind='h1')\n", @@ -299,9 +275,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -312,8 +288,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter4/poisson-multi-subdomains-nitsche.ipynb b/chapter4/poisson-multi-subdomains-nitsche.ipynb index 6bfeb9e..eb2b570 100644 --- a/chapter4/poisson-multi-subdomains-nitsche.ipynb +++ b/chapter4/poisson-multi-subdomains-nitsche.ipynb @@ -22,7 +22,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "2ae922ff", "metadata": {}, "outputs": [], @@ -89,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "dba29398", "metadata": {}, "outputs": [], @@ -100,26 +100,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "4c341883", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -141,7 +125,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "b6ad348a", "metadata": {}, "outputs": [], @@ -151,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "11c1b23b", "metadata": {}, "outputs": [], @@ -177,18 +161,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "e295fb37", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4.582516733061099e-05\n" - ] - } - ], + "outputs": [], "source": [ "ue = sin(pi*x)*sin(pi*y)\n", "\n", @@ -218,9 +194,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -231,8 +207,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter4/poisson-two-subdomains-nitsche.ipynb b/chapter4/poisson-two-subdomains-nitsche.ipynb index 5c82cba..eddf4c4 100644 --- a/chapter4/poisson-two-subdomains-nitsche.ipynb +++ b/chapter4/poisson-two-subdomains-nitsche.ipynb @@ -49,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "2ae922ff", "metadata": {}, "outputs": [], @@ -118,7 +118,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "dba29398", "metadata": {}, "outputs": [], @@ -129,26 +129,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "4c341883", - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/ranania/PYCCEL/IGA-Python/.iga-python/lib/python3.10/site-packages/sympy/matrices/repmatrix.py:90: SymPyDeprecationWarning: \n", - "\n", - "non-Expr objects in a Matrix has been deprecated since SymPy 1.9. Use\n", - "list of lists, TableForm or some other data structure instead. See\n", - "https://github.com/sympy/sympy/issues/21497 for more info.\n", - "\n", - " ).warn()\n" - ] - } - ], + "metadata": {}, + "outputs": [], "source": [ "# Create computational domain from topological domain\n", "domain_h = discretize(domain, ncells=ncells, comm=None)\n", @@ -170,7 +154,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "b6ad348a", "metadata": {}, "outputs": [], @@ -180,7 +164,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "11c1b23b", "metadata": {}, "outputs": [], @@ -206,18 +190,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "e295fb37", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.0002193529744905818\n" - ] - } - ], + "outputs": [], "source": [ "ue = sin(pi*x)*sin(pi*y)\n", "\n", @@ -293,9 +269,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -306,8 +282,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb index ffdf167..9f1c3f7 100644 --- a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb @@ -57,9 +57,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -70,8 +70,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb index 4889263..15cefef 100644 --- a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb +++ b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb @@ -60,9 +60,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -73,8 +73,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb index 68d3765..6a84d7c 100644 --- a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb @@ -53,9 +53,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -66,8 +66,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb index c5e585a..dcd2523 100644 --- a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb +++ b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb @@ -59,9 +59,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -72,8 +72,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb index 527ea3f..7b4dd24 100644 --- a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb +++ b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb @@ -57,9 +57,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -70,8 +70,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb index fe910d5..42636e7 100644 --- a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb @@ -56,9 +56,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -69,8 +69,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/free_surface_flow.ipynb b/chapter5/cfd/free_surface_flow.ipynb index 052f68b..16617a3 100644 --- a/chapter5/cfd/free_surface_flow.ipynb +++ b/chapter5/cfd/free_surface_flow.ipynb @@ -59,9 +59,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -72,8 +72,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/heat_conduction_in_a_solid.ipynb b/chapter5/cfd/heat_conduction_in_a_solid.ipynb index d080ad6..ee0fd19 100644 --- a/chapter5/cfd/heat_conduction_in_a_solid.ipynb +++ b/chapter5/cfd/heat_conduction_in_a_solid.ipynb @@ -53,9 +53,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -66,8 +66,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb index e176362..42ec152 100644 --- a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb @@ -58,9 +58,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -71,8 +71,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb index 6eef450..1d3f493 100644 --- a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb +++ b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb @@ -54,9 +54,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -67,8 +67,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/magnetohydrodynamics_flow.ipynb b/chapter5/cfd/magnetohydrodynamics_flow.ipynb index 5ee2a16..4e3709d 100644 --- a/chapter5/cfd/magnetohydrodynamics_flow.ipynb +++ b/chapter5/cfd/magnetohydrodynamics_flow.ipynb @@ -60,9 +60,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -73,8 +73,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb index d0b3142..1c1fd21 100644 --- a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb @@ -58,9 +58,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -71,8 +71,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb index 11c239e..8ae68f5 100644 --- a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb @@ -55,9 +55,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -68,8 +68,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/particle-laden_flow.ipynb b/chapter5/cfd/particle-laden_flow.ipynb index 1dc88d8..d3c66d8 100644 --- a/chapter5/cfd/particle-laden_flow.ipynb +++ b/chapter5/cfd/particle-laden_flow.ipynb @@ -58,9 +58,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -71,8 +71,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb index 009157f..ec87e8e 100644 --- a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb @@ -55,9 +55,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -68,8 +68,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb b/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb index 3c8d2b5..94187e5 100644 --- a/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb +++ b/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb @@ -57,9 +57,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -70,8 +70,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/cfd/two-phase_flow.ipynb b/chapter5/cfd/two-phase_flow.ipynb index ca1217f..21ebe46 100644 --- a/chapter5/cfd/two-phase_flow.ipynb +++ b/chapter5/cfd/two-phase_flow.ipynb @@ -57,9 +57,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -70,8 +70,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb b/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb index 1f38d59..555c989 100644 --- a/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb +++ b/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb @@ -72,9 +72,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -85,8 +85,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb b/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb index 82cf269..05624ba 100644 --- a/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb +++ b/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb @@ -66,9 +66,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -79,8 +79,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb b/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb index dec2cfa..5c3a75d 100644 --- a/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb +++ b/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb @@ -65,9 +65,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -78,8 +78,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/composite_beam_analysis.ipynb b/chapter5/material-science/composite_beam_analysis.ipynb index d76fbd1..3456627 100644 --- a/chapter5/material-science/composite_beam_analysis.ipynb +++ b/chapter5/material-science/composite_beam_analysis.ipynb @@ -39,9 +39,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb index 45a83f2..3dbd903 100644 --- a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb +++ b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb @@ -39,9 +39,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb index 5a93dbb..7ffa33c 100644 --- a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb +++ b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb index 751797a..70b2a3e 100644 --- a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb +++ b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb @@ -40,9 +40,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -53,8 +53,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/composite_shaft_analysis.ipynb b/chapter5/material-science/composite_shaft_analysis.ipynb index 8d54747..8965691 100644 --- a/chapter5/material-science/composite_shaft_analysis.ipynb +++ b/chapter5/material-science/composite_shaft_analysis.ipynb @@ -39,9 +39,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/composite_shell_structures.ipynb b/chapter5/material-science/composite_shell_structures.ipynb index 38a1ab1..ec421cc 100644 --- a/chapter5/material-science/composite_shell_structures.ipynb +++ b/chapter5/material-science/composite_shell_structures.ipynb @@ -39,9 +39,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb index 9d834b5..021820a 100644 --- a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb +++ b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb index f1b3e58..642801b 100644 --- a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb +++ b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb index 3098acf..fa739d1 100644 --- a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb +++ b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb index 12168fa..650cd37 100644 --- a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb +++ b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb index 85c292e..9c31bba 100644 --- a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb +++ b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/heat_conduction_with_phase_change.ipynb b/chapter5/material-science/heat_conduction_with_phase_change.ipynb index a35d825..1d2e6f2 100644 --- a/chapter5/material-science/heat_conduction_with_phase_change.ipynb +++ b/chapter5/material-science/heat_conduction_with_phase_change.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/homogenization_of_composite_structures.ipynb b/chapter5/material-science/homogenization_of_composite_structures.ipynb index f28e9fa..7cec21a 100644 --- a/chapter5/material-science/homogenization_of_composite_structures.ipynb +++ b/chapter5/material-science/homogenization_of_composite_structures.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/laminate_plate_bending.ipynb b/chapter5/material-science/laminate_plate_bending.ipynb index a7e89c4..1430432 100644 --- a/chapter5/material-science/laminate_plate_bending.ipynb +++ b/chapter5/material-science/laminate_plate_bending.ipynb @@ -39,9 +39,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb index ea3ba4d..0268ed6 100644 --- a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb +++ b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/piezoelectric_material.ipynb b/chapter5/material-science/piezoelectric_material.ipynb index 5c6c876..cd2e14b 100644 --- a/chapter5/material-science/piezoelectric_material.ipynb +++ b/chapter5/material-science/piezoelectric_material.ipynb @@ -39,9 +39,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb index 2a5af24..ed57066 100644 --- a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb +++ b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb @@ -37,9 +37,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -50,8 +50,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb index fcf7f58..7d0bf07 100644 --- a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb +++ b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb @@ -37,9 +37,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -50,8 +50,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb index d3be39d..2a294ed 100644 --- a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb +++ b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb index b5f5d86..1fe0253 100644 --- a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb +++ b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb @@ -38,9 +38,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -51,8 +51,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb b/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb index 170c4db..a78f131 100644 --- a/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb +++ b/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb @@ -48,8 +48,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb b/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb index 297a295..bb6a133 100644 --- a/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb +++ b/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb @@ -48,8 +48,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb b/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb index 85275c5..9039a94 100644 --- a/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb +++ b/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb @@ -47,8 +47,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb b/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb index ce9883b..fe2ce8d 100644 --- a/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb +++ b/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb @@ -53,8 +53,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb b/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb index 21419cc..88bbe64 100644 --- a/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb +++ b/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb @@ -48,8 +48,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb b/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb index 58e8506..4218723 100644 --- a/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb +++ b/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb @@ -53,8 +53,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb b/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb index e88bf86..f54aeeb 100644 --- a/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb +++ b/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb @@ -48,8 +48,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb b/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb index 0560b80..911a5ae 100644 --- a/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb +++ b/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb @@ -55,8 +55,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb b/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb index 106e409..1c787e6 100644 --- a/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb +++ b/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb @@ -48,8 +48,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb b/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb index 5eba25c..9fe4621 100644 --- a/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb +++ b/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb @@ -48,8 +48,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb b/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb index 8b6f726..ac8ef41 100644 --- a/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb +++ b/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb @@ -46,8 +46,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb b/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb index d662793..e9c74d2 100644 --- a/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb +++ b/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb @@ -44,8 +44,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb b/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb index bebd343..a0b68b6 100644 --- a/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb +++ b/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb @@ -48,8 +48,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb b/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb index 91b83d1..71da301 100644 --- a/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb +++ b/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb @@ -45,8 +45,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb b/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb index 0ba84c2..3cd727a 100644 --- a/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb +++ b/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb @@ -41,9 +41,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -54,8 +54,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb b/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb index b2358b9..c96d9db 100644 --- a/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb +++ b/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb b/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb index 12e7569..d55a0a6 100644 --- a/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb +++ b/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb @@ -41,9 +41,9 @@ ], "metadata": { "kernelspec": { - "display_name": ".iga-python", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": ".iga-python" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -54,8 +54,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_solar_wind_simulation.ipynb b/chapter5/mhd/mhd_solar_wind_simulation.ipynb index a72185a..23becb1 100644 --- a/chapter5/mhd/mhd_solar_wind_simulation.ipynb +++ b/chapter5/mhd/mhd_solar_wind_simulation.ipynb @@ -47,8 +47,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb b/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb index 04fc79c..c8c0840 100644 --- a/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb +++ b/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb @@ -57,8 +57,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb b/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb index f1c2cd4..c630484 100644 --- a/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb +++ b/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb @@ -47,8 +47,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb b/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb index 55bd425..febda1f 100644 --- a/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb +++ b/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb b/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb index 79eb746..8dee705 100644 --- a/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb +++ b/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb @@ -54,8 +54,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb b/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb index fae62d4..79137c9 100644 --- a/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb +++ b/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb @@ -52,8 +52,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/chapter5/mhd/simple_kinematic_dynamo_model.ipynb b/chapter5/mhd/simple_kinematic_dynamo_model.ipynb index bde7bf4..a63d163 100644 --- a/chapter5/mhd/simple_kinematic_dynamo_model.ipynb +++ b/chapter5/mhd/simple_kinematic_dynamo_model.ipynb @@ -46,8 +46,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.12" + "pygments_lexer": "ipython3" } }, "nbformat": 4, From e1e00e0a7d7d49c52ad134ba6e9153f00956087e Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 27 Nov 2024 18:30:15 +0100 Subject: [PATCH 07/40] Updated Installation guide --- .github/workflows/deploy-book.yml | 11 ++----- chapter1/install.md | 50 ++++++++++++++++++++++++------- requirements.txt | 1 + 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 1616abf..48418db 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -12,13 +12,6 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up Python 3.12 - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - cache-dependency-path: requirements.txt - - name: Install GCC and OpenMPI uses: awalsh128/cache-apt-pkgs-action@latest with: @@ -37,8 +30,8 @@ jobs: - name: Install Jupyter Book and Psydac run: | - pip3 install --upgrade pip - pip3 install -r requirements.txt + pip install --upgrade pip + pip install -r requirements.txt - name: Build Jupyter Book run: jupyter-book build . diff --git a/chapter1/install.md b/chapter1/install.md index b1bccf3..d1bb9e3 100644 --- a/chapter1/install.md +++ b/chapter1/install.md @@ -1,26 +1,56 @@ # Installation -*Author: Ahmed Ratnani* -It is recommanded to use a virtual environement. +To be able to run the examples in this guide, we recommend to follow these steps: +1. Download the [IGA-Python] source files. + +```bash +git clone https://github.com/pyccel/IGA-Python.git + +# Save and show the absolute path to the IGA-Python directory. +IGA_PYTHON_DIR=$(realpath IGA-Python) +echo "IGA_PYTHON_DIR=${IGA_PYTHON_DIR}" +``` + +2. Create a virtual Python environment. ```shell -# create a virtual environement python3 -m venv iga-python-env -# activate this environement using -source iga-python-env/bin/activate +# Save and show the absolute path to the IGA-Python environment script. +IGA_PYTHON_ENV=$(realpath iga-python-env/bin/activate) +echo "IGA_PYTHON_ENV=${IGA_PYTHON_ENV}" ``` -Then install dependencies using +2. Install the necessary Python packages. ```shell -pip3 install 'psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac' -pip3 install notebook +cd ${IGA_PYTHON_DIR} + +# Python packages required by IGA-Python will +# be installed in IGA-Python virtual environment. +source ${IGA_PYTHON_ENV} +pip3 install -r requirements.txt ``` -Adding the virtual environement to Jupyter notebook, can be done using +3. Launch Jupyter notebook. ```shell -python3 -m ipykernel install --user --name=.iga-python +jupyter notebook ``` + +The above command should automatically launch your web browser and show you the [IGA-Python] files you've downloaded from Step 1: + +![png](images/ch1-jupyter-root.png) + +Try opening a sample notebook. Navigate to `chapter1/` and find `poisson.ipynb`: + +![png](images/ch1-jupyter-poisson-1.png) + + +Open `poisson.ipynb`. Check that you can successfully run all cells in this notebook. + +![png](images/ch1-jupyter-poisson-2.png) + + +[IGA-Python]: https://github.com/pyccel/IGA-Python.git \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 024f065..85d11b6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,5 @@ matplotlib pyccel ipykernel notebook +nb-clean psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac \ No newline at end of file From ee4171ff6060d8e6fd70e49a440dd44d64441332 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 4 Dec 2024 16:23:05 +0100 Subject: [PATCH 08/40] Improved the Installation guide --- _toc.yml | 2 +- chapter1/install.md | 49 +++++++++++++++++++-------------------------- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/_toc.yml b/_toc.yml index 8159f13..1db5e02 100644 --- a/_toc.yml +++ b/_toc.yml @@ -32,7 +32,7 @@ parts: - file: chapter1/topology - file: chapter1/space - file: chapter1/rules - - file: chapter1/poisson + - file: chapter1/poisson - file: chapter1/boundary-conditions - file: chapter1/geometry sections: diff --git a/chapter1/install.md b/chapter1/install.md index d1bb9e3..20e490c 100644 --- a/chapter1/install.md +++ b/chapter1/install.md @@ -1,56 +1,49 @@ # Installation -To be able to run the examples in this guide, we recommend to follow these steps: +To run the examples in this guide, we recommend to follow these steps: -1. Download the [IGA-Python] source files. +1. Download the [IGA-Python] repository and then install its dependencies. ```bash +# Download IGA-Python git clone https://github.com/pyccel/IGA-Python.git +cd IGA-Python -# Save and show the absolute path to the IGA-Python directory. -IGA_PYTHON_DIR=$(realpath IGA-Python) -echo "IGA_PYTHON_DIR=${IGA_PYTHON_DIR}" -``` - -2. Create a virtual Python environment. - -```shell +# Install required Python packages python3 -m venv iga-python-env - -# Save and show the absolute path to the IGA-Python environment script. -IGA_PYTHON_ENV=$(realpath iga-python-env/bin/activate) -echo "IGA_PYTHON_ENV=${IGA_PYTHON_ENV}" -``` - -2. Install the necessary Python packages. - -```shell -cd ${IGA_PYTHON_DIR} - -# Python packages required by IGA-Python will -# be installed in IGA-Python virtual environment. -source ${IGA_PYTHON_ENV} +source iga-python-env/bin/activate pip3 install -r requirements.txt ``` -3. Launch Jupyter notebook. +2. Access [IGA-Python] examples through Jupyter notebook. ```shell +# Run this command under IGA-Python folder jupyter notebook ``` -The above command should automatically launch your web browser and show you the [IGA-Python] files you've downloaded from Step 1: +Running `jupyter notebook` should automatically launch your web browser and show you the files in the current directory—in this case the [IGA-Python] files: ![png](images/ch1-jupyter-root.png) -Try opening a sample notebook. Navigate to `chapter1/` and find `poisson.ipynb`: +Try opening a sample notebook, e.g. `chapter1/poisson.ipynb`: ![png](images/ch1-jupyter-poisson-1.png) -Open `poisson.ipynb`. Check that you can successfully run all cells in this notebook. +Open `poisson.ipynb` and verify that you can successfully run all cells in this notebook. ![png](images/ch1-jupyter-poisson-2.png) +3. When you close Jupyter and would like to run the [IGA-Python] examples, just open your Terminal/Console app and run these commands: + +```shell +cd /full/path/to/your/IGA-Python # Change this to where your IGA-Python folder is located +source iga-python-env/bin/activate +jupyter notebook +``` + +**Congratulations!** You can now head over to the [Poisson example problem](poisson.ipynb) to get started. + [IGA-Python]: https://github.com/pyccel/IGA-Python.git \ No newline at end of file From 4ceaead897454d83ac6cb63425c0fb1809e3ffb9 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 4 Dec 2024 16:45:54 +0100 Subject: [PATCH 09/40] Uploaded images used in the Installation guide --- chapter1/images/ch1-jupyter-poisson-1.png | Bin 0 -> 68909 bytes chapter1/images/ch1-jupyter-poisson-2.png | Bin 0 -> 143755 bytes chapter1/images/ch1-jupyter-root.png | Bin 0 -> 91442 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 chapter1/images/ch1-jupyter-poisson-1.png create mode 100644 chapter1/images/ch1-jupyter-poisson-2.png create mode 100644 chapter1/images/ch1-jupyter-root.png diff --git a/chapter1/images/ch1-jupyter-poisson-1.png b/chapter1/images/ch1-jupyter-poisson-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcc1d22c030c4454829661f5caddaf1066c6b0b GIT binary patch literal 68909 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 literal 0 HcmV?d00001 diff --git a/chapter1/images/ch1-jupyter-poisson-2.png b/chapter1/images/ch1-jupyter-poisson-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec82bd8412e69348e9ba5dff684bc5a4d6e2903 GIT binary patch literal 143755 zcmaI8cQ}{*8$N!MN)jR=8AUQOGLtQPk2kVqlaak=s0blslkAYaM+qUL>@9omJ-?TF zKF9I>{{Hwm4$mWR?)U4y?(213=XqY|%Nqqb@oQMOun+{fCMhAJgdiAG@EL%K4&Rx6 za$*4gyYfOp-3~!;zMp@hMKa)!A_yfSDI$b&)>$5PdP=ZIimdO2Q@zC#1wDrg2zi9+B|hV--h&#AD%Ggo$W|{;>Y*6)#)R{sU`c$SXBr$QLyQ2|15}pTbG~)JB1l$`3_tNIlU`NZ@E^QfQZ@`WH|Y1LAZYwQP1-RkEGXOC+s!bKM?u%qe>oY$``Ax z=(BUyBi{U7=_2E2)b+o=A&l9}_%!S8zwqN_YnsN=R1`cGqlwV2a$HfDV&y_Z5ZTYM z&Q6;*GqY?6{@uYHzgijWhMpZMhq2=WE~~L=F_rzp{m)tjzNG(F2MJ+xh)&;olTpKd ztuOa^f8GcNB)BeSM~Caz;J(c6DN21Vg}^djUUKL5mrQMASa(rwI@Qk4^!2|5|69!V zy?u1Cvk(%#SW=~5HJVOVnPN4sGe5~(L}CM?VPtL{)2L}iJ;{^XMY@V&P zwS$w5!y_q~KH%BnYM_)_zBa`TmVwcRDFLrbmoY{vJ%Xw{WF>0Q-lLB+ebYZ|@ARue zkkV1gl}lwO&6O`Uey>~C&4~RXGMbq1E-!cPmC({Ue)p_Fg^J_VN7|U`Z*+v`p-MUY z)3e}}rbNee7>lCkbJ@JX6=*JKtlF3PE0u!Z{nIV?{qg8<**X^}f4xd}G zu~SXKGc@#=IJLy(#w%F_D-~}R(`aA58b%Oui&vM2$EB`g4D9)7*RrI!x~h(9X*<}9 zjL;r_{H#&nK8YJqYBgqPVsaU|a^;GEOk%ae7L66p-v@^p?YNvIU^Dr>>6+ISe_=VP zyJ0f1yrRm|MY?sh@jcOZ*%+R0Og278zW|$rJL}uGZ`^isOghyABR}6p98$)WSVNZW^^^dj>dEDz&>D*p8GJ5H!nA z(9joI4iBdp$V%Y8T$bpvK#JIW@=xi1bbZO<#w->Jzu>Bx-7estlH!w+g2okCOY7+9 zsL5rmAEbipKWjx9^#=Y;NAsSw=lycAyhbB_8(!9f^!POkX!J}>iR&jK4n9rrS~mOH zw-0eK6_u6nQ!Y~h*IZp)Tb&hcHhRpuM>VQcwJ}aJf=RhXYYCdhKJdEWbDj8TR2HLd z=9rs*GVj$WspL5<>v$t@6;aSYq&c2FT=f`@kj^H>DFymJ1!T?)6T1<7AHqX zk`dZkqm}y(d@t7Du@buf5nii3(Sq+d?g`i~6O-~f9NH&&o}hU@`{3Y}x3~JcaWpko zzTe8EGvR{w*4MA6HLhhF7X2ML4Y4J41#!H=!6%MA^L>`QyfxLT`RY^=EeItK&v19! zQqMwng2(x#1F*@W-oM{o^igatDk>T-G@EjoY6>M2c-EF4oRllm{_`ig_h8&!sj+TwWDMs%$%d!N#OM1(z#Nf2%K-pefYN{%kDJ zNIE)Si^Opb2N|jI@`7;QJU!k@J=*KT$kQp>ExSs@oMpAM{wtMAJoMCUbGl}or|P9+ zWmT2(4GyQVW0kh((Q8#??yJk*XeVgNUouU%oeZiD5Bx_fT{Z^_j&R98V__Tay^D); zqNASf*)Z5!_2Vcl)+*IcTRia=EO> zMv9-k%*)G@pdKp!lm7~rTt&LzFlBLjemro@q{CcRvIZy6*6Ll_FlI3}8gW;_L^{gZ zX?cDqn-D49Szq7Uxq?$WF<81%FxBj~yKddxM22X^CtSFM``CW}MOmI_Ywla@YiVg| zuW%?x@L9@JD!36A?C!1+_i>*Kmo8npdGqGu$B&U02b)IPWC_;d?iUam8k+75nFMx+ zMc*V(eJ56z-_)h*<6|{m8s!QVcBpQAeEixZc9-T-FGSFx!@Q)Zq+qmoqdn$*aZgWV zjv6ir>!*maGS(lSp8uKvE+b1kiu^JgDfA-S$kU{gaTq3K(=%IjsQODxc>*g)5!-ePMCpnX#28uarhA&2j3#`=0|gZ{EE5`-|zU#G}0CHXTVJ9;tq z8{B8>;`@Z6O1(e6ZhLEX!!;{cNl!H6Y(G|9kLtqH@WQn@Q{~$xLTqhq-VH#YjA396~>t>tP8SVgA){QRI}q$i4rQSE{5#+L8JGxbCL zv_nrnF&2iE+_ua@0XthkWr|ILuRkNJT86Dgst+dqJVDCOCWItRP4mf55j+;tu8OU> zH38>(78#kJ5me0~*RBwMu2eBLR<)JFLgp72VLcLQX|@%|UmITC5Y5WU;x02))KI;I zc=Gf6i;BAKt)$Y@b8%TW1O&&QBzIab&C257>}H3hhlIp&St$hny{$Xjglt@FSBEOP z+jnv`TH1R#Oy@eXrN@~q63s0aE3P;?`uX0lx{a{gr}P_JeetdJaJ3#h+C5T=1McI zw!Czb8E>2(ce`7mr#O|nt?68-xioY)EH?I*q~|(GTFLYN5Hha3ufyHgf43>#;obPh zE|V|o(7ZSyTTc1|>Pjt#J7iIM&!4jyZOT{`hdd(=AQjGR`kBZVNBVDl^KFVw483w= zWIQfT(_;UFdLAo_R%wSE>J{!JTz`SXc}XODv7-CGe>h<3$P;4LKM(#`i762C7gJ^O z=Zr_v`!pii4eML~p~oCo?JRtN@rygx1s!gFox1)Xf=oHg*6B9`YS1}1wPT>5-N1sK z)H%1|%uDXG^B+Kcwdj!6I=2PES9js&@=?g8XJ976#Bk?NTG^jV|F_V?q248_NNPzR z!FQ1{{-fEMt9ryV3~bVrc<-oN8h$POTbE9D|M*ME@cg_yriiwP2xY0Z)-O7uB|*zRCIa5Ni*g5-IXX2gqE4vYxjXVO@!i‹*#ao5p zP-fujZ(ue&x3wwpOrb4cpz|kvXC?fL+I!`9DwSq7oT(-8zvo=Zxgq+C{UqCj@JQ{K z$rIoqco(7cLAK5EeGimx8C+Dl~>MMkBl^z5^LKp2G^=34o9WT3wz!|uM-{{Xl`f?|IE z>Hp9+>hiO+e{YBfe%qk&G(ktD%G)&_oqkV`NekUi<^_^ILZ%l_>Gn56)At z6Xyt}X!(&=iat_5=I=#NM6@@svQScrH@JMdOkPFOXUnq2y!|h;O0eouQYsM!6;#|8 zuD|b-nfKM&G?NJ^+225&zpHQLzsC(ox$+{zKSl;Q=5SRt`+qmEc=I#r7g2I`^>No9 zstcDdW8c30Vt)O)Rw&NjM$PvS+m4Q!nwtInGh!&nFafo?MzpwuZ2ng8N*zh{8@Z4&;He%V;40v)j zV2mcZtusNuYhvOKe-hW?a2WFCd8bvZaRAPh`9Ev<>FG_Q6Lo(6{+7eFQ!cKR<_g-{ zqr+8G?_pGEGy9#Tv8R6-MRZ zy7RlYcV^aHOiZk)U9)Wb>}uapIoVBBrMnA@b8WJeeqCyQ=?j0TYOfLVzD{3AZ4Ox* zubShld-N<#BbdqGFYmx|rO2dZ#1AWuMs~LINcX~ebSVrYnRadF9sVyvi;FLLWlyw?^5 zOlRfj4S~dFd)PvMS!bY1j_Tz+MYACDkxAX?kt?`sW4Xg0ex=@GcUFFdiQ)U~$t%aD zA&2IUgy(&yj$5<2x5hA5Q1{aX}0q4`x!cI&Zf^`gb#qLABsi<8U8HfI9VH1`OniOQ?WW@#3~ z5LeITCli|`4vCII*(;YQ8w0dm5z9jv1uHx6;)<)!FgLvrV z6hSPf!!h>wZ`9!MaCB58pU15>mbcGyR7bX(rDUZwYi)bww`M)KjM?u;CM9|83~|We z^=6v1v^afhP|JI|I=k4~j)r*G)}Ag?cr6d4O!?}1O3KQX6c9k zJb2AYh+z7zuV+qUOSE5qBhtH1QLAL>;S6OoU6ML{5+3fyj|BJS9T!H_X?xI-wGcA- z#K-Vx^K()GrTGcpabiQU=}b=_mpaO7;^JCOT2hIHOa|~vb>)pNaaqvP)9bGldM%Zd zl%Uo3eZ7usZ*Lp7f8ci?V2KRoSDMIh z5#{cVj-dLTqE~nv9}f(xJy1r|+X%nc+Hok)-8X--fk}>hx$q@NLEGcOHPToUL&L%{ z`2_xx>ye9ZBJMk_4xLOkUcDL=K+qJt)K|hl+S%e#vAZ`8aeZc5>F~VFq3#R^fmK$! zAK2~&5j8b6MR@I}XsXqf?OsF>QGd~HlMbvpH#Idi6TLGuAbJK<%(k|DpS4LH@5eV! zIjnES@*Iit@$n FM=}@tsRJzXav;-S(`MX=E39^z>9!`}QJeF4Qlp7ai^{cuY>W zz}Dq3`~B(57lk?>eoZA#s~!nmU4gpf`fuMpR!%M}2Zx4Q>s#igr-Rt%>$tW$nxppg z=~GW39|_IrKfjt5cUt_HmzR0|{HdsLS-iCvf`bE4AJZ4J#{J&Ihu0Buepf>yqru$g zYO(16jERUSF+*0qFs`!NHrIZ#OTZdyCwy zAalIW$CrTCH1hMaTbUIC5}?7lxw(+sOiL%=Lqb@ls`w1R?y(7Si3@8Oe?k*W2oF28WyR@{l$~Y!6vEf{1^{TPCIqcJ|swAl#S3kT%U#%L~mCm|8X=

TnU|Mv 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%0DD?6xsC18 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 z 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 Date: Wed, 19 Feb 2025 08:18:01 +0100 Subject: [PATCH 10/40] Added missing newlines --- .github/workflows/deploy-book.yml | 3 ++- requirements.txt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 48418db..c1ca75d 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -40,4 +40,5 @@ jobs: if: github.ref == 'refs/heads/master' run: ghp-import -n -p -f _build/html env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + diff --git a/requirements.txt b/requirements.txt index 85d11b6..f7a18c3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,5 @@ pyccel ipykernel notebook nb-clean -psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac \ No newline at end of file +psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac + From 624140d6b54cc64ad0c5113c22036380d0b47a84 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 08:51:55 +0100 Subject: [PATCH 11/40] Added macos-15 test --- .github/workflows/deploy-book.yml | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index c1ca75d..53cbf41 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -8,11 +8,23 @@ on: jobs: deploy-book: - runs-on: ubuntu-24.04 + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-24.04 + python-version: '3.12' + + - os: macos-15 + python-version: '3.12' + + name: ${{ matrix.os }} / Python ${{ matrix.python-version }} + steps: - uses: actions/checkout@v4 - - name: Install GCC and OpenMPI + - name: Install non-Python dependencies on Ubuntu + if: startsWith(matrix.os, 'ubuntu') uses: awalsh128/cache-apt-pkgs-action@latest with: packages: gfortran openmpi-bin libopenmpi-dev libhdf5-openmpi-dev @@ -23,11 +35,17 @@ jobs: # Workaround is to 'reinstall' openmpi-bin, which doesn't actually perform # installation (since openmpi-bin already exists), but instead reruns # `update-alternatives` which fixes the symlinks to mpicc/mpif90. - - name: Set default MPI and HDF5 C compilers + - name: Reconfigure non-Python dependencies on Ubuntu + if: startsWith(matrix.os, 'ubuntu') run: | sudo apt-get update sudo apt-get install --reinstall openmpi-bin libhdf5-openmpi-dev + - name: Install non-Python dependencies on macOS + if: startsWith(matrix.os, 'macos') + run: | + brew install open-mpi hdf5-mpi libomp + - name: Install Jupyter Book and Psydac run: | pip install --upgrade pip From 6f56d21d9a5645d494ca9124d92bd28810313b1a Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 09:10:07 +0100 Subject: [PATCH 12/40] CI: Set default Fortran compiler --- .github/workflows/deploy-book.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 53cbf41..5b4a092 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -10,15 +10,18 @@ jobs: deploy-book: runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: include: - os: ubuntu-24.04 python-version: '3.12' + fortran-compiler: gfortran-14 - os: macos-15 python-version: '3.12' + fortran-compiler: gfortran-14 - name: ${{ matrix.os }} / Python ${{ matrix.python-version }} + name: ${{ matrix.os }} / Python ${{ matrix.python-version }} steps: - uses: actions/checkout@v4 @@ -46,6 +49,11 @@ jobs: run: | brew install open-mpi hdf5-mpi libomp + - name: Set default Fortran compiler to ${{ fortran-compiler }} + run: | + export FC=${{ fortran-compiler }} + $FC --version + - name: Install Jupyter Book and Psydac run: | pip install --upgrade pip From c2f95add3f18cea5e16f197b372189d0e9f23cf4 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 09:15:04 +0100 Subject: [PATCH 13/40] CI: Changed to another way of setting Fortran compiler --- .github/workflows/deploy-book.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 5b4a092..9665dac 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -15,11 +15,12 @@ jobs: include: - os: ubuntu-24.04 python-version: '3.12' - fortran-compiler: gfortran-14 - os: macos-15 python-version: '3.12' - fortran-compiler: gfortran-14 + + env: + FC: gfortran-14 name: ${{ matrix.os }} / Python ${{ matrix.python-version }} @@ -49,9 +50,8 @@ jobs: run: | brew install open-mpi hdf5-mpi libomp - - name: Set default Fortran compiler to ${{ fortran-compiler }} + - name: Check Fortran compiler version run: | - export FC=${{ fortran-compiler }} $FC --version - name: Install Jupyter Book and Psydac From b0efb86d9547593336700ef7b2618b0b322c4a16 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 09:22:56 +0100 Subject: [PATCH 14/40] CI: Downgrade to macOS 14 --- .github/workflows/deploy-book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 9665dac..6194d01 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -16,7 +16,7 @@ jobs: - os: ubuntu-24.04 python-version: '3.12' - - os: macos-15 + - os: macos-14 python-version: '3.12' env: From b28f0ef3ba4e844e4991db07e726d85252000a3a Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 09:29:58 +0100 Subject: [PATCH 15/40] requirements.txt: removed [extra] identifier when installing psydac --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index f7a18c3..ad59e44 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,5 +7,5 @@ pyccel ipykernel notebook nb-clean -psydac[extra] @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac +psydac @ git+https://github.com/pyccel/psydac.git@devel#egg=psydac From 036d64e2687ecdff1a683a1505a620f8ddafc0f7 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 09:33:41 +0100 Subject: [PATCH 16/40] CI: Enabled parallel builds with Make --- .github/workflows/deploy-book.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 6194d01..d921dba 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -21,6 +21,7 @@ jobs: env: FC: gfortran-14 + MAKEFLAGS: -j4 name: ${{ matrix.os }} / Python ${{ matrix.python-version }} From 0997f1bdaf8fd4ef62225f096dab311f22cf0389 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 09:49:15 +0100 Subject: [PATCH 17/40] CI: Added setup python step and switched back to macos-15 --- .github/workflows/deploy-book.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index d921dba..a100c32 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -16,7 +16,7 @@ jobs: - os: ubuntu-24.04 python-version: '3.12' - - os: macos-14 + - os: macos-15 python-version: '3.12' env: @@ -28,6 +28,13 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: 'pip' + cache-dependency-path: requirements.txt + - name: Install non-Python dependencies on Ubuntu if: startsWith(matrix.os, 'ubuntu') uses: awalsh128/cache-apt-pkgs-action@latest From d2e7769139f38a6d2288117ac7a11ce0a2737c17 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 12:10:35 +0100 Subject: [PATCH 18/40] CI: Enabled SSH debugging --- .github/workflows/deploy-book.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index a100c32..14fa432 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -62,6 +62,15 @@ jobs: run: | $FC --version + - name: Setup upterm session + if: startsWith(matrix.os, 'macos') + uses: lhotari/action-upterm@v1 + with: + ## limits ssh access and adds the ssh public key for the user which triggered the workflow + limit-access-to-actor: true + ## limits ssh access and adds the ssh public keys of the listed GitHub users + limit-access-to-users: kvrigor + - name: Install Jupyter Book and Psydac run: | pip install --upgrade pip From 49fa5c039510749b3e82cf62979465c4d975553f Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 12:14:15 +0100 Subject: [PATCH 19/40] CI: Used upterm fork from owenthereal --- .github/workflows/deploy-book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 14fa432..8279cf5 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -64,7 +64,7 @@ jobs: - name: Setup upterm session if: startsWith(matrix.os, 'macos') - uses: lhotari/action-upterm@v1 + uses: owenthereal/action-upterm@v1 with: ## limits ssh access and adds the ssh public key for the user which triggered the workflow limit-access-to-actor: true From 912b1f192eafd76d011628ae8337d23f3da72d59 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 12:18:49 +0100 Subject: [PATCH 20/40] CI: Upterm not working for macOS; Tried explicitly setting gfortran --- .github/workflows/deploy-book.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 8279cf5..2dfa1fc 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -58,18 +58,10 @@ jobs: run: | brew install open-mpi hdf5-mpi libomp - - name: Check Fortran compiler version + - name: Set default gfortran run: | - $FC --version - - - name: Setup upterm session - if: startsWith(matrix.os, 'macos') - uses: owenthereal/action-upterm@v1 - with: - ## limits ssh access and adds the ssh public key for the user which triggered the workflow - limit-access-to-actor: true - ## limits ssh access and adds the ssh public keys of the listed GitHub users - limit-access-to-users: kvrigor + alias gfortran="$FC" + gfortran --version - name: Install Jupyter Book and Psydac run: | From b909589b337c7aec59e7e418ae3e703a452d4d21 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 12:23:31 +0100 Subject: [PATCH 21/40] CI: aliasing gfortran not working in macOS. Increased pip verbosity to dig into the macOS pip issue. --- .github/workflows/deploy-book.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 2dfa1fc..4498659 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -10,7 +10,7 @@ jobs: deploy-book: runs-on: ${{ matrix.os }} strategy: - fail-fast: false + fail-fast: true matrix: include: - os: ubuntu-24.04 @@ -58,15 +58,14 @@ jobs: run: | brew install open-mpi hdf5-mpi libomp - - name: Set default gfortran + - name: Check Fortran version run: | - alias gfortran="$FC" - gfortran --version + $FC --version - name: Install Jupyter Book and Psydac run: | pip install --upgrade pip - pip install -r requirements.txt + pip install -vvv -r requirements.txt - name: Build Jupyter Book run: jupyter-book build . From 708440c6e7f3c5810034fa8875c523259e4851c5 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 12:34:58 +0100 Subject: [PATCH 22/40] CI: Test pyccel on macOS --- .github/workflows/deploy-book.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 4498659..467a6d0 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -62,10 +62,18 @@ jobs: run: | $FC --version + - name: Test pyccel on macOS + if: startsWith(matrix.os, 'macos') + run: | + pip install pyccel + wget https://raw.githubusercontent.com/pyccel/psydac/refs/heads/devel/psydac/core/bsplines_kernels.py + pyccel --verbose bsplines_kernels.py --language fortran --openmp + - name: Install Jupyter Book and Psydac + if: startsWith(matrix.os, 'ubuntu') run: | pip install --upgrade pip - pip install -vvv -r requirements.txt + pip install -r requirements.txt - name: Build Jupyter Book run: jupyter-book build . From fb472a84cc84da80807d5f82d053a2b287ea49bd Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 12:39:07 +0100 Subject: [PATCH 23/40] CI: Try aliasing gfortran in macOS --- .github/workflows/deploy-book.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 467a6d0..98fd0de 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -67,6 +67,7 @@ jobs: run: | pip install pyccel wget https://raw.githubusercontent.com/pyccel/psydac/refs/heads/devel/psydac/core/bsplines_kernels.py + alias gfortran=$FC pyccel --verbose bsplines_kernels.py --language fortran --openmp - name: Install Jupyter Book and Psydac From e03b098577300bb4253dc4c9dad56a8ce06540d4 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 13:01:59 +0100 Subject: [PATCH 24/40] CI: Create gfortran symlink in macos --- .github/workflows/deploy-book.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 98fd0de..c7be50e 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -58,20 +58,26 @@ jobs: run: | brew install open-mpi hdf5-mpi libomp - - name: Check Fortran version + - name: Check gfortran version run: | - $FC --version + if [[ "${{ matrix.include.os }}" == *"macos"* ]]; then + # pyccel searches for a Fortran compiler exactly named 'gfortran' + # which the macos runner doesn't have. A simple workaround is to + # create a symlink named 'gfortran'. + FC_path=$(which $FC) + FC_dir=$(dirname ${FC_path}) + ln -sv ${FC_path} ${FC_dir}/gfortran + fi + gfortran --version - name: Test pyccel on macOS if: startsWith(matrix.os, 'macos') run: | pip install pyccel wget https://raw.githubusercontent.com/pyccel/psydac/refs/heads/devel/psydac/core/bsplines_kernels.py - alias gfortran=$FC pyccel --verbose bsplines_kernels.py --language fortran --openmp - name: Install Jupyter Book and Psydac - if: startsWith(matrix.os, 'ubuntu') run: | pip install --upgrade pip pip install -r requirements.txt From 9aef593d0b1dda95ab4297090fa448daed7fff69 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 13:03:58 +0100 Subject: [PATCH 25/40] CI: Fixed typo in 'Check gfortran version' step --- .github/workflows/deploy-book.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index c7be50e..99c70ee 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -60,7 +60,7 @@ jobs: - name: Check gfortran version run: | - if [[ "${{ matrix.include.os }}" == *"macos"* ]]; then + if [[ "${{ matrix.os }}" == *"macos"* ]]; then # pyccel searches for a Fortran compiler exactly named 'gfortran' # which the macos runner doesn't have. A simple workaround is to # create a symlink named 'gfortran'. From cd16f57d943e275d5e1d152fe604670570f9eff7 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 13:16:58 +0100 Subject: [PATCH 26/40] CI: Removed ineffective MAKEFLAGS and test pyccel step. Also only allow the Ubuntu runner to publish to GitHub pages. --- .github/workflows/deploy-book.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 99c70ee..0ba2e1c 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -21,7 +21,6 @@ jobs: env: FC: gfortran-14 - MAKEFLAGS: -j4 name: ${{ matrix.os }} / Python ${{ matrix.python-version }} @@ -70,13 +69,6 @@ jobs: fi gfortran --version - - name: Test pyccel on macOS - if: startsWith(matrix.os, 'macos') - run: | - pip install pyccel - wget https://raw.githubusercontent.com/pyccel/psydac/refs/heads/devel/psydac/core/bsplines_kernels.py - pyccel --verbose bsplines_kernels.py --language fortran --openmp - - name: Install Jupyter Book and Psydac run: | pip install --upgrade pip @@ -86,7 +78,7 @@ jobs: run: jupyter-book build . - name: Deploy to GitHub Pages - if: github.ref == 'refs/heads/master' + if: ${{ (github.ref == 'refs/heads/master') && startsWith(matrix.os, 'ubuntu') }} run: ghp-import -n -p -f _build/html env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From ac30ed990d016073bfd04ed10901d5a5e5e87f55 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 15:42:54 +0100 Subject: [PATCH 27/40] Removed hardcoded author info --- chapter0/bezier-curves.md | 2 +- chapter0/bezier.md | 2 +- chapter0/bsplines-curves.md | 2 +- chapter0/bsplines-operations.md | 2 +- chapter0/bsplines-surfaces.md | 2 +- chapter0/bsplines.md | 2 +- chapter0/cad.md | 2 +- chapter0/data-structure.md | 2 +- chapter0/fem.md | 2 +- chapter0/howto.md | 2 +- chapter0/iga.md | 2 +- chapter0/performance-acceleration.md | 2 +- chapter0/poisson-1d.md | 2 +- chapter0/poisson-2d.md | 2 +- chapter1/analytical-mapping.md | 2 +- chapter1/boundary-conditions.md | 2 +- chapter1/discrete-mapping.md | 2 +- chapter1/geometry.md | 2 +- chapter1/rules.md | 2 +- chapter1/space.md | 2 +- chapter1/sympde.md | 2 +- chapter1/topology.md | 2 +- chapter2/advection-diffusion-stabilized.ipynb | 2 +- chapter2/advection-diffusion.ipynb | 2 +- chapter2/biharmonic.ipynb | 2 +- chapter2/elliptic-curl.ipynb | 2 +- chapter2/elliptic-div.ipynb | 2 +- chapter2/elliptic-general-form.ipynb | 2 +- chapter2/linear-elasticity.ipynb | 2 +- chapter2/poisson-mixed-v1.ipynb | 2 +- chapter2/poisson-mixed-v2.ipynb | 2 +- chapter2/poisson-mixed.ipynb | 2 +- chapter2/poisson-nitsche.ipynb | 2 +- chapter2/poisson.ipynb | 2 +- chapter2/stokes-v1.ipynb | 2 +- chapter2/stokes-v2.ipynb | 2 +- chapter2/stokes.ipynb | 2 +- chapter2/vector-poisson.ipynb | 2 +- chapter3/burgers.md | 2 +- chapter3/navier-stokes-steady-streamfunction-velocity.md | 2 +- chapter3/navier-stokes-steady.md | 2 +- chapter3/poisson.md | 2 +- chapter4/poisson-multi-subdomains-nitsche.ipynb | 2 +- chapter4/poisson-two-subdomains-nitsche.ipynb | 2 +- chapter4/subdomains.md | 2 +- chapter5/cfd.md | 1 - chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb | 2 +- chapter5/cfd/buoyancy-driven_natural_convection.ipynb | 2 +- chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb | 2 +- chapter5/cfd/compressible_flow_in_a_nozzle.ipynb | 2 +- chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb | 2 +- chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb | 2 +- chapter5/cfd/free_surface_flow.ipynb | 2 +- chapter5/cfd/heat_conduction_in_a_solid.ipynb | 2 +- chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb | 2 +- chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb | 2 +- chapter5/cfd/magnetohydrodynamics_flow.ipynb | 2 +- chapter5/cfd/non-newtonian-fluids.md | 1 - chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb | 2 +- chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb | 2 +- chapter5/cfd/particle-laden_flow.ipynb | 2 +- chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb | 2 +- chapter5/cfd/two-phase_flow.ipynb | 2 +- chapter5/electromagnetics.md | 2 +- chapter5/fsi.md | 2 +- chapter5/material-science.md | 2 +- chapter5/material-science/additive-manifacturing.md | 2 +- chapter5/material-science/composite-materials-analysis.md | 2 +- chapter5/material-science/composite-materials.md | 2 +- chapter5/material-science/composite_beam_analysis.ipynb | 2 +- .../composite_materials_with_piezoelectric_fibers.ipynb | 2 +- .../composite_materials_with_thermal_expansion.ipynb | 2 +- .../material-science/composite_pressure_vessel_analysis.ipynb | 2 +- chapter5/material-science/composite_shaft_analysis.ipynb | 2 +- chapter5/material-science/composite_shell_structures.ipynb | 2 +- chapter5/material-science/creep_in_viscoelastic_materials.ipynb | 2 +- .../diffusion_and_reaction_in_porous_media.ipynb | 2 +- .../material-science/elasticity_with_thermal_expansion.ipynb | 2 +- .../material-science/fiber-reinforced_composite_materials.ipynb | 2 +- .../fluid_flow_simulation_in_directed_energy_deposition.ipynb | 2 +- .../material-science/heat_conduction_with_phase_change.ipynb | 2 +- .../homogenization_of_composite_structures.ipynb | 2 +- chapter5/material-science/laminate_plate_bending.ipynb | 2 +- .../multi-material_simulation_in_material_jetting.ipynb | 2 +- chapter5/material-science/piezoelectric_material.ipynb | 2 +- .../residual_stress_simulation_in_selective_laser_melting.ipynb | 2 +- .../structural_simulation_in_fused_filament_fabrication.ipynb | 2 +- .../thermal_conductivity_of_composite_materials.ipynb | 2 +- .../thermal_simulation_in_powder_bed_fusion.ipynb | 2 +- chapter5/mhd.md | 2 +- chapter5/multiphysics.md | 1 - intro.md | 2 +- 92 files changed, 89 insertions(+), 92 deletions(-) diff --git a/chapter0/bezier-curves.md b/chapter0/bezier-curves.md index f56d077..2b82015 100644 --- a/chapter0/bezier-curves.md +++ b/chapter0/bezier-curves.md @@ -1,5 +1,5 @@ # Bézier curves -*Author: Ahmed Ratnani* + We recall the definition of a Bézier curve: diff --git a/chapter0/bezier.md b/chapter0/bezier.md index 0e549bf..03257ce 100644 --- a/chapter0/bezier.md +++ b/chapter0/bezier.md @@ -1,5 +1,5 @@ # Bernstein polynomials -*Author: Ahmed Ratnani* + Without loss of generality, we restrict to the case of the unit interval, namely $a=0$ and $b=1$. In figure (Fig. \ref{fig:bernstein-polynomials}), we plot the first sixth Bernstein polynomials. diff --git a/chapter0/bsplines-curves.md b/chapter0/bsplines-curves.md index 44ee3e8..fea8a3a 100644 --- a/chapter0/bsplines-curves.md +++ b/chapter0/bsplines-curves.md @@ -1,5 +1,5 @@ # B-Splines curves -*Author: Ahmed Ratnani* + Let $(\mathbf{P}_i)_{ 0 \leqslant i \leqslant n}\in \mathbb{R}^d$ be a sequence of control points. Following the same approach as for Bézier curves, we define B-Splines curves as diff --git a/chapter0/bsplines-operations.md b/chapter0/bsplines-operations.md index 3a3e5e8..73751af 100644 --- a/chapter0/bsplines-operations.md +++ b/chapter0/bsplines-operations.md @@ -1,5 +1,5 @@ # Fundamental geometric operations for B-Splines -*Author: Ahmed Ratnani* + Having more control on a curve, adding new control points, can be done in two different ways: diff --git a/chapter0/bsplines-surfaces.md b/chapter0/bsplines-surfaces.md index aba230c..0bc9b52 100644 --- a/chapter0/bsplines-surfaces.md +++ b/chapter0/bsplines-surfaces.md @@ -1,5 +1,5 @@ # B-Splines surfaces -*Author: Ahmed Ratnani* + The B-spline surface in $\mathbb{R}^d$ associated to knots $(T_u, T_v)$ where $T_u=(u_i)_{0\leqslant i \leqslant n_u + p_u + 1}$ and $T_v=(v_i)_{0\leqslant i \leqslant n_v + p_v + 1}$, and control points $(\mathbf{P}_{ij})_{ 0 \leqslant i \leqslant n_u, 0 \leqslant j \leqslant n_v}$ is defined by : diff --git a/chapter0/bsplines.md b/chapter0/bsplines.md index ef47ad6..67cd145 100644 --- a/chapter0/bsplines.md +++ b/chapter0/bsplines.md @@ -1,5 +1,5 @@ # B-Splines -*Author: Ahmed Ratnani* + Given a subdivision $\{x_0 < x_1 < \cdots < x_r\}$ of the interval $I = [x_0, x_r]$, the \textbf{Schoenberg space} is the space of piecewise polynomials of degree $p$, on the interval $I$ and given regularities $\{k_1, k_2, \cdots, k_{r-1}\}$ at the internal points $\{x_1, x_2, \cdots, x_{r-1}\}$. diff --git a/chapter0/cad.md b/chapter0/cad.md index 8481761..791d769 100644 --- a/chapter0/cad.md +++ b/chapter0/cad.md @@ -1,4 +1,4 @@ # Computer Aided Design -*Author: Ahmed Ratnani* + TODO diff --git a/chapter0/data-structure.md b/chapter0/data-structure.md index b8287b5..ec4f02b 100644 --- a/chapter0/data-structure.md +++ b/chapter0/data-structure.md @@ -1,5 +1,5 @@ # Data Structure -*Author: Ahmed Ratnani* + In the sequel, we shall use **StencilMatrix** and **StencilVector** from the **psydac** library. diff --git a/chapter0/fem.md b/chapter0/fem.md index a15fbe5..47942f9 100644 --- a/chapter0/fem.md +++ b/chapter0/fem.md @@ -1,5 +1,5 @@ # Introduction to B-Splines FEM -*Author: Ahmed Ratnani* + Let $\Omega \subset \mathbb{R}^d$ be a computational domain that is the image of a logical domain $\mathcal{P}$, *i.e.* a unit line (in *1d*), square (in *2d*) or a cube (in *3d*) with a **mapping** function diff --git a/chapter0/howto.md b/chapter0/howto.md index d2a42e0..62df7f4 100644 --- a/chapter0/howto.md +++ b/chapter0/howto.md @@ -1,2 +1,2 @@ # What to expect from IGA-Python -*Author: Ahmed Ratnani* + diff --git a/chapter0/iga.md b/chapter0/iga.md index 47c0247..3f84aa3 100644 --- a/chapter0/iga.md +++ b/chapter0/iga.md @@ -1,4 +1,4 @@ # Isogeometric Analysis -*Author: Ahmed Ratnani* + TODO diff --git a/chapter0/performance-acceleration.md b/chapter0/performance-acceleration.md index 2f28d62..4ad3654 100644 --- a/chapter0/performance-acceleration.md +++ b/chapter0/performance-acceleration.md @@ -1,5 +1,5 @@ # Performance and Acceleration -*Author: Ahmed Ratnani* + In this section, we shall see how to accelerate our Python code assembly and get native speed. We will be using [Numba](https://numba.pydata.org/) and [Pyccel](https://github.com/pyccel/pyccel). diff --git a/chapter0/poisson-1d.md b/chapter0/poisson-1d.md index 4383597..09ba9b6 100644 --- a/chapter0/poisson-1d.md +++ b/chapter0/poisson-1d.md @@ -1,5 +1,5 @@ # B-splines FEM solver for Poisson equation (1D) -*Author: Ahmed Ratnani* + Following the previous [section](http://nbviewer.jupyter.org/github/ratnania/IGA-Python/blob/main/lessons/Chapter1/01_introduction_fem.ipynb), we implement here a B-Splines FEM for the Poisson problem in 1D, with homogeneous boundary conditions. diff --git a/chapter0/poisson-2d.md b/chapter0/poisson-2d.md index b3f34be..5282f12 100644 --- a/chapter0/poisson-2d.md +++ b/chapter0/poisson-2d.md @@ -1,5 +1,5 @@ # B-splines FEM solver for Poisson equation (2D) -*Author: Ahmed Ratnani* + In this section, we show hoa to use **simplines** to solve a 2D Poisson problem with homogeneous boundary conditions $$ diff --git a/chapter1/analytical-mapping.md b/chapter1/analytical-mapping.md index 8edc9ec..5a987c1 100644 --- a/chapter1/analytical-mapping.md +++ b/chapter1/analytical-mapping.md @@ -1,5 +1,5 @@ # Analytical Mapping -*Author: Ahmed Ratnani* + Analytical Mappings are provided as symbolic expressions, which allow us to compute automatically their jacobian matrices and all related geometrical information. diff --git a/chapter1/boundary-conditions.md b/chapter1/boundary-conditions.md index 6764b3d..45d7a36 100644 --- a/chapter1/boundary-conditions.md +++ b/chapter1/boundary-conditions.md @@ -1,5 +1,5 @@ # Boundary Conditions -*Author: Ahmed Ratnani* + SymPDE & Psydac allows you to use both strong and weak boundary conditions. We start first by explaining how to identify a boundary in **NCube** domains, such as **Line**, **Square** and a **Cube**. diff --git a/chapter1/discrete-mapping.md b/chapter1/discrete-mapping.md index 824fb1a..59ed3be 100644 --- a/chapter1/discrete-mapping.md +++ b/chapter1/discrete-mapping.md @@ -1,4 +1,4 @@ # Discrete Mapping -*Author: Ahmed Ratnani* + diff --git a/chapter1/geometry.md b/chapter1/geometry.md index a0dc6e0..6dc194b 100644 --- a/chapter1/geometry.md +++ b/chapter1/geometry.md @@ -1,5 +1,5 @@ # Geometry -*Author: Ahmed Ratnani* + The IGA concept relies on the fact that the geometry (domain) is divided into subdomains, and each of these subdomains is the image of a **Line**, **Square** or a **Cube** by a geometric transformation (also called a **mapping**), that we shall call a **patch** or **logical domain**. diff --git a/chapter1/rules.md b/chapter1/rules.md index 6e6e88a..e66604d 100644 --- a/chapter1/rules.md +++ b/chapter1/rules.md @@ -1,5 +1,5 @@ # Algebraic and differential operators evalution rules -*Author: Ahmed Ratnani* + ## Evaluation of the $\mathrm{grad}$ operator diff --git a/chapter1/space.md b/chapter1/space.md index 0f381e4..dd9a205 100644 --- a/chapter1/space.md +++ b/chapter1/space.md @@ -1,5 +1,5 @@ # Function Space concepts -*Author: Ahmed Ratnani* + SymPDE provides two Python classes to describe scalar and vector function spaces, respectively. There is no notion of a discrete representation; for example, we do not need to mention that a space is a Brezzi-Douglas-Marini (BDM) space. In fact, these kind of function spaces can be seen as parametric types having as a basic type **ScalarFunctionSpace** or **VectorFunctionSpace**. SymPDE only needs to know if an element of the space can be indexed or not. A BDM space would then be identified by an annotation added by a third party library to uniquely define a function space at the discrete level. diff --git a/chapter1/sympde.md b/chapter1/sympde.md index ceefaa3..1a63ad7 100644 --- a/chapter1/sympde.md +++ b/chapter1/sympde.md @@ -1,5 +1,5 @@ # SymPDE concepts and their mathematical meaning -*Author: Ahmed Ratnani* + ## Domain diff --git a/chapter1/topology.md b/chapter1/topology.md index a1f8fcf..3352bb0 100644 --- a/chapter1/topology.md +++ b/chapter1/topology.md @@ -1,5 +1,5 @@ # Topology concepts -*Author: Ahmed Ratnani* + ## Domain diff --git a/chapter2/advection-diffusion-stabilized.ipynb b/chapter2/advection-diffusion-stabilized.ipynb index 7ca9d8f..099df1b 100644 --- a/chapter2/advection-diffusion-stabilized.ipynb +++ b/chapter2/advection-diffusion-stabilized.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Stabilized advection-diffusion equation\n", - "*Author: Ahmed Ratnani*\n", + "\n", "In the sequel we consider two different stabilization methods, leading to formulations of the form\n", "\n", diff --git a/chapter2/advection-diffusion.ipynb b/chapter2/advection-diffusion.ipynb index 1e29a6a..9785636 100644 --- a/chapter2/advection-diffusion.ipynb +++ b/chapter2/advection-diffusion.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Advection-diffusion equation\n", - "*Author: Ahmed Ratnani*\n", + "\n", "We consider the advection-diffusion problem consisting of finding a scalar-valued function $u$ such that\n", "\n", diff --git a/chapter2/biharmonic.ipynb b/chapter2/biharmonic.ipynb index 19cf321..e484aa7 100644 --- a/chapter2/biharmonic.ipynb +++ b/chapter2/biharmonic.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# The Biharmonic problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "We consider the (inhomogeneous) biharmonic equation with homogeneous essential boundary conditions,\n", "\n", diff --git a/chapter2/elliptic-curl.ipynb b/chapter2/elliptic-curl.ipynb index f517cfd..5f1c3ca 100644 --- a/chapter2/elliptic-curl.ipynb +++ b/chapter2/elliptic-curl.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Elliptic-curl Problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Let $\\Omega \\subset \\mathbb{R}^d$ be an open Liptschitz bounded set, and we look for the solution of the following problem\n", "\n", diff --git a/chapter2/elliptic-div.ipynb b/chapter2/elliptic-div.ipynb index f0f8679..dac190b 100644 --- a/chapter2/elliptic-div.ipynb +++ b/chapter2/elliptic-div.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Elliptic-div Problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Let $\\Omega \\subset \\mathbb{R}^d$ be an open Liptschitz bounded set, and we look for the solution of the following problem\n", "\n", diff --git a/chapter2/elliptic-general-form.ipynb b/chapter2/elliptic-general-form.ipynb index 12ff900..849dc22 100644 --- a/chapter2/elliptic-general-form.ipynb +++ b/chapter2/elliptic-general-form.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Elliptic equation in the general form\n", - "*Author: Ahmed Ratnani*\n", + "\n", "We consider here, the following general form of an elliptic partial differential equation,\n", "\n", diff --git a/chapter2/linear-elasticity.ipynb b/chapter2/linear-elasticity.ipynb index 8f42c49..793d555 100644 --- a/chapter2/linear-elasticity.ipynb +++ b/chapter2/linear-elasticity.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Linear Elasticity Problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Analysis of deformable structures is essential in engineering, with the equations of linear elasticity being fundamental in this field. In this section, we present the variational formulation of linear elasticity equations using the principle of virtual work.\n", "\n", diff --git a/chapter2/poisson-mixed-v1.ipynb b/chapter2/poisson-mixed-v1.ipynb index e5f1ac2..134d976 100644 --- a/chapter2/poisson-mixed-v1.ipynb +++ b/chapter2/poisson-mixed-v1.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# First mixed formulation of the Poisson problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Instead of having one unknown, we now have two, along with the above two equations.\n", "In order to get a mixed variational formulation, we first take the dot product of the first one by $ \\mathbf{v}$ and integrate by parts\n", diff --git a/chapter2/poisson-mixed-v2.ipynb b/chapter2/poisson-mixed-v2.ipynb index 058bcc2..45cecd7 100644 --- a/chapter2/poisson-mixed-v2.ipynb +++ b/chapter2/poisson-mixed-v2.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Second mixed formulation of the Poisson problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Here, we get an alternative formulation by not integrating by parts, the mixed term in the first formulation but in the second. The first formulation simply becomes\n", "\n", diff --git a/chapter2/poisson-mixed.ipynb b/chapter2/poisson-mixed.ipynb index 686d6db..3fb861a 100644 --- a/chapter2/poisson-mixed.ipynb +++ b/chapter2/poisson-mixed.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Mixed FEM for the Poisson problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Let $\\Omega \\subset \\mathbb{R}^3$ and consider the Poisson problem\n", "\n", diff --git a/chapter2/poisson-nitsche.ipynb b/chapter2/poisson-nitsche.ipynb index c475e64..d936f7c 100644 --- a/chapter2/poisson-nitsche.ipynb +++ b/chapter2/poisson-nitsche.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# The Poisson equation with weak imposition of Dirichlet conditions\n", - "*Author: Ahmed Ratnani*" + ] }, { diff --git a/chapter2/poisson.ipynb b/chapter2/poisson.ipynb index 5ea4f82..0387da8 100644 --- a/chapter2/poisson.ipynb +++ b/chapter2/poisson.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# The Poisson equation\n", - "*Author: Ahmed Ratnani*\n", + "\n", "As a first example, we consider the Poisson equation\n", "\n", diff --git a/chapter2/stokes-v1.ipynb b/chapter2/stokes-v1.ipynb index 372fa28..138ceab 100644 --- a/chapter2/stokes-v1.ipynb +++ b/chapter2/stokes-v1.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# First mixed formulation of the Stokes problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "For the variational formulation, we take the dot product of the first equation with $v$ and integrate over the whole domain\n", "\n", diff --git a/chapter2/stokes-v2.ipynb b/chapter2/stokes-v2.ipynb index 832186b..03e75b9 100644 --- a/chapter2/stokes-v2.ipynb +++ b/chapter2/stokes-v2.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Second mixed formulation of the Stokes problem\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Another possibility to obtained a well posed variational formulation, is to integrate by parts the\n", "$\\int_{\\Omega} \\nabla p \\cdot \\mathbf{v} ~\\mathrm{d} \\mathbf{x}$ term in the first formulation:\n", diff --git a/chapter2/stokes.ipynb b/chapter2/stokes.ipynb index f34b683..49b9f05 100644 --- a/chapter2/stokes.ipynb +++ b/chapter2/stokes.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Mixed FEM for the Stokes problem \n", - "*Author: Ahmed Ratnani*\n", + "\n", "We consider now the Stokes problem for the steady-state modelling of an incompressible fluid\n", "\n", diff --git a/chapter2/vector-poisson.ipynb b/chapter2/vector-poisson.ipynb index 328f079..b077874 100644 --- a/chapter2/vector-poisson.ipynb +++ b/chapter2/vector-poisson.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Vector Poisson equation \n", - "*Author: Ahmed Ratnani*\n", + "\n", "In this example we consider the vector Poisson equation with homogeneous Dirichlet boundary conditions:\n", "\n", diff --git a/chapter3/burgers.md b/chapter3/burgers.md index 02ccde0..02b270d 100644 --- a/chapter3/burgers.md +++ b/chapter3/burgers.md @@ -1,5 +1,5 @@ # 1D Burgers equation -*Author: Ahmed Ratnani* + We consider the 1d Burgers equation diff --git a/chapter3/navier-stokes-steady-streamfunction-velocity.md b/chapter3/navier-stokes-steady-streamfunction-velocity.md index 366e26a..27cb688 100644 --- a/chapter3/navier-stokes-steady-streamfunction-velocity.md +++ b/chapter3/navier-stokes-steady-streamfunction-velocity.md @@ -1,5 +1,5 @@ # The streamfunction-velocity formulation of the steady-state Navier-Stokes equations for incompressible fluids -*Author: Ahmed Ratnani* + When $\Omega$ is a simply connected 2D domain, there exists a unique function $\psi$ such that $\mathbf{u} = \boldsymbol{\nabla} \times \psi:= \left( \partial_y \psi, - \partial_x \psi \right)$; substituting this expression for $\mathbf{u}$ into \eqref{eq:steady-navier-stokes} leads to the so-called ``streamfunction-velocity formulation'' of the steady-state Navier-Stokes equations for an incompressible fluid. diff --git a/chapter3/navier-stokes-steady.md b/chapter3/navier-stokes-steady.md index ac748ce..7e66792 100644 --- a/chapter3/navier-stokes-steady.md +++ b/chapter3/navier-stokes-steady.md @@ -1,5 +1,5 @@ # the steady-state Navier-Stokes equations for incompressible fluids -*Author: Ahmed Ratnani* + The steady-state Navier Stokes problem for an incompressible fluid, with homogeneous Dirichlet boundary conditions (``no slip'' condition), is defined as diff --git a/chapter3/poisson.md b/chapter3/poisson.md index bbd57b9..b64450b 100644 --- a/chapter3/poisson.md +++ b/chapter3/poisson.md @@ -1,5 +1,5 @@ # Nonlinear Poisson in 2D -*Author: Ahmed Ratnani* + In this section, we consider the non-linear Poisson problem: diff --git a/chapter4/poisson-multi-subdomains-nitsche.ipynb b/chapter4/poisson-multi-subdomains-nitsche.ipynb index eb2b570..4b75497 100644 --- a/chapter4/poisson-multi-subdomains-nitsche.ipynb +++ b/chapter4/poisson-multi-subdomains-nitsche.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# The Poisson problem using Nitsche method on multiple subdomains\n", - "*Author: Ahmed Ratnani*\n", + "\n", "We consider a 2D domain $\\Omega$, that is subdivided into a grid of small squares, using the **meshgrid** function.\n", "Each subdomain has the form $(x_{i}, x_{i+1}) \\times (y_{j}, y_{j+1})$, where $x_1, ..., x_{n_x}$ and $y_1, ..., y_{n_y}$ are subdivisions in each axis.\n" diff --git a/chapter4/poisson-two-subdomains-nitsche.ipynb b/chapter4/poisson-two-subdomains-nitsche.ipynb index eddf4c4..71dd32f 100644 --- a/chapter4/poisson-two-subdomains-nitsche.ipynb +++ b/chapter4/poisson-two-subdomains-nitsche.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# The Poisson problem using Nitsche method on two subdomains\n", - "*Author: Ahmed Ratnani*\n", + "\n", "We consider a domain $\\Omega = \\Omega_1 \\bigcup \\Omega_2 = (0,1)^2$, where $\\Omega_1 = (0,\\frac{1}{2}) \\times (0,1)$ and $\\Omega_2 = (\\frac{1}{2}, 1) \\times (0,1)$\n", "\n", diff --git a/chapter4/subdomains.md b/chapter4/subdomains.md index 51cb34d..61035c3 100644 --- a/chapter4/subdomains.md +++ b/chapter4/subdomains.md @@ -1,5 +1,5 @@ # Subdomains -*Author: Ahmed Ratnani* + In this section, we consider a domain $\Omega$ which a union of multiple subdomain, *i.e.* diff --git a/chapter5/cfd.md b/chapter5/cfd.md index 5723ad8..c156b86 100644 --- a/chapter5/cfd.md +++ b/chapter5/cfd.md @@ -1,2 +1 @@ # Computational Fluid Dynamics -*Author: Ahmed Ratnani* \ No newline at end of file diff --git a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb index 9f1c3f7..7857bb6 100644 --- a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Bingham Plastic Flow in a Pipe\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb index 15cefef..3bb591f 100644 --- a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb +++ b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Buoyancy-Driven Natural Convection\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb index 6a84d7c..afd70ae 100644 --- a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Casson Fluid Flow in a Channel\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb index dcd2523..a06a3bc 100644 --- a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb +++ b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Compressible Flow in a Nozzle\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb index 7b4dd24..248a0ac 100644 --- a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb +++ b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Convection-Diffusion Equation in a Channel\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb index 42636e7..3c83e0d 100644 --- a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Cross Power Law Fluid Flow in a Channel\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/free_surface_flow.ipynb b/chapter5/cfd/free_surface_flow.ipynb index 16617a3..7cfd257 100644 --- a/chapter5/cfd/free_surface_flow.ipynb +++ b/chapter5/cfd/free_surface_flow.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Free Surface Flow (Navier-Stokes with Free Surface)\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/heat_conduction_in_a_solid.ipynb b/chapter5/cfd/heat_conduction_in_a_solid.ipynb index ee0fd19..386ed5b 100644 --- a/chapter5/cfd/heat_conduction_in_a_solid.ipynb +++ b/chapter5/cfd/heat_conduction_in_a_solid.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Heat Conduction in a Solid\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb index 42ec152..0d711b1 100644 --- a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Herschel-Bulkley Fluid Flow in a Pipe\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb index 1d3f493..d3ccb0f 100644 --- a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb +++ b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Incompressible Flow Past a Cylinder\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model:\n", "\n", diff --git a/chapter5/cfd/magnetohydrodynamics_flow.ipynb b/chapter5/cfd/magnetohydrodynamics_flow.ipynb index 4e3709d..c75628b 100644 --- a/chapter5/cfd/magnetohydrodynamics_flow.ipynb +++ b/chapter5/cfd/magnetohydrodynamics_flow.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Magnetohydrodynamics (MHD) Flow\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/non-newtonian-fluids.md b/chapter5/cfd/non-newtonian-fluids.md index 9788318..9ae636c 100644 --- a/chapter5/cfd/non-newtonian-fluids.md +++ b/chapter5/cfd/non-newtonian-fluids.md @@ -1,2 +1 @@ # Non-Newtonian Fluids -*Author: Ahmed Ratnani* \ No newline at end of file diff --git a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb index 1c1fd21..c7e86c7 100644 --- a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Oldroyd-B Fluid Flow in a Channel\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb index 8ae68f5..48c5419 100644 --- a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Papanastasiou Fluid Flow in a Channel\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/particle-laden_flow.ipynb b/chapter5/cfd/particle-laden_flow.ipynb index d3c66d8..431d5b0 100644 --- a/chapter5/cfd/particle-laden_flow.ipynb +++ b/chapter5/cfd/particle-laden_flow.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Particle-Laden Flow (Lagrangian-Eulerian Approach)\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb index ec87e8e..02c6d82 100644 --- a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Power Law Fluid Flow in a Channel\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/two-phase_flow.ipynb b/chapter5/cfd/two-phase_flow.ipynb index 21ebe46..398e163 100644 --- a/chapter5/cfd/two-phase_flow.ipynb +++ b/chapter5/cfd/two-phase_flow.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Two-Phase Flow (Immersed Boundary Method)\n", - "*Author: Ahmed Ratnani*\n", + "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/electromagnetics.md b/chapter5/electromagnetics.md index 869d659..4a13efd 100644 --- a/chapter5/electromagnetics.md +++ b/chapter5/electromagnetics.md @@ -1,5 +1,5 @@ # Electromagnetics -*Author: Ahmed Ratnani* + Electromagnetic problems are commonly described by Maxwell's equations, which govern the behavior of electric and magnetic fields. The Finite Element Method (FEM) provides a powerful numerical approach for solving these equations in complex geometries. This section provides a concise overview of the mathematical formulation for electromagnetic problems using finite elements. diff --git a/chapter5/fsi.md b/chapter5/fsi.md index 74dff80..c888695 100644 --- a/chapter5/fsi.md +++ b/chapter5/fsi.md @@ -1,5 +1,5 @@ # Fluid-Structure Interaction -*Author: Ahmed Ratnani* + Fluid-Structure Interaction (FSI) involves the coupled interaction between a fluid and a structure, where the motion of one influences the behavior of the other. The Finite Element Method (FEM) is a powerful tool for simulating FSI problems. This section provides an overview of the mathematical formulation for fluid-structure interaction using finite elements. diff --git a/chapter5/material-science.md b/chapter5/material-science.md index 2e1f836..efc9c04 100644 --- a/chapter5/material-science.md +++ b/chapter5/material-science.md @@ -1,5 +1,5 @@ # Material Science -*Author: Ahmed Ratnani* + These examples cover a variety of materials science scenarios, including heat conduction with phase change, elasticity with thermal expansion, creep in viscoelastic materials, diffusion and reaction in porous media, and piezoelectric materials. The weak formulations are presented in a variational form suitable for finite element methods. Adjustments can be made based on specific material properties and numerical considerations. diff --git a/chapter5/material-science/additive-manifacturing.md b/chapter5/material-science/additive-manifacturing.md index e6cfd54..cf377c3 100644 --- a/chapter5/material-science/additive-manifacturing.md +++ b/chapter5/material-science/additive-manifacturing.md @@ -1,4 +1,4 @@ # Additive Manifacturing Process Simulations -*Author: Ahmed Ratnani* + These examples cover various scenarios in additive manufacturing process simulations, including thermal simulation in powder bed fusion (PBF), fluid flow simulation in directed energy deposition (DED), structural simulation in fused filament fabrication (FFF), multi-material simulation in material jetting, and residual stress simulation in selective laser melting (SLM). The weak formulations are presented in a variational form suitable for finite element methods. Adjustments can be made based on specific process parameters and numerical considerations. diff --git a/chapter5/material-science/composite-materials-analysis.md b/chapter5/material-science/composite-materials-analysis.md index 546c6da..8f3af1c 100644 --- a/chapter5/material-science/composite-materials-analysis.md +++ b/chapter5/material-science/composite-materials-analysis.md @@ -1,4 +1,4 @@ # Composite Materials Analysis -*Author: Ahmed Ratnani* + These examples cover various scenarios in composite materials analysis, including laminate plate bending, composite shell structures, composite beam analysis, composite shaft analysis, and composite pressure vessel analysis. The weak formulations are presented in a variational form suitable for finite element methods. Adjustments can be made based on specific composite properties and numerical considerations. diff --git a/chapter5/material-science/composite-materials.md b/chapter5/material-science/composite-materials.md index 3f8bb23..a1bedc3 100644 --- a/chapter5/material-science/composite-materials.md +++ b/chapter5/material-science/composite-materials.md @@ -1,4 +1,4 @@ # Composite Materials -*Author: Ahmed Ratnani* + These examples cover various scenarios in composite materials, including homogenization, thermal conductivity, fiber-reinforced composites, composite materials with piezoelectric fibers, and composite materials with thermal expansion. The weak formulations are presented in a variational form suitable for finite element methods. Adjustments can be made based on specific composite properties and numerical considerations. diff --git a/chapter5/material-science/composite_beam_analysis.ipynb b/chapter5/material-science/composite_beam_analysis.ipynb index 3456627..726ade1 100644 --- a/chapter5/material-science/composite_beam_analysis.ipynb +++ b/chapter5/material-science/composite_beam_analysis.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Composite Beam Analysis\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb index 3dbd903..0ed2b5c 100644 --- a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb +++ b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Composite Materials with Piezoelectric Fibers\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb index 7ffa33c..f5b6da3 100644 --- a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb +++ b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Composite Materials with Thermal Expansion\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb index 70b2a3e..237e64e 100644 --- a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb +++ b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Composite Pressure Vessel Analysis\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_shaft_analysis.ipynb b/chapter5/material-science/composite_shaft_analysis.ipynb index 8965691..11495ed 100644 --- a/chapter5/material-science/composite_shaft_analysis.ipynb +++ b/chapter5/material-science/composite_shaft_analysis.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Composite Shaft Analysis\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_shell_structures.ipynb b/chapter5/material-science/composite_shell_structures.ipynb index ec421cc..e47596c 100644 --- a/chapter5/material-science/composite_shell_structures.ipynb +++ b/chapter5/material-science/composite_shell_structures.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Composite Shell Structures\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb index 021820a..0f90689 100644 --- a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb +++ b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Creep in Viscoelastic Materials\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb index 642801b..89409a3 100644 --- a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb +++ b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Diffusion and Reaction in Porous Media\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb index fa739d1..f98a189 100644 --- a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb +++ b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Elasticity with Thermal Expansion\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb index 650cd37..74d699f 100644 --- a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb +++ b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Fiber-Reinforced Composite Materials\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb index 9c31bba..02be223 100644 --- a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb +++ b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Fluid Flow Simulation in Directed Energy Deposition (DED)\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/heat_conduction_with_phase_change.ipynb b/chapter5/material-science/heat_conduction_with_phase_change.ipynb index 1d2e6f2..cf8eba6 100644 --- a/chapter5/material-science/heat_conduction_with_phase_change.ipynb +++ b/chapter5/material-science/heat_conduction_with_phase_change.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Heat Conduction with Phase Change\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/homogenization_of_composite_structures.ipynb b/chapter5/material-science/homogenization_of_composite_structures.ipynb index 7cec21a..aab0aa2 100644 --- a/chapter5/material-science/homogenization_of_composite_structures.ipynb +++ b/chapter5/material-science/homogenization_of_composite_structures.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Homogenization of Composite Structures\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/laminate_plate_bending.ipynb b/chapter5/material-science/laminate_plate_bending.ipynb index 1430432..ac930ec 100644 --- a/chapter5/material-science/laminate_plate_bending.ipynb +++ b/chapter5/material-science/laminate_plate_bending.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Laminate Plate Bending\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb index 0268ed6..0121ae6 100644 --- a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb +++ b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Multi-Material Simulation in Material Jetting\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/piezoelectric_material.ipynb b/chapter5/material-science/piezoelectric_material.ipynb index cd2e14b..7723703 100644 --- a/chapter5/material-science/piezoelectric_material.ipynb +++ b/chapter5/material-science/piezoelectric_material.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Piezoelectric Material\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb index ed57066..464ea57 100644 --- a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb +++ b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Residual Stress Simulation in Selective Laser Melting (SLM)\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb index 7d0bf07..aa305cd 100644 --- a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb +++ b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Structural Simulation in Fused Filament Fabrication (FFF)\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb index 2a294ed..6046135 100644 --- a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb +++ b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Thermal Conductivity of Composite Materials\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb index 1fe0253..a10b683 100644 --- a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb +++ b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "source": [ "# Thermal Simulation in Powder Bed Fusion (PBF)\n", - "*Author: Ahmed Ratnani*\n", + "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/mhd.md b/chapter5/mhd.md index 3e40a9f..4e9447e 100644 --- a/chapter5/mhd.md +++ b/chapter5/mhd.md @@ -1,5 +1,5 @@ # MHD -*Author: Ahmed Ratnani* + In magnetohydrodynamics (MHD), finite element analysis can be applied to solve a variety of problems related to the behavior of electrically conducting fluids (plasmas or liquid metals) in the presence of magnetic fields. Here are some common problems in magnetohydrodynamics that can be addressed using finite element methods. diff --git a/chapter5/multiphysics.md b/chapter5/multiphysics.md index 9cb657a..3748ec9 100644 --- a/chapter5/multiphysics.md +++ b/chapter5/multiphysics.md @@ -1,2 +1 @@ # Multiphysics -*Author: Ahmed Ratnani* \ No newline at end of file diff --git a/intro.md b/intro.md index b625ab8..455294e 100644 --- a/intro.md +++ b/intro.md @@ -1,5 +1,5 @@ # Home -*Author: Ahmed Ratnani* + Welcome to IGA-Python, a tutorial for Isogeometric Analysis using Python. From 5633e42bedc0d6af43a9d3fb1a2f6dd916645595 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 19 Feb 2025 16:01:10 +0100 Subject: [PATCH 28/40] Removed newlines in .ipynb files which was introduced in the previous commit --- chapter2/advection-diffusion-stabilized.ipynb | 1 - chapter2/advection-diffusion.ipynb | 1 - chapter2/biharmonic.ipynb | 1 - chapter2/elliptic-curl.ipynb | 1 - chapter2/elliptic-div.ipynb | 1 - chapter2/elliptic-general-form.ipynb | 1 - chapter2/linear-elasticity.ipynb | 1 - chapter2/poisson-mixed-v1.ipynb | 1 - chapter2/poisson-mixed-v2.ipynb | 1 - chapter2/poisson-mixed.ipynb | 1 - chapter2/poisson-nitsche.ipynb | 3 +-- chapter2/poisson.ipynb | 1 - chapter2/stokes-v1.ipynb | 1 - chapter2/stokes-v2.ipynb | 1 - chapter2/stokes.ipynb | 1 - chapter2/vector-poisson.ipynb | 1 - chapter4/poisson-multi-subdomains-nitsche.ipynb | 1 - chapter4/poisson-two-subdomains-nitsche.ipynb | 1 - chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb | 1 - chapter5/cfd/buoyancy-driven_natural_convection.ipynb | 1 - chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb | 1 - chapter5/cfd/compressible_flow_in_a_nozzle.ipynb | 1 - chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb | 1 - chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb | 1 - chapter5/cfd/free_surface_flow.ipynb | 1 - chapter5/cfd/heat_conduction_in_a_solid.ipynb | 1 - chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb | 1 - chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb | 1 - chapter5/cfd/magnetohydrodynamics_flow.ipynb | 1 - chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb | 1 - chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb | 1 - chapter5/cfd/particle-laden_flow.ipynb | 1 - chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb | 1 - chapter5/cfd/two-phase_flow.ipynb | 1 - chapter5/material-science/composite_beam_analysis.ipynb | 1 - .../composite_materials_with_piezoelectric_fibers.ipynb | 1 - .../composite_materials_with_thermal_expansion.ipynb | 1 - .../material-science/composite_pressure_vessel_analysis.ipynb | 1 - chapter5/material-science/composite_shaft_analysis.ipynb | 1 - chapter5/material-science/composite_shell_structures.ipynb | 1 - .../material-science/creep_in_viscoelastic_materials.ipynb | 1 - .../diffusion_and_reaction_in_porous_media.ipynb | 1 - .../material-science/elasticity_with_thermal_expansion.ipynb | 1 - .../fiber-reinforced_composite_materials.ipynb | 1 - .../fluid_flow_simulation_in_directed_energy_deposition.ipynb | 1 - .../material-science/heat_conduction_with_phase_change.ipynb | 1 - .../homogenization_of_composite_structures.ipynb | 1 - chapter5/material-science/laminate_plate_bending.ipynb | 1 - .../multi-material_simulation_in_material_jetting.ipynb | 1 - chapter5/material-science/piezoelectric_material.ipynb | 1 - ...residual_stress_simulation_in_selective_laser_melting.ipynb | 1 - .../structural_simulation_in_fused_filament_fabrication.ipynb | 1 - .../thermal_conductivity_of_composite_materials.ipynb | 1 - .../thermal_simulation_in_powder_bed_fusion.ipynb | 1 - 54 files changed, 1 insertion(+), 55 deletions(-) diff --git a/chapter2/advection-diffusion-stabilized.ipynb b/chapter2/advection-diffusion-stabilized.ipynb index 099df1b..34ae9aa 100644 --- a/chapter2/advection-diffusion-stabilized.ipynb +++ b/chapter2/advection-diffusion-stabilized.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Stabilized advection-diffusion equation\n", - "\n", "In the sequel we consider two different stabilization methods, leading to formulations of the form\n", "\n", diff --git a/chapter2/advection-diffusion.ipynb b/chapter2/advection-diffusion.ipynb index 9785636..a5a1615 100644 --- a/chapter2/advection-diffusion.ipynb +++ b/chapter2/advection-diffusion.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Advection-diffusion equation\n", - "\n", "We consider the advection-diffusion problem consisting of finding a scalar-valued function $u$ such that\n", "\n", diff --git a/chapter2/biharmonic.ipynb b/chapter2/biharmonic.ipynb index e484aa7..3552209 100644 --- a/chapter2/biharmonic.ipynb +++ b/chapter2/biharmonic.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# The Biharmonic problem\n", - "\n", "We consider the (inhomogeneous) biharmonic equation with homogeneous essential boundary conditions,\n", "\n", diff --git a/chapter2/elliptic-curl.ipynb b/chapter2/elliptic-curl.ipynb index 5f1c3ca..6182fc6 100644 --- a/chapter2/elliptic-curl.ipynb +++ b/chapter2/elliptic-curl.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Elliptic-curl Problem\n", - "\n", "Let $\\Omega \\subset \\mathbb{R}^d$ be an open Liptschitz bounded set, and we look for the solution of the following problem\n", "\n", diff --git a/chapter2/elliptic-div.ipynb b/chapter2/elliptic-div.ipynb index dac190b..70b6d21 100644 --- a/chapter2/elliptic-div.ipynb +++ b/chapter2/elliptic-div.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Elliptic-div Problem\n", - "\n", "Let $\\Omega \\subset \\mathbb{R}^d$ be an open Liptschitz bounded set, and we look for the solution of the following problem\n", "\n", diff --git a/chapter2/elliptic-general-form.ipynb b/chapter2/elliptic-general-form.ipynb index 849dc22..22ae67e 100644 --- a/chapter2/elliptic-general-form.ipynb +++ b/chapter2/elliptic-general-form.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Elliptic equation in the general form\n", - "\n", "We consider here, the following general form of an elliptic partial differential equation,\n", "\n", diff --git a/chapter2/linear-elasticity.ipynb b/chapter2/linear-elasticity.ipynb index 793d555..bfd6abc 100644 --- a/chapter2/linear-elasticity.ipynb +++ b/chapter2/linear-elasticity.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Linear Elasticity Problem\n", - "\n", "Analysis of deformable structures is essential in engineering, with the equations of linear elasticity being fundamental in this field. In this section, we present the variational formulation of linear elasticity equations using the principle of virtual work.\n", "\n", diff --git a/chapter2/poisson-mixed-v1.ipynb b/chapter2/poisson-mixed-v1.ipynb index 134d976..ae74717 100644 --- a/chapter2/poisson-mixed-v1.ipynb +++ b/chapter2/poisson-mixed-v1.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# First mixed formulation of the Poisson problem\n", - "\n", "Instead of having one unknown, we now have two, along with the above two equations.\n", "In order to get a mixed variational formulation, we first take the dot product of the first one by $ \\mathbf{v}$ and integrate by parts\n", diff --git a/chapter2/poisson-mixed-v2.ipynb b/chapter2/poisson-mixed-v2.ipynb index 45cecd7..12d48ea 100644 --- a/chapter2/poisson-mixed-v2.ipynb +++ b/chapter2/poisson-mixed-v2.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Second mixed formulation of the Poisson problem\n", - "\n", "Here, we get an alternative formulation by not integrating by parts, the mixed term in the first formulation but in the second. The first formulation simply becomes\n", "\n", diff --git a/chapter2/poisson-mixed.ipynb b/chapter2/poisson-mixed.ipynb index 3fb861a..2a3aa2f 100644 --- a/chapter2/poisson-mixed.ipynb +++ b/chapter2/poisson-mixed.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Mixed FEM for the Poisson problem\n", - "\n", "Let $\\Omega \\subset \\mathbb{R}^3$ and consider the Poisson problem\n", "\n", diff --git a/chapter2/poisson-nitsche.ipynb b/chapter2/poisson-nitsche.ipynb index d936f7c..ebdb1f9 100644 --- a/chapter2/poisson-nitsche.ipynb +++ b/chapter2/poisson-nitsche.ipynb @@ -5,8 +5,7 @@ "id": "119eb328", "metadata": {}, "source": [ - "# The Poisson equation with weak imposition of Dirichlet conditions\n", - + "# The Poisson equation with weak imposition of Dirichlet conditions\n" ] }, { diff --git a/chapter2/poisson.ipynb b/chapter2/poisson.ipynb index 0387da8..a2335c2 100644 --- a/chapter2/poisson.ipynb +++ b/chapter2/poisson.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# The Poisson equation\n", - "\n", "As a first example, we consider the Poisson equation\n", "\n", diff --git a/chapter2/stokes-v1.ipynb b/chapter2/stokes-v1.ipynb index 138ceab..c723310 100644 --- a/chapter2/stokes-v1.ipynb +++ b/chapter2/stokes-v1.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# First mixed formulation of the Stokes problem\n", - "\n", "For the variational formulation, we take the dot product of the first equation with $v$ and integrate over the whole domain\n", "\n", diff --git a/chapter2/stokes-v2.ipynb b/chapter2/stokes-v2.ipynb index 03e75b9..9ccc000 100644 --- a/chapter2/stokes-v2.ipynb +++ b/chapter2/stokes-v2.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Second mixed formulation of the Stokes problem\n", - "\n", "Another possibility to obtained a well posed variational formulation, is to integrate by parts the\n", "$\\int_{\\Omega} \\nabla p \\cdot \\mathbf{v} ~\\mathrm{d} \\mathbf{x}$ term in the first formulation:\n", diff --git a/chapter2/stokes.ipynb b/chapter2/stokes.ipynb index 49b9f05..eaafbc2 100644 --- a/chapter2/stokes.ipynb +++ b/chapter2/stokes.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Mixed FEM for the Stokes problem \n", - "\n", "We consider now the Stokes problem for the steady-state modelling of an incompressible fluid\n", "\n", diff --git a/chapter2/vector-poisson.ipynb b/chapter2/vector-poisson.ipynb index b077874..9aecdb0 100644 --- a/chapter2/vector-poisson.ipynb +++ b/chapter2/vector-poisson.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Vector Poisson equation \n", - "\n", "In this example we consider the vector Poisson equation with homogeneous Dirichlet boundary conditions:\n", "\n", diff --git a/chapter4/poisson-multi-subdomains-nitsche.ipynb b/chapter4/poisson-multi-subdomains-nitsche.ipynb index 4b75497..4a112ad 100644 --- a/chapter4/poisson-multi-subdomains-nitsche.ipynb +++ b/chapter4/poisson-multi-subdomains-nitsche.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# The Poisson problem using Nitsche method on multiple subdomains\n", - "\n", "We consider a 2D domain $\\Omega$, that is subdivided into a grid of small squares, using the **meshgrid** function.\n", "Each subdomain has the form $(x_{i}, x_{i+1}) \\times (y_{j}, y_{j+1})$, where $x_1, ..., x_{n_x}$ and $y_1, ..., y_{n_y}$ are subdivisions in each axis.\n" diff --git a/chapter4/poisson-two-subdomains-nitsche.ipynb b/chapter4/poisson-two-subdomains-nitsche.ipynb index 71dd32f..8f14c21 100644 --- a/chapter4/poisson-two-subdomains-nitsche.ipynb +++ b/chapter4/poisson-two-subdomains-nitsche.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# The Poisson problem using Nitsche method on two subdomains\n", - "\n", "We consider a domain $\\Omega = \\Omega_1 \\bigcup \\Omega_2 = (0,1)^2$, where $\\Omega_1 = (0,\\frac{1}{2}) \\times (0,1)$ and $\\Omega_2 = (\\frac{1}{2}, 1) \\times (0,1)$\n", "\n", diff --git a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb index 7857bb6..160f2fa 100644 --- a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Bingham Plastic Flow in a Pipe\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb index 3bb591f..8d65c53 100644 --- a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb +++ b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Buoyancy-Driven Natural Convection\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb index afd70ae..b61b982 100644 --- a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Casson Fluid Flow in a Channel\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb index a06a3bc..e7c7f91 100644 --- a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb +++ b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Compressible Flow in a Nozzle\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb index 248a0ac..0d477de 100644 --- a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb +++ b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Convection-Diffusion Equation in a Channel\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb index 3c83e0d..344cbc0 100644 --- a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Cross Power Law Fluid Flow in a Channel\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/free_surface_flow.ipynb b/chapter5/cfd/free_surface_flow.ipynb index 7cfd257..bfad672 100644 --- a/chapter5/cfd/free_surface_flow.ipynb +++ b/chapter5/cfd/free_surface_flow.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Free Surface Flow (Navier-Stokes with Free Surface)\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/heat_conduction_in_a_solid.ipynb b/chapter5/cfd/heat_conduction_in_a_solid.ipynb index 386ed5b..4e32a6b 100644 --- a/chapter5/cfd/heat_conduction_in_a_solid.ipynb +++ b/chapter5/cfd/heat_conduction_in_a_solid.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Heat Conduction in a Solid\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb index 0d711b1..12d687e 100644 --- a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Herschel-Bulkley Fluid Flow in a Pipe\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb index d3ccb0f..89f5e5f 100644 --- a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb +++ b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Incompressible Flow Past a Cylinder\n", - "\n", "## Mathematical Model:\n", "\n", diff --git a/chapter5/cfd/magnetohydrodynamics_flow.ipynb b/chapter5/cfd/magnetohydrodynamics_flow.ipynb index c75628b..469c691 100644 --- a/chapter5/cfd/magnetohydrodynamics_flow.ipynb +++ b/chapter5/cfd/magnetohydrodynamics_flow.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Magnetohydrodynamics (MHD) Flow\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb index c7e86c7..356e386 100644 --- a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Oldroyd-B Fluid Flow in a Channel\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb index 48c5419..f81b1e6 100644 --- a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Papanastasiou Fluid Flow in a Channel\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/particle-laden_flow.ipynb b/chapter5/cfd/particle-laden_flow.ipynb index 431d5b0..9f2cfe9 100644 --- a/chapter5/cfd/particle-laden_flow.ipynb +++ b/chapter5/cfd/particle-laden_flow.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Particle-Laden Flow (Lagrangian-Eulerian Approach)\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb index 02c6d82..9b7361c 100644 --- a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Power Law Fluid Flow in a Channel\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/cfd/two-phase_flow.ipynb b/chapter5/cfd/two-phase_flow.ipynb index 398e163..b6311e6 100644 --- a/chapter5/cfd/two-phase_flow.ipynb +++ b/chapter5/cfd/two-phase_flow.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Two-Phase Flow (Immersed Boundary Method)\n", - "\n", "## Mathematical Model\n", "\n", diff --git a/chapter5/material-science/composite_beam_analysis.ipynb b/chapter5/material-science/composite_beam_analysis.ipynb index 726ade1..803cdaa 100644 --- a/chapter5/material-science/composite_beam_analysis.ipynb +++ b/chapter5/material-science/composite_beam_analysis.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Composite Beam Analysis\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb index 0ed2b5c..3886a8e 100644 --- a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb +++ b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Composite Materials with Piezoelectric Fibers\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb index f5b6da3..1f0b2f6 100644 --- a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb +++ b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Composite Materials with Thermal Expansion\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb index 237e64e..a4bcf21 100644 --- a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb +++ b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Composite Pressure Vessel Analysis\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_shaft_analysis.ipynb b/chapter5/material-science/composite_shaft_analysis.ipynb index 11495ed..9e444ed 100644 --- a/chapter5/material-science/composite_shaft_analysis.ipynb +++ b/chapter5/material-science/composite_shaft_analysis.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Composite Shaft Analysis\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/composite_shell_structures.ipynb b/chapter5/material-science/composite_shell_structures.ipynb index e47596c..ba77d17 100644 --- a/chapter5/material-science/composite_shell_structures.ipynb +++ b/chapter5/material-science/composite_shell_structures.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Composite Shell Structures\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb index 0f90689..1e5e944 100644 --- a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb +++ b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Creep in Viscoelastic Materials\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb index 89409a3..fcdcc4c 100644 --- a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb +++ b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Diffusion and Reaction in Porous Media\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb index f98a189..b09b04f 100644 --- a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb +++ b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Elasticity with Thermal Expansion\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb index 74d699f..4709e2a 100644 --- a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb +++ b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Fiber-Reinforced Composite Materials\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb index 02be223..9dd84f3 100644 --- a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb +++ b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Fluid Flow Simulation in Directed Energy Deposition (DED)\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/heat_conduction_with_phase_change.ipynb b/chapter5/material-science/heat_conduction_with_phase_change.ipynb index cf8eba6..30f5efe 100644 --- a/chapter5/material-science/heat_conduction_with_phase_change.ipynb +++ b/chapter5/material-science/heat_conduction_with_phase_change.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Heat Conduction with Phase Change\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/homogenization_of_composite_structures.ipynb b/chapter5/material-science/homogenization_of_composite_structures.ipynb index aab0aa2..50d65ac 100644 --- a/chapter5/material-science/homogenization_of_composite_structures.ipynb +++ b/chapter5/material-science/homogenization_of_composite_structures.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Homogenization of Composite Structures\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/laminate_plate_bending.ipynb b/chapter5/material-science/laminate_plate_bending.ipynb index ac930ec..ad5d7f9 100644 --- a/chapter5/material-science/laminate_plate_bending.ipynb +++ b/chapter5/material-science/laminate_plate_bending.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Laminate Plate Bending\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb index 0121ae6..f43e714 100644 --- a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb +++ b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Multi-Material Simulation in Material Jetting\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/piezoelectric_material.ipynb b/chapter5/material-science/piezoelectric_material.ipynb index 7723703..f32f1cd 100644 --- a/chapter5/material-science/piezoelectric_material.ipynb +++ b/chapter5/material-science/piezoelectric_material.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Piezoelectric Material\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb index 464ea57..ebae4d5 100644 --- a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb +++ b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Residual Stress Simulation in Selective Laser Melting (SLM)\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb index aa305cd..3d177e2 100644 --- a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb +++ b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Structural Simulation in Fused Filament Fabrication (FFF)\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb index 6046135..5643e1c 100644 --- a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb +++ b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Thermal Conductivity of Composite Materials\n", - "\n", "Mathematical Model:\n", "\n", diff --git a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb index a10b683..0f9d83f 100644 --- a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb +++ b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb @@ -6,7 +6,6 @@ "metadata": {}, "source": [ "# Thermal Simulation in Powder Bed Fusion (PBF)\n", - "\n", "Mathematical Model:\n", "\n", From eedd7aee2b914fb4194dc2cda930605852a7e4ad Mon Sep 17 00:00:00 2001 From: kvrigor Date: Tue, 25 Feb 2025 15:29:02 +0100 Subject: [PATCH 29/40] Updated README and added AUTHORS file --- AUTHORS | 1 + README.md | 20 ++++++++++++++++++++ intro.md | 2 ++ 3 files changed, 23 insertions(+) create mode 100644 AUTHORS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..f49a2ae --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Ahmed Ratnani, Mohamed Jalal Maaouni \ No newline at end of file diff --git a/README.md b/README.md index a3a7fd2..13edb71 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ # Welcome to IGA-Python + +Contains the source code of the [IGA-Python](https://pyccel.github.io/IGA-Python/) site. + +## Editing and building IGA-Python locally + +1. Clone this repository and then install the required dependencies. + +```bash +git clone https://github.com/pyccel/IGA-Python.git +cd IGA-Python + +# Install dependencies on a virtual environment +python3 -m venv iga-python-env +source iga-python-env/bin/activate +pip3 install -r requirements.txt +``` + +2. Edit the desired Python notebooks (`*.ipynb`) and/or Markdown files (`*.md`). Check the [MyST syntax cheat sheet](https://jupyterbook.org/en/stable/reference/cheatsheet.html) for reference. +3. Build the docs by running `make`. +4. View your changes on the browser: `open _build/html/index.html` \ No newline at end of file diff --git a/intro.md b/intro.md index 455294e..be0cb04 100644 --- a/intro.md +++ b/intro.md @@ -1,5 +1,7 @@ # Home +```{include} AUTHORS +``` Welcome to IGA-Python, a tutorial for Isogeometric Analysis using Python. From bcca7e58e607c404ff881f6592c627d6325d55a0 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Tue, 25 Feb 2025 15:29:40 +0100 Subject: [PATCH 30/40] Wrapped jupyterbook build command via Makefile --- .github/workflows/deploy-book.yml | 2 +- Makefile | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Makefile diff --git a/.github/workflows/deploy-book.yml b/.github/workflows/deploy-book.yml index 0ba2e1c..3c54462 100644 --- a/.github/workflows/deploy-book.yml +++ b/.github/workflows/deploy-book.yml @@ -75,7 +75,7 @@ jobs: pip install -r requirements.txt - name: Build Jupyter Book - run: jupyter-book build . + run: make docs - name: Deploy to GitHub Pages if: ${{ (github.ref == 'refs/heads/master') && startsWith(matrix.os, 'ubuntu') }} diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2841fc1 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +BUILD_DIR = ./_build +SRC_DIR = . + +docs: + jupyter-book build . + +docs-strict: + jupyter-book build --warningiserror --nitpick --keep-going . + +.PHONY: clean + +clean: + jupyter-book clean . \ No newline at end of file From de48937b41cc723a82e0d8b7fcebfe46585e731e Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 26 Feb 2025 12:03:23 +0100 Subject: [PATCH 31/40] Added missing newlines in AUTHORS and Makefile --- AUTHORS | 1 - AUTHORS.md | 2 ++ Makefile | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) delete mode 100644 AUTHORS create mode 100644 AUTHORS.md diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index f49a2ae..0000000 --- a/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Ahmed Ratnani, Mohamed Jalal Maaouni \ No newline at end of file diff --git a/AUTHORS.md b/AUTHORS.md new file mode 100644 index 0000000..fdc9edb --- /dev/null +++ b/AUTHORS.md @@ -0,0 +1,2 @@ +Ahmed Ratnani +Mohamed Jalal Maaouni diff --git a/Makefile b/Makefile index 2841fc1..ff975b5 100644 --- a/Makefile +++ b/Makefile @@ -10,4 +10,4 @@ docs-strict: .PHONY: clean clean: - jupyter-book clean . \ No newline at end of file + jupyter-book clean . From 3032cb9b9b013b6e2b36235d7ec7743102f8d418 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 26 Feb 2025 12:14:47 +0100 Subject: [PATCH 32/40] AUTHORS.md -> AUTHORS --- AUTHORS.md => AUTHORS | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename AUTHORS.md => AUTHORS (100%) diff --git a/AUTHORS.md b/AUTHORS similarity index 100% rename from AUTHORS.md rename to AUTHORS From 1bdf216135364857025b55b15293c5a5bfc84da8 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 26 Feb 2025 12:15:52 +0100 Subject: [PATCH 33/40] intro.md: referred to list of authors as a footnote --- intro.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/intro.md b/intro.md index be0cb04..353fcaf 100644 --- a/intro.md +++ b/intro.md @@ -1,7 +1,6 @@ # Home -```{include} AUTHORS -``` +*Author: Ahmed Ratnani* [^authors] Welcome to IGA-Python, a tutorial for Isogeometric Analysis using Python. @@ -15,3 +14,5 @@ Welcome to IGA-Python, a tutorial for Isogeometric Analysis using Python. ```{tableofcontents} ``` + +[^authors]: Complete list of authors can be found here: https://github.com/pyccel/IGA-Python/blob/master/AUTHORS From b0060cab9652d13dda66cf5de68d6c6e7bf578e2 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 26 Feb 2025 12:18:30 +0100 Subject: [PATCH 34/40] Added missing newlines --- AUTHORS | 1 + Makefile | 1 + intro.md | 1 + 3 files changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index fdc9edb..f78fe7c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,2 +1,3 @@ Ahmed Ratnani Mohamed Jalal Maaouni + diff --git a/Makefile b/Makefile index ff975b5..f4273f2 100644 --- a/Makefile +++ b/Makefile @@ -11,3 +11,4 @@ docs-strict: clean: jupyter-book clean . + diff --git a/intro.md b/intro.md index 353fcaf..efa75f3 100644 --- a/intro.md +++ b/intro.md @@ -16,3 +16,4 @@ Welcome to IGA-Python, a tutorial for Isogeometric Analysis using Python. ``` [^authors]: Complete list of authors can be found here: https://github.com/pyccel/IGA-Python/blob/master/AUTHORS + From dfba9c81782c360e6dc22aa888153030ae675365 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Wed, 26 Feb 2025 14:40:43 +0100 Subject: [PATCH 35/40] Added myself to AUTHORS --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index f78fe7c..fae28c5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,3 +1,4 @@ Ahmed Ratnani Mohamed Jalal Maaouni +Paul Rigor From 0473381a7ff79c32c435efde3e525721a9b6187a Mon Sep 17 00:00:00 2001 From: kvrigor Date: Thu, 27 Feb 2025 09:30:28 +0100 Subject: [PATCH 36/40] README: Make a separate step for psydac installation so it could be skipped --- README.md | 19 +++++++++++++++---- requirements_ntbk.txt | 10 ++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 requirements_ntbk.txt diff --git a/README.md b/README.md index 13edb71..08d225d 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,20 @@ cd IGA-Python # Install dependencies on a virtual environment python3 -m venv iga-python-env source iga-python-env/bin/activate -pip3 install -r requirements.txt +pip3 install -r requirements_ntbk.txt ``` -2. Edit the desired Python notebooks (`*.ipynb`) and/or Markdown files (`*.md`). Check the [MyST syntax cheat sheet](https://jupyterbook.org/en/stable/reference/cheatsheet.html) for reference. -3. Build the docs by running `make`. -4. View your changes on the browser: `open _build/html/index.html` \ No newline at end of file +2. Install Psydac. Skip this step if Psydac is already installed. + +```bash +# Modify these variables if you're using your own psydac fork/branch +PSYDAC_REMOTE="https://github.com/pyccel/psydac.git" +BRANCH="devel" + +# Install psydac +pip install git+${PSYDAC_REMOTE}@${BRANCH} +``` + +3. Edit the desired Python notebooks (`*.ipynb`) and/or Markdown files (`*.md`). Check the [MyST syntax cheat sheet](https://jupyterbook.org/en/stable/reference/cheatsheet.html) for reference. +4. Build the docs by running `make`. +5. View your changes on the browser: `open _build/html/index.html` diff --git a/requirements_ntbk.txt b/requirements_ntbk.txt new file mode 100644 index 0000000..abd6be3 --- /dev/null +++ b/requirements_ntbk.txt @@ -0,0 +1,10 @@ +wheel +numpy +jupyter-book +sphinx-proof +matplotlib +ipykernel +notebook +nb-clean +myst_parser + From 5a9a3027a64f12e2d2848b3cfb142a989f2174d8 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Tue, 4 Mar 2025 12:36:30 +0100 Subject: [PATCH 37/40] Removed notebook metadata via nb-clean Command used was `find . -type f -iname '*.ipynb' -exec nb-clean clean -eM {} \+` --- chapter1/poisson.ipynb | 29 ++------------- chapter2/advection-diffusion-stabilized.ipynb | 27 +------------- chapter2/advection-diffusion.ipynb | 27 +------------- chapter2/biharmonic.ipynb | 27 +------------- chapter2/elliptic-curl.ipynb | 27 +------------- chapter2/elliptic-div.ipynb | 27 +------------- chapter2/elliptic-general-form.ipynb | 27 +------------- chapter2/linear-elasticity.ipynb | 27 +------------- chapter2/poisson-mixed-v1.ipynb | 35 +------------------ chapter2/poisson-mixed-v2.ipynb | 27 +------------- chapter2/poisson-mixed.ipynb | 27 +------------- chapter2/poisson-nitsche.ipynb | 19 +--------- chapter2/poisson.ipynb | 19 +--------- chapter2/stokes-v1.ipynb | 27 +------------- chapter2/stokes-v2.ipynb | 19 +--------- chapter2/stokes.ipynb | 19 +--------- chapter2/vector-poisson.ipynb | 27 +------------- .../poisson-multi-subdomains-nitsche.ipynb | 27 +------------- chapter4/poisson-two-subdomains-nitsche.ipynb | 27 +------------- .../cfd/bingham_plastic_flow_in_a_pipe.ipynb | 27 +------------- .../buoyancy-driven_natural_convection.ipynb | 27 +------------- .../cfd/casson_fluid_flow_in_a_channel.ipynb | 27 +------------- .../cfd/compressible_flow_in_a_nozzle.ipynb | 27 +------------- ...tion-diffusion_equation_in_a_channel.ipynb | 27 +------------- ...ss_power_law_fluid_flow_in_a_channel.ipynb | 27 +------------- chapter5/cfd/free_surface_flow.ipynb | 27 +------------- chapter5/cfd/heat_conduction_in_a_solid.ipynb | 27 +------------- ...erschel-bulkley_fluid_flow_in_a_pipe.ipynb | 27 +------------- .../incompressible_flow_past_a_cylinder.ipynb | 27 +------------- chapter5/cfd/magnetohydrodynamics_flow.ipynb | 27 +------------- .../oldroyd-b_fluid_flow_in_a_channel.ipynb | 27 +------------- ...apanastasiou_fluid_flow_in_a_channel.ipynb | 27 +------------- chapter5/cfd/particle-laden_flow.ipynb | 27 +------------- .../power_law_fluid_flow_in_a_channel.ipynb | 27 +------------- .../stokes_flow_in_a_lid-driven_cavity.ipynb | 27 +------------- chapter5/cfd/two-phase_flow.ipynb | 27 +------------- ...re_interaction_in_a_flexible_channel.ipynb | 27 +------------- ...sis_of_a_flexible_wing_in_fluid_flow.ipynb | 27 +------------- ...luid-structure_interaction_in_a_tube.ipynb | 27 +------------- .../composite_beam_analysis.ipynb | 27 +------------- ..._materials_with_piezoelectric_fibers.ipynb | 27 +------------- ...ite_materials_with_thermal_expansion.ipynb | 27 +------------- .../composite_pressure_vessel_analysis.ipynb | 27 +------------- .../composite_shaft_analysis.ipynb | 27 +------------- .../composite_shell_structures.ipynb | 27 +------------- .../creep_in_viscoelastic_materials.ipynb | 27 +------------- ...ffusion_and_reaction_in_porous_media.ipynb | 27 +------------- .../elasticity_with_thermal_expansion.ipynb | 27 +------------- ...fiber-reinforced_composite_materials.ipynb | 27 +------------- ...lation_in_directed_energy_deposition.ipynb | 27 +------------- .../heat_conduction_with_phase_change.ipynb | 27 +------------- ...mogenization_of_composite_structures.ipynb | 27 +------------- .../laminate_plate_bending.ipynb | 27 +------------- ...erial_simulation_in_material_jetting.ipynb | 27 +------------- .../piezoelectric_material.ipynb | 27 +------------- ...imulation_in_selective_laser_melting.ipynb | 27 +------------- ...lation_in_fused_filament_fabrication.ipynb | 27 +------------- ..._conductivity_of_composite_materials.ipynb | 27 +------------- ...rmal_simulation_in_powder_bed_fusion.ipynb | 27 +------------- ...hysical_dynamo_in_a_stellar_interior.ipynb | 27 +------------- ...rrofluid_damper_in_mechanical_system.ipynb | 27 +------------- ...ofluid_flow_in_a_microfluidic_device.ipynb | 27 +------------- ...etic_fluid_actuator_in_valve_control.ipynb | 27 +------------- ...magnetic_targeting_in_a_blood_vessel.ipynb | 27 +------------- ...ting_in_the_eye_for_retinal_diseases.ipynb | 27 +------------- .../magnetic_targeting_in_tumor_tissue.ipynb | 27 +------------- ...accretion_disk_in_binary_star_system.ipynb | 27 +------------- ...hd_aluminum_electromagnetic_stirring.ipynb | 27 +------------- .../mhd/mhd_continuous_casting_of_steel.ipynb | 27 +------------- .../mhd/mhd_dynamo_in_a_rotating_sphere.ipynb | 27 +------------- ...sfer_in_a_cylindrical_fusion_reactor.ipynb | 27 +------------- ...transfer_in_a_magma_convection_model.ipynb | 27 +------------- ...eat_transfer_in_a_rectangular_domain.ipynb | 27 +------------- ...oltz_instability_in_magnetized_flows.ipynb | 27 +------------- ...tal_solidification_in_magnetic_field.ipynb | 27 +------------- ...or_instability_in_a_conducting_fluid.ipynb | 27 +------------- chapter5/mhd/mhd_solar_wind_simulation.ipynb | 27 +------------- ..._of_a_current-carrying_plasma_column.ipynb | 27 +------------- ...ar_formation_in_a_protostellar_cloud.ipynb | 27 +------------- .../mhd_turbulence_in_accretion_disks.ipynb | 27 +------------- ...mhd_turbulence_in_laboratory_plasmas.ipynb | 27 +------------- .../mhd/mhd_turbulence_in_solar_winds.ipynb | 27 +------------- .../mhd/simple_kinematic_dynamo_model.ipynb | 27 +------------- 83 files changed, 84 insertions(+), 2135 deletions(-) diff --git a/chapter1/poisson.ipynb b/chapter1/poisson.ipynb index 233edf5..c8ec097 100644 --- a/chapter1/poisson.ipynb +++ b/chapter1/poisson.ipynb @@ -8,7 +8,7 @@ "# Your first code using SymPDE & PsyDAC\n", "*Author: Ahmed Ratnani*\n", "\n", - "We first start by writing our first example using SymPDE.\n", + "We start by writing our first example using SymPDE.\n", "Let $\\Omega := (0,1)^2$. We consider the Poisson problem with homogeneous Dirichlet boundary conditions. \n", "\n", "$$\n", @@ -273,34 +273,9 @@ "# print the result\n", "print(h1_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9250897b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/advection-diffusion-stabilized.ipynb b/chapter2/advection-diffusion-stabilized.ipynb index 34ae9aa..f82b87e 100644 --- a/chapter2/advection-diffusion-stabilized.ipynb +++ b/chapter2/advection-diffusion-stabilized.ipynb @@ -291,34 +291,9 @@ "# print the result\n", "print('>>> GLS = ', l2_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0a972a4f", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/advection-diffusion.ipynb b/chapter2/advection-diffusion.ipynb index a5a1615..8d98601 100644 --- a/chapter2/advection-diffusion.ipynb +++ b/chapter2/advection-diffusion.ipynb @@ -311,34 +311,9 @@ "# print the result\n", "print(h1_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0a972a4f", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/biharmonic.ipynb b/chapter2/biharmonic.ipynb index 3552209..8cc3d42 100644 --- a/chapter2/biharmonic.ipynb +++ b/chapter2/biharmonic.ipynb @@ -294,34 +294,9 @@ "# print the result\n", "print(h2_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "531105ea", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/elliptic-curl.ipynb b/chapter2/elliptic-curl.ipynb index 6182fc6..08bba72 100644 --- a/chapter2/elliptic-curl.ipynb +++ b/chapter2/elliptic-curl.ipynb @@ -283,34 +283,9 @@ "# print the result\n", "#print(h1_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9250897b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/elliptic-div.ipynb b/chapter2/elliptic-div.ipynb index 70b6d21..fd4afd0 100644 --- a/chapter2/elliptic-div.ipynb +++ b/chapter2/elliptic-div.ipynb @@ -278,34 +278,9 @@ "# print the result\n", "#print(h1_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9250897b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/elliptic-general-form.ipynb b/chapter2/elliptic-general-form.ipynb index 22ae67e..1612fd5 100644 --- a/chapter2/elliptic-general-form.ipynb +++ b/chapter2/elliptic-general-form.ipynb @@ -222,34 +222,9 @@ "# print the result\n", "print(l2_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5d7d9180", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/linear-elasticity.ipynb b/chapter2/linear-elasticity.ipynb index bfd6abc..f4d1366 100644 --- a/chapter2/linear-elasticity.ipynb +++ b/chapter2/linear-elasticity.ipynb @@ -217,34 +217,9 @@ "source": [ "uh = equation_h.solve(mu=1, rho=1, kappa=1.25)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9250897b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/poisson-mixed-v1.ipynb b/chapter2/poisson-mixed-v1.ipynb index ae74717..4f25a47 100644 --- a/chapter2/poisson-mixed-v1.ipynb +++ b/chapter2/poisson-mixed-v1.ipynb @@ -218,42 +218,9 @@ "l2norm = l2norm_ph.assemble(p=ph)\n", "print('>>> norm-l2 ph = ', l2norm)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a82ae495", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "494e2cca", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/poisson-mixed-v2.ipynb b/chapter2/poisson-mixed-v2.ipynb index 12d48ea..1d200e6 100644 --- a/chapter2/poisson-mixed-v2.ipynb +++ b/chapter2/poisson-mixed-v2.ipynb @@ -227,34 +227,9 @@ "l2norm = l2norm_ph.assemble(p=ph)\n", "print('>>> norm-l2 ph = ', l2norm)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d7adf378", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/poisson-mixed.ipynb b/chapter2/poisson-mixed.ipynb index 2a3aa2f..8859c9a 100644 --- a/chapter2/poisson-mixed.ipynb +++ b/chapter2/poisson-mixed.ipynb @@ -23,34 +23,9 @@ "\n", "$$ \\mathbf{u}=-\\nabla p, ~~~ \\nabla\\cdot \\mathbf{u}= f.$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "46339ba9", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/poisson-nitsche.ipynb b/chapter2/poisson-nitsche.ipynb index ebdb1f9..6650735 100644 --- a/chapter2/poisson-nitsche.ipynb +++ b/chapter2/poisson-nitsche.ipynb @@ -197,24 +197,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/poisson.ipynb b/chapter2/poisson.ipynb index a2335c2..76aad47 100644 --- a/chapter2/poisson.ipynb +++ b/chapter2/poisson.ipynb @@ -263,24 +263,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/stokes-v1.ipynb b/chapter2/stokes-v1.ipynb index c723310..16f6d7d 100644 --- a/chapter2/stokes-v1.ipynb +++ b/chapter2/stokes-v1.ipynb @@ -225,34 +225,9 @@ "l2norm = l2norm_ph.assemble(p=ph)\n", "print('>>> norm-l2 ph = ', l2norm)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9250897b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/stokes-v2.ipynb b/chapter2/stokes-v2.ipynb index 9ccc000..62f6a9b 100644 --- a/chapter2/stokes-v2.ipynb +++ b/chapter2/stokes-v2.ipynb @@ -222,24 +222,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/stokes.ipynb b/chapter2/stokes.ipynb index eaafbc2..bd50ca1 100644 --- a/chapter2/stokes.ipynb +++ b/chapter2/stokes.ipynb @@ -23,24 +23,7 @@ ] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter2/vector-poisson.ipynb b/chapter2/vector-poisson.ipynb index 9aecdb0..47c46bb 100644 --- a/chapter2/vector-poisson.ipynb +++ b/chapter2/vector-poisson.ipynb @@ -262,34 +262,9 @@ "# print the result\n", "print(h1_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9250897b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter4/poisson-multi-subdomains-nitsche.ipynb b/chapter4/poisson-multi-subdomains-nitsche.ipynb index 4a112ad..2e7055d 100644 --- a/chapter4/poisson-multi-subdomains-nitsche.ipynb +++ b/chapter4/poisson-multi-subdomains-nitsche.ipynb @@ -181,34 +181,9 @@ "# print the result\n", "print(l2_error)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8d687800", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter4/poisson-two-subdomains-nitsche.ipynb b/chapter4/poisson-two-subdomains-nitsche.ipynb index 8f14c21..ae82d93 100644 --- a/chapter4/poisson-two-subdomains-nitsche.ipynb +++ b/chapter4/poisson-two-subdomains-nitsche.ipynb @@ -256,34 +256,9 @@ "\n", "The **BoundaryExpression** terms should not appear in the TerminalExpr." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "645e631b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb index 160f2fa..5ebb812 100644 --- a/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/bingham_plastic_flow_in_a_pipe.ipynb @@ -44,34 +44,9 @@ "\n", "for all test functions $v \\in H_0^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3104c066", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb index 8d65c53..aa377a8 100644 --- a/chapter5/cfd/buoyancy-driven_natural_convection.ipynb +++ b/chapter5/cfd/buoyancy-driven_natural_convection.ipynb @@ -47,34 +47,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dc53cb64", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb index b61b982..85728d2 100644 --- a/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/casson_fluid_flow_in_a_channel.ipynb @@ -40,34 +40,9 @@ "\n", "for all test functions $u_i \\in H_0^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "52879066", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb index e7c7f91..46c8e88 100644 --- a/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb +++ b/chapter5/cfd/compressible_flow_in_a_nozzle.ipynb @@ -46,34 +46,9 @@ "\n", "for all test functions $\\phi, \\mathbf{w}, \\psi \\in H^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8a3bde01", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb index 0d477de..f44235c 100644 --- a/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb +++ b/chapter5/cfd/convection-diffusion_equation_in_a_channel.ipynb @@ -44,34 +44,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9d3c6c22", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb index 344cbc0..5d60f00 100644 --- a/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/cross_power_law_fluid_flow_in_a_channel.ipynb @@ -43,34 +43,9 @@ "\n", "for all test functions $v_i \\in H_0^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "85946710", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/free_surface_flow.ipynb b/chapter5/cfd/free_surface_flow.ipynb index bfad672..c04f5da 100644 --- a/chapter5/cfd/free_surface_flow.ipynb +++ b/chapter5/cfd/free_surface_flow.ipynb @@ -46,34 +46,9 @@ "\n", "for all test functions $\\mathbf{w} \\in H_0^1(\\Omega)$, $q \\in L^2(\\Omega)$, and $r \\in H^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b3ac645a", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/heat_conduction_in_a_solid.ipynb b/chapter5/cfd/heat_conduction_in_a_solid.ipynb index 4e32a6b..9cf6e28 100644 --- a/chapter5/cfd/heat_conduction_in_a_solid.ipynb +++ b/chapter5/cfd/heat_conduction_in_a_solid.ipynb @@ -40,34 +40,9 @@ "for all test functions $\\phi \\in H_0^1(\\Omega)$.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "55ba709f", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb index 12d687e..411e961 100644 --- a/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb +++ b/chapter5/cfd/herschel-bulkley_fluid_flow_in_a_pipe.ipynb @@ -45,34 +45,9 @@ "\n", "for all test functions $v \\in H_0^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1f098463", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb index 89f5e5f..08bb4c2 100644 --- a/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb +++ b/chapter5/cfd/incompressible_flow_past_a_cylinder.ipynb @@ -41,34 +41,9 @@ "\n", "where $\\mathbf{w} \\in H_0^1(\\Omega)$ and $q \\in L^2(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ed14fcc5", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/magnetohydrodynamics_flow.ipynb b/chapter5/cfd/magnetohydrodynamics_flow.ipynb index 469c691..ce704ee 100644 --- a/chapter5/cfd/magnetohydrodynamics_flow.ipynb +++ b/chapter5/cfd/magnetohydrodynamics_flow.ipynb @@ -47,34 +47,9 @@ "\n", "for all test functions $\\mathbf{w} \\in H_0^1(\\Omega)$, $q \\in L^2(\\Omega)$, $\\boldsymbol{\\psi} \\in H(\\text{curl}; \\Omega)$, and $r \\in L^2(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "850e45f1", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb index 356e386..271af56 100644 --- a/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/oldroyd-b_fluid_flow_in_a_channel.ipynb @@ -45,34 +45,9 @@ "\n", "for all test functions $\\mathbf{w} \\in H_0^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b949a16a", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb index f81b1e6..a720a34 100644 --- a/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/papanastasiou_fluid_flow_in_a_channel.ipynb @@ -42,34 +42,9 @@ "\n", "for all test functions $u_i \\in H_0^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "02de07e4", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/particle-laden_flow.ipynb b/chapter5/cfd/particle-laden_flow.ipynb index 9f2cfe9..7aa68cc 100644 --- a/chapter5/cfd/particle-laden_flow.ipynb +++ b/chapter5/cfd/particle-laden_flow.ipynb @@ -45,34 +45,9 @@ "\n", "for all test functions $\\mathbf{w} \\in H_0^1(\\Omega)$ and $q \\in L^2(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fe99e28f", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb index 9b7361c..0cbaf65 100644 --- a/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb +++ b/chapter5/cfd/power_law_fluid_flow_in_a_channel.ipynb @@ -42,34 +42,9 @@ "\n", "for all test functions $v_i \\in H_0^1(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f5664e1e", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb b/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb index 94187e5..8d78d95 100644 --- a/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb +++ b/chapter5/cfd/stokes_flow_in_a_lid-driven_cavity.ipynb @@ -45,34 +45,9 @@ "for all test functions $\\mathbf{w} \\in H_0^1(\\Omega)$.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ce2a125a", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/cfd/two-phase_flow.ipynb b/chapter5/cfd/two-phase_flow.ipynb index b6311e6..51148dc 100644 --- a/chapter5/cfd/two-phase_flow.ipynb +++ b/chapter5/cfd/two-phase_flow.ipynb @@ -44,34 +44,9 @@ "\n", "for all test functions $\\mathbf{w} \\in H_0^1(\\Omega)$ and $q \\in L^2(\\Omega)$." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2542c254", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb b/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb index 555c989..0f48fea 100644 --- a/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb +++ b/chapter5/fsi/fluid-structure_interaction_in_a_flexible_channel.ipynb @@ -60,34 +60,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f77f76ce", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb b/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb index 05624ba..7f3381d 100644 --- a/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb +++ b/chapter5/fsi/flutter_analysis_of_a_flexible_wing_in_fluid_flow.ipynb @@ -54,34 +54,9 @@ "for all $\\phi_s \\in V_s$ and $\\mathbf{\\phi}_f \\in V_f$.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c4278e28", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb b/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb index 5c3a75d..66bd252 100644 --- a/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb +++ b/chapter5/fsi/two-way_fluid-structure_interaction_in_a_tube.ipynb @@ -53,34 +53,9 @@ "for all $\\phi_s \\in V_s$ and $\\phi_f \\in V_f$.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d95797ce", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/composite_beam_analysis.ipynb b/chapter5/material-science/composite_beam_analysis.ipynb index 803cdaa..f5c5a6b 100644 --- a/chapter5/material-science/composite_beam_analysis.ipynb +++ b/chapter5/material-science/composite_beam_analysis.ipynb @@ -26,34 +26,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fab1c283", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb index 3886a8e..ef2e462 100644 --- a/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb +++ b/chapter5/material-science/composite_materials_with_piezoelectric_fibers.ipynb @@ -26,34 +26,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "52494dd6", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb index 1f0b2f6..ad741c7 100644 --- a/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb +++ b/chapter5/material-science/composite_materials_with_thermal_expansion.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "98acd7a7", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb index a4bcf21..c235421 100644 --- a/chapter5/material-science/composite_pressure_vessel_analysis.ipynb +++ b/chapter5/material-science/composite_pressure_vessel_analysis.ipynb @@ -27,34 +27,9 @@ "$$\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b4fc4493", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/composite_shaft_analysis.ipynb b/chapter5/material-science/composite_shaft_analysis.ipynb index 9e444ed..38e7b31 100644 --- a/chapter5/material-science/composite_shaft_analysis.ipynb +++ b/chapter5/material-science/composite_shaft_analysis.ipynb @@ -26,34 +26,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9e364613", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/composite_shell_structures.ipynb b/chapter5/material-science/composite_shell_structures.ipynb index ba77d17..8f9f374 100644 --- a/chapter5/material-science/composite_shell_structures.ipynb +++ b/chapter5/material-science/composite_shell_structures.ipynb @@ -26,34 +26,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "60838184", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb index 1e5e944..0a7ac87 100644 --- a/chapter5/material-science/creep_in_viscoelastic_materials.ipynb +++ b/chapter5/material-science/creep_in_viscoelastic_materials.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "640ff39a", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb index fcdcc4c..20dd088 100644 --- a/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb +++ b/chapter5/material-science/diffusion_and_reaction_in_porous_media.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c2f715b8", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb index b09b04f..a714b0e 100644 --- a/chapter5/material-science/elasticity_with_thermal_expansion.ipynb +++ b/chapter5/material-science/elasticity_with_thermal_expansion.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a605733a", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb index 4709e2a..b1beb1a 100644 --- a/chapter5/material-science/fiber-reinforced_composite_materials.ipynb +++ b/chapter5/material-science/fiber-reinforced_composite_materials.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "37f95771", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb index 9dd84f3..4c8ccc7 100644 --- a/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb +++ b/chapter5/material-science/fluid_flow_simulation_in_directed_energy_deposition.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a6c3c4a2", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/heat_conduction_with_phase_change.ipynb b/chapter5/material-science/heat_conduction_with_phase_change.ipynb index 30f5efe..84b9275 100644 --- a/chapter5/material-science/heat_conduction_with_phase_change.ipynb +++ b/chapter5/material-science/heat_conduction_with_phase_change.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ff960922", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/homogenization_of_composite_structures.ipynb b/chapter5/material-science/homogenization_of_composite_structures.ipynb index 50d65ac..b220b96 100644 --- a/chapter5/material-science/homogenization_of_composite_structures.ipynb +++ b/chapter5/material-science/homogenization_of_composite_structures.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "fc9ff2d1", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/laminate_plate_bending.ipynb b/chapter5/material-science/laminate_plate_bending.ipynb index ad5d7f9..c54f597 100644 --- a/chapter5/material-science/laminate_plate_bending.ipynb +++ b/chapter5/material-science/laminate_plate_bending.ipynb @@ -26,34 +26,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b12075d0", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb index f43e714..c6302a8 100644 --- a/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb +++ b/chapter5/material-science/multi-material_simulation_in_material_jetting.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "047cbee6", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/piezoelectric_material.ipynb b/chapter5/material-science/piezoelectric_material.ipynb index f32f1cd..635b992 100644 --- a/chapter5/material-science/piezoelectric_material.ipynb +++ b/chapter5/material-science/piezoelectric_material.ipynb @@ -26,34 +26,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e169fdf9", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb index ebae4d5..dddb175 100644 --- a/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb +++ b/chapter5/material-science/residual_stress_simulation_in_selective_laser_melting.ipynb @@ -24,34 +24,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a6c8774d", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb index 3d177e2..f8b6500 100644 --- a/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb +++ b/chapter5/material-science/structural_simulation_in_fused_filament_fabrication.ipynb @@ -24,34 +24,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21acc4a9", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb index 5643e1c..d8e965f 100644 --- a/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb +++ b/chapter5/material-science/thermal_conductivity_of_composite_materials.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9647a80c", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb index 0f9d83f..a2ed042 100644 --- a/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb +++ b/chapter5/material-science/thermal_simulation_in_powder_bed_fusion.ipynb @@ -25,34 +25,9 @@ "\\end{align*}\n", "$$" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c0100203", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb b/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb index a78f131..f2fe7c4 100644 --- a/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb +++ b/chapter5/mhd/astrophysical_dynamo_in_a_stellar_interior.ipynb @@ -23,34 +23,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cf051a47", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb b/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb index bb6a133..0056b50 100644 --- a/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb +++ b/chapter5/mhd/ferrofluid_damper_in_mechanical_system.ipynb @@ -23,34 +23,9 @@ "- Initialize the distribution of ferrofluid within the damper.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "cd025e19", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb b/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb index 9039a94..85633ac 100644 --- a/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb +++ b/chapter5/mhd/ferrofluid_flow_in_a_microfluidic_device.ipynb @@ -22,34 +22,9 @@ "- Introduce a specified initial distribution of ferrofluid within the channel.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4d819786", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb b/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb index fe2ce8d..918b343 100644 --- a/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb +++ b/chapter5/mhd/magnetic_fluid_actuator_in_valve_control.ipynb @@ -28,34 +28,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "731572fc", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb b/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb index 88bbe64..e4b80f4 100644 --- a/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb +++ b/chapter5/mhd/magnetic_targeting_in_a_blood_vessel.ipynb @@ -23,34 +23,9 @@ "- Inject drug-carrying particles into the bloodstream.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "684ab37c", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb b/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb index 4218723..591bcd3 100644 --- a/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb +++ b/chapter5/mhd/magnetic_targeting_in_the_eye_for_retinal_diseases.ipynb @@ -28,34 +28,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a5b6bd71", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb b/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb index f54aeeb..c62bce9 100644 --- a/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb +++ b/chapter5/mhd/magnetic_targeting_in_tumor_tissue.ipynb @@ -23,34 +23,9 @@ "- Release drug-carrying particles from a source point.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e3c83678", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb b/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb index 911a5ae..2019e98 100644 --- a/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb +++ b/chapter5/mhd/mhd_accretion_disk_in_binary_star_system.ipynb @@ -30,34 +30,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10a896ff", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb b/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb index 1c787e6..71cf78d 100644 --- a/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb +++ b/chapter5/mhd/mhd_aluminum_electromagnetic_stirring.ipynb @@ -23,34 +23,9 @@ "- Include initial magnetic field conditions.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a25ee1a9", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb b/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb index 9fe4621..a8afee7 100644 --- a/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb +++ b/chapter5/mhd/mhd_continuous_casting_of_steel.ipynb @@ -23,34 +23,9 @@ "- Include initial magnetic field conditions.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "17cc6b7f", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb b/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb index ac8ef41..eebcbab 100644 --- a/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb +++ b/chapter5/mhd/mhd_dynamo_in_a_rotating_sphere.ipynb @@ -21,34 +21,9 @@ "- Incorporate a rotation-induced dynamo term.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "255489bd", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb b/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb index e9c74d2..b5f47bb 100644 --- a/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb +++ b/chapter5/mhd/mhd_heat_transfer_in_a_cylindrical_fusion_reactor.ipynb @@ -19,34 +19,9 @@ "- Initial plasma temperature and velocity distribution.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b3132a7e", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb b/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb index a0b68b6..3d60e99 100644 --- a/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb +++ b/chapter5/mhd/mhd_heat_transfer_in_a_magma_convection_model.ipynb @@ -23,34 +23,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "899661bb", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb b/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb index 71da301..111d487 100644 --- a/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb +++ b/chapter5/mhd/mhd_heat_transfer_in_a_rectangular_domain.ipynb @@ -20,34 +20,9 @@ "- Initial fluid velocity $\\mathbf{v} = [0, 0]$, magnetic field $\\mathbf{B} = [B_0, 0]$, and uniform temperature $T = T_0$.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ded1b9da", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb b/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb index 3cd727a..b167297 100644 --- a/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb +++ b/chapter5/mhd/mhd_kelvin-helmholtz_instability_in_magnetized_flows.ipynb @@ -29,34 +29,9 @@ "- Boundary conditions: Appropriate conditions on $\\mathbf{v}, \\mathbf{B}, T$ at the interfaces.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d518610b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb b/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb index c96d9db..4bf34f5 100644 --- a/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb +++ b/chapter5/mhd/mhd_metal_solidification_in_magnetic_field.ipynb @@ -27,34 +27,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e9102174", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb b/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb index d55a0a6..3bb2f05 100644 --- a/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb +++ b/chapter5/mhd/mhd_rayleigh-taylor_instability_in_a_conducting_fluid.ipynb @@ -29,34 +29,9 @@ "- Boundary conditions: Appropriate conditions on $\\mathbf{v}, \\mathbf{B}, T$ at the fluid interfaces.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23014644", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_solar_wind_simulation.ipynb b/chapter5/mhd/mhd_solar_wind_simulation.ipynb index 23becb1..23c5f01 100644 --- a/chapter5/mhd/mhd_solar_wind_simulation.ipynb +++ b/chapter5/mhd/mhd_solar_wind_simulation.ipynb @@ -22,34 +22,9 @@ "- Set up initial plasma parameters.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a1eb5205", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb b/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb index c8c0840..a0a7962 100644 --- a/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb +++ b/chapter5/mhd/mhd_stability_of_a_current-carrying_plasma_column.ipynb @@ -32,34 +32,9 @@ "\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b025a35", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb b/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb index c630484..a198f5a 100644 --- a/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb +++ b/chapter5/mhd/mhd_star_formation_in_a_protostellar_cloud.ipynb @@ -22,34 +22,9 @@ "- Include a small seed magnetic field perturbation.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6813d146", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb b/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb index febda1f..7c3d5e9 100644 --- a/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb +++ b/chapter5/mhd/mhd_turbulence_in_accretion_disks.ipynb @@ -27,34 +27,9 @@ "- Initial condition: Conditions representing the initial state of the accretion disk.\n", "- Boundary conditions: Specify conditions at the inner and outer edges of the accretion disk." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ff062a2a", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb b/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb index 8dee705..32ee49a 100644 --- a/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb +++ b/chapter5/mhd/mhd_turbulence_in_laboratory_plasmas.ipynb @@ -29,34 +29,9 @@ "- Boundary conditions: Set appropriate conditions for the plasma confinement device.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4b9c015b", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb b/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb index 79137c9..3763ebd 100644 --- a/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb +++ b/chapter5/mhd/mhd_turbulence_in_solar_winds.ipynb @@ -27,34 +27,9 @@ "- Initial condition: Appropriate conditions for solar wind parameters.\n", "- Boundary conditions: Consider inflow conditions at the solar corona and outflow conditions at the outer boundary." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3af7c787", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } diff --git a/chapter5/mhd/simple_kinematic_dynamo_model.ipynb b/chapter5/mhd/simple_kinematic_dynamo_model.ipynb index a63d163..4c93a6b 100644 --- a/chapter5/mhd/simple_kinematic_dynamo_model.ipynb +++ b/chapter5/mhd/simple_kinematic_dynamo_model.ipynb @@ -21,34 +21,9 @@ "- Choose a constant $\\alpha$ to represent the dynamo term.\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6948d035", - "metadata": {}, - "outputs": [], - "source": [] } ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 5 } From 03ee341e95d6546b6f9a1d6feab3397bb9325234 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Tue, 4 Mar 2025 13:40:09 +0100 Subject: [PATCH 38/40] Added a contributing section to README; added logs to Makefile steps --- Makefile | 21 ++++++++++++++++----- README.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index f4273f2..6321b25 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,25 @@ BUILD_DIR = ./_build SRC_DIR = . +.PHONY: docs docs-strict clean clean-notebooks + docs: - jupyter-book build . + @echo "Building IGA-Python docs..." + @jupyter-book build . + @echo "Done." docs-strict: - jupyter-book build --warningiserror --nitpick --keep-going . - -.PHONY: clean + @echo "Building IGA-Python docs with strict rules on..." + @jupyter-book build --warningiserror --nitpick --keep-going . + @echo "Done." clean: - jupyter-book clean . + @echo "Removing previous IGA-Python build artifacts..." + @jupyter-book clean . + @echo "Done." + +clean-notebooks: + @echo "Running 'nb-clean --remove-empty-cells --remove-all-notebook-metadata' on all '*.ipynb' files..." + @find . -type f -iname '*.ipynb' -exec nb-clean clean --remove-empty-cells --remove-all-notebook-metadata {} \+ + @echo "Done." diff --git a/README.md b/README.md index 08d225d..c778c62 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # Welcome to IGA-Python -Contains the source code of the [IGA-Python](https://pyccel.github.io/IGA-Python/) site. +This project provides a tutorial for isogeometric analysis (IGA) using Python and +the Psydac library (pyccel/psydac). The numerical examples can be consulted online +at pyccel.github.io/IGA-Python, or run with Jupyter Notebook on a personal computer. ## Editing and building IGA-Python locally @@ -9,6 +11,7 @@ Contains the source code of the [IGA-Python](https://pyccel.github.io/IGA-Python ```bash git clone https://github.com/pyccel/IGA-Python.git cd IGA-Python +IGA_PYTHON_DIR=$(pwd) # Install dependencies on a virtual environment python3 -m venv iga-python-env @@ -27,6 +30,48 @@ BRANCH="devel" pip install git+${PSYDAC_REMOTE}@${BRANCH} ``` -3. Edit the desired Python notebooks (`*.ipynb`) and/or Markdown files (`*.md`). Check the [MyST syntax cheat sheet](https://jupyterbook.org/en/stable/reference/cheatsheet.html) for reference. -4. Build the docs by running `make`. -5. View your changes on the browser: `open _build/html/index.html` +3. Run or modify the desired Python notebooks (`*.ipynb`) and Markdown files (`*.md`). Check the [MyST syntax cheat sheet](https://jupyterbook.org/en/stable/reference/cheatsheet.html) for reference. + +> [!NOTE] +> Before committing changes to git, the notebooks have to be cleaned first. See ["Committing your changes to git"](#committing-your-changes-to-git) for more information. + +4. Build the docs by running `make` under the IGA-Python folder. This involves running all `*.ipynb` files in the background to make sure they are functional. + +```bash +cd ${IGA_PYTHON_DIR} +make +``` + +5. View your changes on the browser. + +```bash +open ${IGA_PYTHON_DIR}/_build/html/index.html +``` + +## Committing your changes to git + +Running the Python notebooks automatically embeds extra information to the notebooks +like the name of your virtual environment, Python version used, cell outputs, etc. +These system- and runtime-specific information should be removed before committing +changes to git. You can follow the suggested commit workflow below: + +1. Run [`nb-clean`](https://github.com/srstevenson/nb-clean) on the modified notebook/s. There are multiple ways to do this: + +```bash +# Clean a single file +nb-clean clean --remove-empty-cells --remove-all-notebook-metadata chapter1/poisson.ipynb + +# Clean all '.ipynb' files under IGA-Python +make clean-notebooks + +# Automatically run nb-clean on `git add`-ed *.ipynb files +nb-clean add-filter --remove-empty-cells --remove-all-notebook-metadata + +# Undo previous command +nb-clean remove-filter +``` + +2. Create a branch for your local changes, e.g. `git checkout -b my-local-fixes`. +3. Stage the modified files with `git add`. Then run `git diff` to check if the changed `*.ipynb` notebooks doesn't include unnecessary diffs (e.g. notebook metadata). +4. `git commit` your changes. +5. *OPTIONAL*. Share your changes to this repo via a [pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request). From c1685a4af69c961e784466a44899059c1527cf72 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Tue, 4 Mar 2025 13:49:24 +0100 Subject: [PATCH 39/40] README: Removed line breaks and simplified some sentences --- README.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index c778c62..ef03299 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # Welcome to IGA-Python -This project provides a tutorial for isogeometric analysis (IGA) using Python and -the Psydac library (pyccel/psydac). The numerical examples can be consulted online -at pyccel.github.io/IGA-Python, or run with Jupyter Notebook on a personal computer. +This project provides a tutorial for isogeometric analysis (IGA) using Python and the Psydac library (pyccel/psydac). The numerical examples can be consulted online at pyccel.github.io/IGA-Python, or run with JupyterNotebook on a personal computer. ## Editing and building IGA-Python locally @@ -50,15 +48,12 @@ open ${IGA_PYTHON_DIR}/_build/html/index.html ## Committing your changes to git -Running the Python notebooks automatically embeds extra information to the notebooks -like the name of your virtual environment, Python version used, cell outputs, etc. -These system- and runtime-specific information should be removed before committing -changes to git. You can follow the suggested commit workflow below: +Running the Python notebooks embeds extra information like the name of virtual environment, Python version used, cell outputs, etc. The notebooks should be free of system- and runtime-specific information before committing them to source control. We suggest the following commit workflow: -1. Run [`nb-clean`](https://github.com/srstevenson/nb-clean) on the modified notebook/s. There are multiple ways to do this: +1. Run [`nb-clean`](https://github.com/srstevenson/nb-clean) on the modified notebook/s. There are different ways to run this command: ```bash -# Clean a single file +# Clean a single notebook nb-clean clean --remove-empty-cells --remove-all-notebook-metadata chapter1/poisson.ipynb # Clean all '.ipynb' files under IGA-Python From a66206f64463094afb7f7d96211d85d3950e4048 Mon Sep 17 00:00:00 2001 From: kvrigor Date: Tue, 4 Mar 2025 14:15:35 +0100 Subject: [PATCH 40/40] install.md: Added separate step for Psydac installation --- chapter1/install.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/chapter1/install.md b/chapter1/install.md index 20e490c..484d5f5 100644 --- a/chapter1/install.md +++ b/chapter1/install.md @@ -12,10 +12,21 @@ cd IGA-Python # Install required Python packages python3 -m venv iga-python-env source iga-python-env/bin/activate -pip3 install -r requirements.txt +pip3 install -r requirements_ntbk.txt ``` -2. Access [IGA-Python] examples through Jupyter notebook. +2. Install Psydac. Skip this step if Psydac is already installed on your system. + +```bash +# Modify these variables if you're using your own psydac fork/branch +PSYDAC_REMOTE="https://github.com/pyccel/psydac.git" +BRANCH="devel" + +# Install psydac +pip install git+${PSYDAC_REMOTE}@${BRANCH} +``` + +3. Access [IGA-Python] examples through Jupyter notebook. ```shell # Run this command under IGA-Python folder @@ -46,4 +57,4 @@ jupyter notebook **Congratulations!** You can now head over to the [Poisson example problem](poisson.ipynb) to get started. -[IGA-Python]: https://github.com/pyccel/IGA-Python.git \ No newline at end of file +[IGA-Python]: https://github.com/pyccel/IGA-Python.git