From 2470e1b4d6d6fc4e55d0525b8c20a751b0df08ca Mon Sep 17 00:00:00 2001 From: Christophe Prud'homme Date: Mon, 16 Sep 2024 10:56:46 +0200 Subject: [PATCH 1/4] add information store in excel sheet in the report #15 - add list of computer science features - add list of math features per wp - add statistics of exa-ma software --- chapters/00-index.tex | 8 - chapters/WP2/00-index.tex | 1 - chapters/WP3/00-index.tex | 6 +- chapters/WP4/00-index.tex | 1 - chapters/WP5/00-index.tex | 3 +- chapters/software.tex | 101 +++- exa-ma-d7.1.tex | 13 + exama-software.xlsx | Bin 0 -> 213138 bytes gen.py | 519 +++++++++++++++++- requirements.txt | 5 +- software/arcane-framework/WP3/WP3.tex | 92 ++++ .../arcane-framework/arcane-framework.tex | 101 +++- software/cgal/WP1/WP1.tex | 55 +- software/cgal/cgal.tex | 96 +++- software/composyx/WP3/WP3.tex | 57 +- software/composyx/composyx.tex | 102 +++- software/feelpp/WP1/WP1.tex | 68 ++- software/feelpp/WP2/WP2.tex | 63 ++- software/feelpp/WP3/WP3.tex | 59 +- software/feelpp/WP4/WP4.tex | 58 +- software/feelpp/WP5/WP5.tex | 58 +- software/feelpp/feelpp.tex | 122 +++- software/freefempp/WP1/WP1.tex | 73 ++- software/freefempp/WP3/WP3.tex | 71 ++- software/freefempp/WP5/WP5.tex | 93 ++++ software/freefempp/freefempp.tex | 123 ++++- software/hawen/WP1/WP1.tex | 55 +- software/hawen/WP3/WP3.tex | 54 +- software/hawen/WP4/WP4.tex | 54 +- software/hawen/hawen.tex | 95 +++- software/hpddm/WP3/WP3.tex | 39 +- software/hpddm/hpddm.tex | 66 ++- .../WP3/WP3.tex | 97 ++++ .../hpdomain-decomposition-methods.tex | 129 +++++ software/mahyco/mahyco.tex | 94 +++- software/manta/WP3/WP3.tex | 90 +++ software/manta/manta.tex | 96 +++- software/maphyspp/WP3/WP3.tex | 46 ++ software/maphyspp/maphyspp.tex | 212 +++++++ software/mmg-parmmg/WP1/WP1.tex | 69 ++- software/mmg-parmmg/mmg-parmmg.tex | 115 +++- software/pbb/WP5/WP5.tex | 55 +- software/pbb/pbb.tex | 96 +++- software/samurai/WP1/WP1.tex | 55 +- software/samurai/samurai.tex | 98 +++- software/scimba/WP2/WP2.tex | 56 +- software/scimba/scimba.tex | 93 +++- software/trust-platform/WP3/WP3.tex | 92 ++++ software/trust-platform/trust-platform.tex | 99 +++- software/uranie/WP6/WP6.tex | 26 +- software/uranie/uranie.tex | 179 +++++- software/zellij/WP5/WP5.tex | 55 +- software/zellij/zellij.tex | 92 +++- templates/desc-software.tex | 64 ++- templates/wp-software.tex | 39 +- 55 files changed, 4069 insertions(+), 289 deletions(-) create mode 100644 exama-software.xlsx create mode 100644 software/arcane-framework/WP3/WP3.tex create mode 100644 software/freefempp/WP5/WP5.tex create mode 100644 software/hpdomain-decomposition-methods/WP3/WP3.tex create mode 100644 software/hpdomain-decomposition-methods/hpdomain-decomposition-methods.tex create mode 100644 software/manta/WP3/WP3.tex create mode 100644 software/maphyspp/WP3/WP3.tex create mode 100644 software/maphyspp/maphyspp.tex create mode 100644 software/trust-platform/WP3/WP3.tex diff --git a/chapters/00-index.tex b/chapters/00-index.tex index 8b78d0f..d3be554 100644 --- a/chapters/00-index.tex +++ b/chapters/00-index.tex @@ -18,11 +18,3 @@ \chapter{WP5 - Optimization} \clearpage \subimport{./WP5}{00-index} -\chapter{WP6 - Uncertainty quantification} -\clearpage -\subimport{./WP6}{00-index} - -\chapter{Mini-Apps and Proxy-Apps} -\clearpage -\subimport{./WP7}{00-index} - diff --git a/chapters/WP2/00-index.tex b/chapters/WP2/00-index.tex index 425034c..a1fba8f 100644 --- a/chapters/WP2/00-index.tex +++ b/chapters/WP2/00-index.tex @@ -1,3 +1,2 @@ \input{software/feelpp/WP2/WP2.tex} -\input{software/freefempp/WP2/WP2.tex} \input{software/scimba/WP2/WP2.tex} diff --git a/chapters/WP3/00-index.tex b/chapters/WP3/00-index.tex index f6c82f7..80a6c93 100644 --- a/chapters/WP3/00-index.tex +++ b/chapters/WP3/00-index.tex @@ -1,6 +1,8 @@ +\input{software/arcane-framework/WP3/WP3.tex} \input{software/composyx/WP3/WP3.tex} \input{software/feelpp/WP3/WP3.tex} \input{software/freefempp/WP3/WP3.tex} -\input{software/hpddm/WP3/WP3.tex} \input{software/hawen/WP3/WP3.tex} -\input{software/mahyco/WP3/WP3.tex} +\input{software/hpdomain-decomposition-methods/WP3/WP3.tex} +\input{software/manta/WP3/WP3.tex} +\input{software/trust-platform/WP3/WP3.tex} diff --git a/chapters/WP4/00-index.tex b/chapters/WP4/00-index.tex index 74f6439..b364c47 100644 --- a/chapters/WP4/00-index.tex +++ b/chapters/WP4/00-index.tex @@ -1,3 +1,2 @@ \input{software/feelpp/WP4/WP4.tex} -\input{software/freefempp/WP4/WP4.tex} \input{software/hawen/WP4/WP4.tex} diff --git a/chapters/WP5/00-index.tex b/chapters/WP5/00-index.tex index 5c691b5..62364fc 100644 --- a/chapters/WP5/00-index.tex +++ b/chapters/WP5/00-index.tex @@ -1,3 +1,4 @@ \input{software/feelpp/WP5/WP5.tex} -\input{software/zellij/WP5/WP5.tex} +\input{software/freefempp/WP5/WP5.tex} \input{software/pbb/WP5/WP5.tex} +\input{software/zellij/WP5/WP5.tex} diff --git a/chapters/software.tex b/chapters/software.tex index f58ccb7..623205d 100644 --- a/chapters/software.tex +++ b/chapters/software.tex @@ -1,20 +1,111 @@ \clearpage \chapter{Software} \label{sec:software} -This chapter presents the software developed within Exa-MA. Each software is described in a dedicated section, with a focus on the features and the general mathematics, the main functionalities, the relevant publications and acknowledgments, and the contact persons. + + This chapter presents the software developed within Exa-MA, focusing on features, mathematics, functionalities, publications, acknowledgments, and contact details. + + First, we present some general statistics about the software identified for Exa-MA that will present some benchmarking results. + Other software (new or existing) will be included in the future version of this document. + + \paragraph{Architectures} + The following pie chart~\ref{fig:arch} shows the distribution of hardware architectures used. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange}, sum=auto]{13/CPU, 7/GPU} +\end{tikzpicture} +\caption{Distribution of hardware architectures} +\label{fig:arch} +\end{figure} + + \paragraph{Programming Languages} + The following pie chart~\ref{fig:languages} shows the distribution of programming languages used, highlighting the variety of computational solutions employed. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange, yellow, lime, skyblue}, sum=auto]{15/C++, 1/C\#, 3/C, 4/Fortran, 4/Python} +\end{tikzpicture} +\caption{Distribution of programming languages} +\label{fig:languages} +\end{figure} + + \paragraph{Parallelism Technology} + The pie chart~\ref{fig:parallelism} below represents the parallelism techniques used in Exa-MA software selected for this document. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange, yellow, lime, skyblue, pink}, sum=auto]{7/Multithread, 13/MPI, 6/GPU, 1/Parallelism - C++, 1/Task based, 1/Chapel} +\end{tikzpicture} +\caption{Distribution of parallelism technologies} +\label{fig:parallelism} +\end{figure} + + \paragraph{Data Formats} + The chart~\ref{fig:data} shows the supported data formats, for flexibility and compatibility in data handling, supported by Exa-MA software selected for this document. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange, yellow, lime, skyblue, pink, cyan, magenta, peach, lavender}, sum=auto]{2/XML, 5/HDF5, 2/JSON, 2/Ensight, 5/None, 1/YAML, 1/Data-management system, 6/VTK, 6/in-house format, 4/Gmsh and associated formats, 2/MED, 1/MFront} +\end{tikzpicture} +\caption{Distribution of data formats} +\label{fig:data} +\end{figure} + + \paragraph{DevOps - CI/CD} + The pie chart~\ref{fig:devops-cicd} below displays the support of continuous integration and deployment practices as well as continuous benchmarking, showcasing systematic software updates, quality maintenance and performance regression. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange, yellow, lime}, sum=auto]{11/Continuous Integration, 1/Continuous Benchmarking, 1/Continuous Delivery, 4/None} +\end{tikzpicture} +\caption{Distribution of DevOps CI/CD/CD} +\label{fig:devops-cicd} +\end{figure} + + \paragraph{DevOps - Packaging} + The next chart~\ref{fig:devops-packaging} shows different packaging methods used, which help in the distribution and management of software. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange, yellow, lime, skyblue, pink}, sum=auto]{10/None, 5/Debian-based, 2/Fedora, 2/Spack, 1/GUIX, 1/Other} +\end{tikzpicture} +\caption{Distribution of DevOps Packaging} +\label{fig:devops-packaging} +\end{figure} + + \paragraph{DevOps - Containers} + The pie chart~\ref{fig:devops-containers} displays the use of container technologies, which help encapsulate the software to run reliably in various environments. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange, yellow}, sum=auto]{12/None, 2/Apptainer/Singularity, 2/Docker} +\end{tikzpicture} +\caption{Distribution of DevOps Containers} +\label{fig:devops-containers} +\end{figure} + + \paragraph{DevOps - Testing} + The following pie chart~\ref{fig:devops-testing} details the testing practices adopted, illustrating the commitment to software reliability and functionality. + \begin{figure}[H] +\centering +\begin{tikzpicture} +\pie[text=legend, color={red, orange, yellow, lime}, sum=auto]{8/Unit, 7/Verification, 3/Validation, 6/None} +\end{tikzpicture} +\caption{Distribution of DevOps Testing} +\label{fig:devops-testing} +\end{figure} \input{software/arcane-framework/arcane-framework.tex} \input{software/cgal/cgal.tex} \input{software/composyx/composyx.tex} \input{software/feelpp/feelpp.tex} \input{software/freefempp/freefempp.tex} -\input{software/hpddm/hpddm.tex} \input{software/hawen/hawen.tex} +\input{software/hpdomain-decomposition-methods/hpdomain-decomposition-methods.tex} +\input{software/mahyco/mahyco.tex} \input{software/manta/manta.tex} \input{software/mmg-parmmg/mmg-parmmg.tex} -\input{software/mahyco/mahyco.tex} +\input{software/pbb/pbb.tex} \input{software/samurai/samurai.tex} \input{software/scimba/scimba.tex} \input{software/trust-platform/trust-platform.tex} -\input{software/uranie/uranie.tex} \input{software/zellij/zellij.tex} -\input{software/pbb/pbb.tex} diff --git a/exa-ma-d7.1.tex b/exa-ma-d7.1.tex index 0b5dfec..d75c641 100644 --- a/exa-ma-d7.1.tex +++ b/exa-ma-d7.1.tex @@ -16,6 +16,19 @@ \usepackage{standalone} \usepackage[printonlyused]{acronym} \usepackage{import} +\usepackage{booktabs} % For nicer tables +\usepackage{geometry} +\usepackage{tabularx} +\usepackage{pgf-pie} % For pie charts +\usepackage{tikz} % Required for drawing graphics +\usepackage{float} % Required for controlling the position of objects +\definecolor{lightblue}{RGB}{173,216,230} +\definecolor{darkgreen}{RGB}{0,100,0} +\definecolor{pink}{RGB}{255,192,203} +\definecolor{lime}{RGB}{210, 250, 100} +\definecolor{skyblue}{RGB}{135, 206, 235} +\definecolor{peach}{RGB}{255, 229, 180} +\definecolor{lavender}{RGB}{230, 190, 255} \definecolor{CustomBlue}{rgb}{0.25, 0.41, 0.88} % RoyalBlue \hypersetup{ diff --git a/exama-software.xlsx b/exama-software.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..294bc42c1633e6751476c19ded9274d10c027a4a GIT binary patch literal 213138 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�BW)tE)=4vqib{5KRK2-M?1f3M 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 rr3?r0z7|-3_)R;x?p0(tP {res}") + + return res if res else 'None' # Return 'None' if no keywords found + +def check_packaging(entry): + package_keywords = ['Packages - Debian', 'Packages - Ubuntu', 'Packages - Fedora', + 'Packages - GUIX-HPC', 'Packages - Spack', 'Packages - Other'] + if (entry['DevOps'] == 'None') or pd.isnull(entry['DevOps']): + return 'None' + do = entry['DevOps'].replace('\n', ' ') # Clean up the string + found_keywords = [keyword for keyword in package_keywords if keyword in do] + res = ', '.join(found_keywords.replace('Packages - ', '') for found_keywords in found_keywords) + #print(f"{entry['Software']} : {do} --> {res}") + return res if res else 'None' + + +def check_containers(entry): + container_keywords = ['Container - Docker', 'Container - Singularity', + 'Container - Apptainer', 'Container - Other'] + if (entry['DevOps'] == 'None') or pd.isnull(entry['DevOps']): + return 'None' + do = entry['DevOps'].replace('\n', ' ') # Clean up + found_keywords = [keyword for keyword in container_keywords if keyword in do] + res = ', '.join(found_keywords.replace('Container - ', '') for found_keywords in found_keywords) + #print(f"{entry['Software']} : {do} --> {res}") + return res if res else 'None' + + +def check_tests(entry): + test_keywords = ['Test - Unit', 'Test - Verification', + 'Test - Validation', 'Test - Fuzzy', 'Test - Functional'] + if (entry['DevOps'] == 'None') or pd.isnull(entry['DevOps']): + return 'None' + do = entry['DevOps'].replace('\n', ' ') # Clean up + found_keywords = [keyword for keyword in test_keywords if keyword in do] + res = ', '.join(found_keywords.replace('Test - ', '') for found_keywords in found_keywords) + #print(f"{entry['Software']} : {do} --> {res}") + return res if res else 'None' + + +def generate_latex_table(desc, input_string): + # Split the input string by comma + items = [item.strip() for item in input_string.split(',')] + + # Start the LaTeX table + latex_code = '\\begin{tabular}{!{\\color{numpexgray}\\vrule}p{.25\\linewidth}!{\\color{numpexgray}\\vrule}p{.6885\\linewidth}!{\\color{numpexgray}\\vrule}}\n' + latex_code += ' \n' + latex_code += ' \\rowcolor{numpexgray}{\\rule{0pt}{2.5ex}\\color{white}\\bf' + f' {desc}' + '} & {\\rule{0pt}{2.5ex}\\color{white}\\bf Short Description }\\\\ \n' + latex_code += ' \n' + + # Add each item as a new row + for index,item in enumerate(items): + if index % 2 == 0: + latex_code += '\\rowcolor{white}'+f' {item} & provide short description here \\\\\n' + else: + latex_code += '\\rowcolor{numpexlightergray}' + \ + f' {item} & provide short description here \\\\\n' +# latex_code += ' \\bottomrule\n' + + # End the LaTeX table + latex_code += '\\end{tabular}' + + return latex_code + + +def generate_latex_table_simple(input_string): + if pd.isnull(input_string): + items = ['None'] + else: + items = [item.strip() for item in input_string.split(',')] + items.sort() + latex_code = '\\begin{tabular}{l}\n' + for index, item in enumerate(items): + latex_code += f'{item}\\\\\n' + latex_code += '\\end{tabular}' + + return latex_code + +# Apply functions to create new columns based on 'DevOps' +benchmarked_software['CI'] = benchmarked_software.apply(lambda row: check_ci(row), axis=1) +benchmarked_software['Packaging'] = benchmarked_software.apply(lambda row: check_packaging(row), axis=1) +benchmarked_software['Containers'] = benchmarked_software.apply(lambda row: check_containers(row), axis=1) +benchmarked_software['Tests'] = benchmarked_software.apply(lambda row: check_tests(row), axis=1) + + +def normalize_archs(arch_string): + # Define a dictionary to map various input forms to standardized forms + arch_map = { + 'CPU': ['CPU'], + 'GPU': ['GPU'], + 'Hybrid': ['HYBRID'], + 'Indirect': ['INDIRECT'], + 'Not Yet Benchmarked': ['NOT YET'] + } + + # Split the string by commas and strip spaces + archs = [arch.strip().upper() for arch in arch_string.split(',')] + normalized_archs = [] + + # Normalize each architecture entry + for arch in archs: + found = False + # Check each category for a match + for standard, variations in arch_map.items(): + if arch in variations: + normalized_archs.append(standard) + found = True + break + # If no predefined category matches, classify as 'Unknown' + if not found: + normalized_archs.append('Unknown') + + return normalized_archs + +def normalize_languages(lang_string): + # Split the string by commas and strip spaces + languages = [lang.strip() for lang in lang_string.split(',')] + # Normalize C++ entries + normalized_languages = [] + for lang in languages: + if 'C++' in lang: + # Consolidate all C++ variations + normalized_languages.append('C++') + else: + normalized_languages.append(lang) + return normalized_languages + + +def normalize_data_formats(data_string): + # Split the string by commas and strip spaces + if pd.isnull(data_string): + return ['None'] + formats = [format.strip() for format in data_string.split(',')] + normalized_formats = [] + for format in formats: + # Normalize specific formats + if 'JSON' in format.upper(): + normalized_formats.append('JSON') + elif 'XML' in format.upper(): + normalized_formats.append('XML') + elif 'YAML' in format.upper(): + normalized_formats.append('YAML') + elif 'HDF5' in format.upper(): + normalized_formats.append('HDF5') + elif 'DATABASE' in format.upper(): + normalized_formats.append('Database') + elif 'DATA-MANAGEMENT' in format.upper(): + normalized_formats.append('Data-management system') + elif 'IN-HOUSE' in format.upper(): + normalized_formats.append('in-house format') + elif 'VTK' in format.upper(): + normalized_formats.append('VTK') + elif 'ENSIGHT' in format.upper(): + normalized_formats.append('Ensight') + elif 'GMSH' in format.upper(): + normalized_formats.append('Gmsh and associated formats') + elif 'MED' in format.upper(): + normalized_formats.append('MED') + elif 'ADIOS' in format.upper(): + normalized_formats.append('Adios') + elif 'ASCII' in format.upper(): + normalized_formats.append('ASCII') + elif 'ROOT' in format.upper(): + normalized_formats.append('ROOT') + elif 'SQL' in format.upper(): + normalized_formats.append('SQL') + elif 'NETCDF' in format.upper(): + normalized_formats.append('netcdf') + elif 'MFRONT' in format.upper(): + normalized_formats.append('MFront') + else: + normalized_formats.append(format) # Default case if no matches + return normalized_formats + + +def normalize_parallelism(parallelism_string): + # Split the string by commas and strip spaces + technologies = [tech.strip() for tech in parallelism_string.split(',')] + normalized_technologies = [] + for tech in technologies: + # Normalize specific parallelism technologies + if 'MPI' in tech.upper(): + normalized_technologies.append('MPI') + elif 'MULTITHREAD' in tech.upper(): + normalized_technologies.append('Multithread') + elif 'CHAPEL' in tech.upper(): + normalized_technologies.append('Chapel') + elif 'GPU' in tech.upper(): # Capture all GPU-related entries + normalized_technologies.append('GPU') + elif 'TASK BASED' in tech.upper(): # Generalize all task-based parallelism + normalized_technologies.append('Task based') + elif 'C++' in tech.upper() and 'PARALLELISM' in tech.upper(): + normalized_technologies.append('Parallelism - C++') + else: + normalized_technologies.append(tech) # Default case if no matches + return normalized_technologies + + +def normalize_devops(devops_string): + categories = { + 'CI/CD': [], + 'Packaging': [], + 'Testing': [], + 'Containers': [] + } + if pd.isnull(devops_string): + return { + 'CI/CD': ['None'], + 'Packaging': ['None'], + 'Testing': ['None'], + 'Containers': ['None'] + } + entries = [entry.strip() for entry in devops_string.split(',')] + + for entry in entries: + if 'Continuous' in entry: + categories['CI/CD'].append(entry) + elif 'Container' in entry: + if 'Apptainer' in entry or 'Singularity' in entry: + categories['Containers'].append('Apptainer/Singularity') + else: + categories['Containers'].append(entry.split('-')[1].strip()) + elif 'Packages' in entry: + # Group Debian and Ubuntu into Debian-based packaging + if 'Debian' in entry or 'Ubuntu' in entry: + categories['Packaging'].append('Debian-based') + else: + categories['Packaging'].append(entry.split('-')[1].strip()) + elif 'Test' in entry: + print(entry) + categories['Testing'].append(entry.split('-')[1].strip()) + if not categories['CI/CD']: + categories['CI/CD'].append('None') + if not categories['Packaging']: + categories['Packaging'].append('None') + if not categories['Containers']: + categories['Containers'].append('None') + if not categories['Testing']: + categories['Testing'].append('None') + + return categories + +stats_software=benchmarked_software + +stats_software['Benchmarked'] = stats_software['Benchmarked'].apply( + lambda x: ', '.join(normalize_archs(x))) +# Apply normalization to the Languages column +stats_software['Languages'] = stats_software['Languages'].apply( + lambda x: ', '.join(normalize_languages(x))) +stats_software['Parallelism'] = stats_software['Parallelism'].apply( + lambda x: ', '.join(normalize_parallelism(x))) +stats_software['Data'] = stats_software['Data'].apply( + lambda x: ', '.join(normalize_data_formats(x))) +stats_software['DevOps CI/CD'] = stats_software['DevOps'].apply( + lambda x: ', '.join(normalize_devops(x)['CI/CD'])) +stats_software['DevOps Packaging'] = stats_software['DevOps'].apply( + lambda x: ', '.join(normalize_devops(x)['Packaging'])) +stats_software['DevOps Containers'] = stats_software['DevOps'].apply( + lambda x: ', '.join(normalize_devops(x)['Containers'])) +stats_software['DevOps Testing'] = stats_software['DevOps'].apply( + lambda x: ', '.join(normalize_devops(x)['Testing'])) + +def count_frequencies(df,column,debug=False): + items = [] + df[column].dropna().apply(lambda x: items.extend(x.split(', '))) + if debug: + print(items) + return Counter(items) + +archs_freq = count_frequencies(stats_software,'Benchmarked') +languages_freq = count_frequencies(stats_software,'Languages') +parallelism_freq = count_frequencies(stats_software,'Parallelism') +data_freq = count_frequencies(stats_software,'Data') +devops_cicd_freq = count_frequencies(stats_software, 'DevOps CI/CD') +devops_packaging_freq = count_frequencies(stats_software, 'DevOps Packaging') +devops_containers_freq = count_frequencies(stats_software, 'DevOps Containers') +devops_testing_freq = count_frequencies(stats_software, 'DevOps Testing',debug=True) + + +def tikz_pie_chart(data, title, caption, label): + colors = [ + "red", # Bright enough to contrast well with black + "orange", # Good contrast with black + "yellow", # Excellent for black text + "lime", # Lighter shade of green + "skyblue", # A lighter blue that contrasts well with black + "pink", # Naturally light and offers good readability + "cyan", # Light and vibrant, contrasting with black + "magenta", # Bright and pops against black + "peach", # Soft and visible against black + "lavender" # Light and easy on the eyes with black text + ] + chart = "\\begin{figure}[H]\n\\centering\n\\begin{tikzpicture}\n" + chart += "\\pie[text=legend, color={" + chart += ", ".join(colors[:len(data)]) + "}, sum=auto]" + chart += "{" + chart += ", ".join([f"{value}/{key}" for key, value in data.items()]) + chart += "}\n\\end{tikzpicture}\n" + chart += f"\\caption{{{caption}}}\n" + chart += f"\\label{{fig:{label}}}\n" + chart += "\\end{figure}\n" + return chart + +arch_chart = tikz_pie_chart(archs_freq, "Architectures", caption="Distribution of hardware architectures", label="arch") +languages_chart = tikz_pie_chart(languages_freq, "Languages", caption="Distribution of programming languages", label="languages") +parallelism_chart = tikz_pie_chart(parallelism_freq, "Parallelism", caption="Distribution of parallelism technologies", label="parallelism") +data_chart = tikz_pie_chart(data_freq, "Data", caption="Distribution of data formats", label="data") +devops_cicd_chart = tikz_pie_chart( + devops_cicd_freq, "DevOps", caption="Distribution of DevOps CI/CD/CD", label="devops-cicd") +devops_packaging_chart = tikz_pie_chart( + devops_packaging_freq, "DevOps", caption="Distribution of DevOps Packaging", label="devops-packaging") +devops_containers_chart = tikz_pie_chart( + devops_containers_freq, "DevOps", caption="Distribution of DevOps Containers", label="devops-containers") +devops_testing_chart = tikz_pie_chart( + devops_testing_freq, "DevOps", caption="Distribution of DevOps Testing", label="devops-testing") + + +#for wp in range(1,8): +# df[f'Benchmarked in WP{wp}'] = df.apply( +# lambda row: is_benchmarked_in(f'WP{wp}', row), axis=1) +# b_df=df[df[f'Benchmarked in WP{wp}'] == True]['Software'] +# print(f"WP{wp} : {b_df.values}") + +#print("feel++:", is_benchmarked_in('WP1',df[df['Software']=='Feel++'])) +import json +for index,software in benchmarked_software.iterrows(): + + software_json = json.loads(software.to_json()) + + print(software_json) # Sample data, replace with your actual data source software_list = [ @@ -162,34 +540,119 @@ with open(f'chapters/software.tex', 'w') as software_index: software_index.write('\clearpage\n\chapter{Software}\n') software_index.write('\label{sec:software}\n') - software_index.write('This chapter presents the software developed within Exa-MA. Each software is described in a dedicated section, with a focus on the features and the general mathematics, the main functionalities, the relevant publications and acknowledgments, and the contact persons.\n') + software_index.write( + """ + This chapter presents the software developed within Exa-MA, focusing on features, mathematics, functionalities, publications, acknowledgments, and contact details. + + First, we present some general statistics about the software identified for Exa-MA that will present some benchmarking results. + Other software (new or existing) will be included in the future version of this document. + """) + + software_index.write( + """ + \paragraph{Architectures} + The following pie chart~\\ref{fig:arch} shows the distribution of hardware architectures used. + """) + software_index.write(arch_chart) + # Programming Languages Pie Chart + software_index.write( + """ + \paragraph{Programming Languages} + The following pie chart~\\ref{fig:languages} shows the distribution of programming languages used, highlighting the variety of computational solutions employed. + """) + software_index.write(languages_chart) + + # Parallelism Techniques Pie Chart + software_index.write( + """ + \paragraph{Parallelism Technology} + The pie chart~\\ref{fig:parallelism} below represents the parallelism techniques used in Exa-MA software selected for this document. + """) + software_index.write(parallelism_chart) + + # Data Formats Pie Chart + software_index.write( + """ + \paragraph{Data Formats} + The chart~\\ref{fig:data} shows the supported data formats, for flexibility and compatibility in data handling, supported by Exa-MA software selected for this document. + """) + software_index.write(data_chart) + + # DevOps - CI/CD Pie Chart + software_index.write( + """ + \paragraph{DevOps - CI/CD} + The pie chart~\\ref{fig:devops-cicd} below displays the support of continuous integration and deployment practices as well as continuous benchmarking, showcasing systematic software updates, quality maintenance and performance regression. + """) + software_index.write(devops_cicd_chart) + + # DevOps - Packaging Pie Chart + software_index.write( + """ + \paragraph{DevOps - Packaging} + The next chart~\\ref{fig:devops-packaging} shows different packaging methods used, which help in the distribution and management of software. + """) + software_index.write(devops_packaging_chart) + + # DevOps - Containers Pie Chart + software_index.write( + """ + \paragraph{DevOps - Containers} + The pie chart~\\ref{fig:devops-containers} displays the use of container technologies, which help encapsulate the software to run reliably in various environments. + """) + software_index.write(devops_containers_chart) + + # DevOps - Testing Pie Chart + software_index.write( + """ + \paragraph{DevOps - Testing} + The following pie chart~\\ref{fig:devops-testing} details the testing practices adopted, illustrating the commitment to software reliability and functionality. + """) + software_index.write(devops_testing_chart) + # sort software_list with respect to name in lexical order software_list = sorted(software_list, key=lambda x: x['name']) - for software in software_list: - desc = template_desc.render(software=software) - name = software['name'] - software['desc'] = desc - prefix = name.replace('+', 'p').replace(' ','-').lower() + for index,software in benchmarked_software.iterrows(): + software_json = json.loads(software.to_json()) + software_json['name'] = software['Software'] + for column_name in ['Emails','Consortium', 'Partner', 'License', 'Languages', 'Benchmarked', 'Parallelism', 'Data', 'DevOps', 'CI', 'Packaging', 'Containers', 'Tests', 'Resilience','Interfaces']: + software_json[column_name] = generate_latex_table_simple( + input_string=software[column_name]) + + desc = template_desc.render(software= software_json) + name = software['Software'] + prefix = software_prefix(software) os.makedirs(f'software/{prefix}', exist_ok=True) - software['prefix'] = prefix + software_json['prefix'] = prefix software_index.write('\input{software/'+f'{prefix}/{prefix}.tex'+'}\n') + with open(f'software/{prefix}/{prefix}.tex', 'w') as f: f.write(desc) # Loop through all categories for the current software - for category in software['categories']: - wp = template_wp.render(software=software,wp=category) - - # Ensure the category has an entry in the dictionary - if category not in latex_content_per_category: - latex_content_per_category[category] = [] - # Append the rendered content to the category - software['wp'] = wp - #print(software['rendered']) - latex_content_per_category[category].append(software) - os.makedirs(f'software/{prefix}/{category}', exist_ok=True) - with open(f'software/{prefix}/{category}/{category}.tex', 'w') as f: - f.write(wp) - print(f"- Generated LaTeX file for {name} in category {category}: software/{prefix}/{category}/{category}.tex") + for wpindex in range(1,7): + category = f'WP{wpindex}' + if is_benchmarked_in(category,software): + software_json = json.loads(software.to_json()) + software_json['name'] = software['Software'] + software_json['WP'] = generate_latex_table( + desc="Features", input_string=software[category]) + for column_name in ['Emails', 'Consortium', 'Partner', 'License', 'Languages', 'Benchmarked', 'Parallelism', 'Data', 'DevOps', 'CI', 'Packaging', 'Containers', 'Tests', 'Resilience', 'Interfaces']: + software_json[column_name] = generate_latex_table_simple( + input_string=software[column_name]) + software_json['Emails'] = generate_latex_table_simple( + input_string=software['Emails']) + wp = template_wp.render(software=software_json,wp=category) + # Ensure the category has an entry in the dictionary + if category not in latex_content_per_category: + latex_content_per_category[category] = [] + # Append the rendered content to the category + software_json['wp'] = wp + #print(software['rendered']) + latex_content_per_category[category].append(software_json) + os.makedirs(f'software/{prefix}/{category}', exist_ok=True) + with open(f'software/{prefix}/{category}/{category}.tex', 'w') as f: + f.write(wp) + print(f"- Generated LaTeX file for {name} in category {category}: software/{prefix}/{category}/{category}.tex") # sort latex_content_per_category with respect to category in lexical order @@ -202,10 +665,14 @@ main_index.write('\chapter{'+f'{WPs[category]}'+'}\n') main_index.write('\clearpage\n\subimport{'+f'./{category}'+'}{00-index}\n\n') with open(f'chapters/{category}/00-index.tex', 'w') as index: - for software in software_list: - name = software['name'] - prefix = software['prefix'] - content_list = software['wp'] + for i,software in benchmarked_software.iterrows(): + #software_json = software.to_json() + #name = software['Software'] + + prefix = software_prefix(software) + #content_list = software['wp'] # include the software in the category file - index.write('\input{software/'+f'{prefix}/{category}/{category}.tex'+'}\n') + if is_benchmarked_in(category,software): + index.write('\input{software/'+f'{prefix}/{category}/{category}.tex'+'}\n') + #index.write('\input{software/'+f'{prefix}/{category}/{category}.tex'+'}\n') diff --git a/requirements.txt b/requirements.txt index 1c579e7..a89d2a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,4 @@ -jinja2 \ No newline at end of file +jinja2 +openpyxl +pandas +tabulate \ No newline at end of file diff --git a/software/arcane-framework/WP3/WP3.tex b/software/arcane-framework/WP3/WP3.tex new file mode 100644 index 0000000..190975a --- /dev/null +++ b/software/arcane-framework/WP3/WP3.tex @@ -0,0 +1,92 @@ +\section{Software: Arcane Framework} +\label{sec:WP3:Arcane Framework:software} + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +CEA\\ +IFPEN\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +lydie.grospellier@cea.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/arcaneframework/framework}{https://github.com/arcaneframework/framework} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: apache-2\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: Arcane Framework Information} +\end{table} + +\subsection{Software Overview} +\label{sec:WP3:Arcane Framework:summary} + +Provide a brief overview of the software with respect to WP3. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} multiphysics coupling & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: Arcane Framework Features} +\end{table} + + +\subsection{Parallel Capabilities} +\label{sec:WP3:Arcane Framework:performances} + + +\begin{itemize} + \item describe the parallel programming environment : MPI, OpenMP, CUDA, OpenACC, etc. + \item describe the parallel computation environment: type of architecture and super computer used. + \item describe the parallel capabilities of the software + \item \textbf{Scalability:} Describe the general scalability properties of the software + \item \textbf{Integration with Other Systems:} Describe how the software integrates with other numerical libraries and middleware in the Exa-MA framework. +\end{itemize} + +\subsection{Initial Performance Metrics} +\label{sec:WP3:Arcane Framework:metrics} + +In this section, provide a summary of the initial performance metrics of the software with respect to WP3. +You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. + + + +\subsubsection{Benchmark \#1} +\begin{itemize} + \item describe the benchmark + \item \textbf{Benchmarking Tools Used:} Describe the tools used for parallel benchmarking and the metrics mesured + \item \textbf{Results Summary:} Results summary not available. + \item \textbf{Challenges Identified:} No challenges identified. +\end{itemize} + +\subsection{12 months roadmap} +\label{sec:WP3:Arcane Framework:roadmap} + +Describe the planned improvements for the software in the context of WP3 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/arcane-framework/arcane-framework.tex b/software/arcane-framework/arcane-framework.tex index 7611d0b..6c6b470 100644 --- a/software/arcane-framework/arcane-framework.tex +++ b/software/arcane-framework/arcane-framework.tex @@ -3,11 +3,37 @@ \section{Software: Arcane Framework} -\begin{itemize} - \item \textbf{Contact Email(s):} lydie.grospellier@cea.fr - \item \textbf{Supported Architecture(s):} HYBRID - \item \textbf{Repository Link:} \href{https://github.com/arcaneframework/framework}{https://github.com/arcaneframework/framework} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +CEA\\ +IFPEN\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +lydie.grospellier@cea.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/arcaneframework/framework}{https://github.com/arcaneframework/framework} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: apache-2\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Arcane Framework Information} +\end{table} \subsection{Software summary} \label{sec:Arcane Framework:summary} @@ -19,19 +45,84 @@ \subsection{Purpose} \label{sec:Arcane Framework:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Arcane Framework:environment_capabilities} + + +The following table summarizes these aspects for Arcane Framework, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +C\#\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +GPU\\ +MPI\\ +Multithread\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +Ensight\\ +HDF5\\ +JSON\\ +XML\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +Checkpoint restart\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +Verification\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +None\\ +\end{tabular} & List of software Arcane Framework has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Arcane Framework programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:Arcane Framework:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:Arcane Framework:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::Arcane Framework:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/cgal/WP1/WP1.tex b/software/cgal/WP1/WP1.tex index d3a6cfc..31d4e9c 100644 --- a/software/cgal/WP1/WP1.tex +++ b/software/cgal/WP1/WP1.tex @@ -1,17 +1,62 @@ \section{Software: CGAL} \label{sec:WP1:CGAL:software} -\begin{itemize} - \item \textbf{Contact Email(s):} pierre.alliez@inria.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/CGAL}{https://github.com/CGAL} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria CA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +pierre.alliez@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/CGAL}{https://github.com/CGAL} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP1: CGAL Information} +\end{table} \subsection{Software Overview} \label{sec:WP1:CGAL:summary} Provide a brief overview of the software with respect to WP1. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} unstructured mesh & provide short description here \\ +\end{tabular} + } + } + \caption{WP1: CGAL Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP1:CGAL:performances} diff --git a/software/cgal/cgal.tex b/software/cgal/cgal.tex index f14a5a0..97bc4a1 100644 --- a/software/cgal/cgal.tex +++ b/software/cgal/cgal.tex @@ -3,11 +3,36 @@ \section{Software: CGAL} -\begin{itemize} - \item \textbf{Contact Email(s):} pierre.alliez@inria.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/CGAL}{https://github.com/CGAL} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria CA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +pierre.alliez@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/CGAL}{https://github.com/CGAL} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{CGAL Information} +\end{table} \subsection{Software summary} \label{sec:CGAL:summary} @@ -19,19 +44,80 @@ \subsection{Purpose} \label{sec:CGAL:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::CGAL:environment_capabilities} + + +The following table summarizes these aspects for CGAL, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +Multithread\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +None\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +Debian\\ +Fedora\\ +Spack\\ +Ubuntu\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +None\\ +\end{tabular} & List of software CGAL has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{CGAL programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:CGAL:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:CGAL:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::CGAL:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/composyx/WP3/WP3.tex b/software/composyx/WP3/WP3.tex index 33369f8..be27fc9 100644 --- a/software/composyx/WP3/WP3.tex +++ b/software/composyx/WP3/WP3.tex @@ -1,17 +1,64 @@ \section{Software: Composyx} \label{sec:WP3:Composyx:software} -\begin{itemize} - \item \textbf{Contact Email(s):} gilles.marait@inria.fr - \item \textbf{Supported Architecture(s):} HYBRID - \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/composyx/composyx}{https://gitlab.inria.fr/composyx/composyx} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +gilles.marait@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.inria.fr/composyx/composyx}{https://gitlab.inria.fr/composyx/composyx} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: Cecill-*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: Composyx Information} +\end{table} \subsection{Software Overview} \label{sec:WP3:Composyx:summary} Provide a brief overview of the software with respect to WP3. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} direct solver & provide short description here \\ +\rowcolor{numpexlightergray} "singular value decomposition (SVD) and eigenvalue solver" & provide short description here \\ +\rowcolor{white} krylov solver & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: Composyx Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP3:Composyx:performances} diff --git a/software/composyx/composyx.tex b/software/composyx/composyx.tex index fca7f21..ec99b8f 100644 --- a/software/composyx/composyx.tex +++ b/software/composyx/composyx.tex @@ -1,11 +1,38 @@ \section{Software: Composyx} \label{sec:Composyx:software} -\begin{itemize} - \item \textbf{Contact Email(s):} gilles.marait@inria.fr - \item \textbf{Supported Architecture(s):} HYBRID - \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/composyx/composyx}{https://gitlab.inria.fr/composyx/composyx} -\end{itemize} + + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +gilles.marait@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.inria.fr/composyx/composyx}{https://gitlab.inria.fr/composyx/composyx} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: Cecill-*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Composyx Information} +\end{table} \subsection{Software summary} \label{sec:Composyx:summary} @@ -17,19 +44,84 @@ \subsection{Purpose} \label{sec:Composyx:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Composyx:environment_capabilities} + + +The following table summarizes these aspects for Composyx, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C\\ +C++\\ +Fortran\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +GPU\\ +MPI\\ +Multithread\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +None\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +GUIX-HPC\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Verification\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +Singularity\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +MUMPS\\ +PaStIX\\ +Scotch\\ +qr\_mumps\\ +\end{tabular} & List of software Composyx has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Composyx programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:Composyx:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:Composyx:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::Composyx:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/feelpp/WP1/WP1.tex b/software/feelpp/WP1/WP1.tex index b589065..7421044 100644 --- a/software/feelpp/WP1/WP1.tex +++ b/software/feelpp/WP1/WP1.tex @@ -1,17 +1,75 @@ \section{Software: Feel++} \label{sec:WP1:Feel++:software} -\begin{itemize} - \item \textbf{Contact Email(s):} vincent.chabannes@cemosis.fr, christophe.prudhomme@cemosis.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Feel++ Consortium\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CNRS\\ +Inria Grenoble\\ +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +christophe.prudhomme@cemosis.fr\\ +vincent.chabannes@cemosis.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP1: Feel++ Information} +\end{table} \subsection{Software Overview} \label{sec:WP1:Feel++:summary} Provide a brief overview of the software with respect to WP1. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} unstructured mesh & provide short description here \\ +\rowcolor{numpexlightergray} mesh adaptation & provide short description here \\ +\rowcolor{white} cG & provide short description here \\ +\rowcolor{numpexlightergray} dG/hdG & provide short description here \\ +\rowcolor{white} parallel in time & provide short description here \\ +\rowcolor{numpexlightergray} multiphysics coupling & provide short description here \\ +\rowcolor{white} multiscale coupling & provide short description here \\ +\rowcolor{numpexlightergray} inhouse & provide short description here \\ +\rowcolor{white} interface & provide short description here \\ +\rowcolor{numpexlightergray} finite element & provide short description here \\ +\rowcolor{white} spectral element & provide short description here \\ +\end{tabular} + } + } + \caption{WP1: Feel++ Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP1:Feel++:performances} diff --git a/software/feelpp/WP2/WP2.tex b/software/feelpp/WP2/WP2.tex index 2d56c68..6819af3 100644 --- a/software/feelpp/WP2/WP2.tex +++ b/software/feelpp/WP2/WP2.tex @@ -1,17 +1,70 @@ \section{Software: Feel++} \label{sec:WP2:Feel++:software} -\begin{itemize} - \item \textbf{Contact Email(s):} vincent.chabannes@cemosis.fr, christophe.prudhomme@cemosis.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Feel++ Consortium\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CNRS\\ +Inria Grenoble\\ +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +christophe.prudhomme@cemosis.fr\\ +vincent.chabannes@cemosis.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP2: Feel++ Information} +\end{table} \subsection{Software Overview} \label{sec:WP2:Feel++:summary} Provide a brief overview of the software with respect to WP2. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} "ROM-DA: GEIM PBDW & provide short description here \\ +\rowcolor{numpexlightergray} ..." & provide short description here \\ +\rowcolor{white} ROM: NIRB & provide short description here \\ +\rowcolor{numpexlightergray} "ROM: RB & provide short description here \\ +\rowcolor{white} POD & provide short description here \\ +\rowcolor{numpexlightergray} ..." & provide short description here \\ +\end{tabular} + } + } + \caption{WP2: Feel++ Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP2:Feel++:performances} diff --git a/software/feelpp/WP3/WP3.tex b/software/feelpp/WP3/WP3.tex index 607c3c5..df1188c 100644 --- a/software/feelpp/WP3/WP3.tex +++ b/software/feelpp/WP3/WP3.tex @@ -1,17 +1,66 @@ \section{Software: Feel++} \label{sec:WP3:Feel++:software} -\begin{itemize} - \item \textbf{Contact Email(s):} vincent.chabannes@cemosis.fr, christophe.prudhomme@cemosis.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Feel++ Consortium\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CNRS\\ +Inria Grenoble\\ +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +christophe.prudhomme@cemosis.fr\\ +vincent.chabannes@cemosis.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: Feel++ Information} +\end{table} \subsection{Software Overview} \label{sec:WP3:Feel++:summary} Provide a brief overview of the software with respect to WP3. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} domain decomposition methods & provide short description here \\ +\rowcolor{numpexlightergray} algebraic multiphysics coupling & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: Feel++ Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP3:Feel++:performances} diff --git a/software/feelpp/WP4/WP4.tex b/software/feelpp/WP4/WP4.tex index e818a43..65d7e7d 100644 --- a/software/feelpp/WP4/WP4.tex +++ b/software/feelpp/WP4/WP4.tex @@ -1,17 +1,65 @@ \section{Software: Feel++} \label{sec:WP4:Feel++:software} -\begin{itemize} - \item \textbf{Contact Email(s):} vincent.chabannes@cemosis.fr, christophe.prudhomme@cemosis.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Feel++ Consortium\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CNRS\\ +Inria Grenoble\\ +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +christophe.prudhomme@cemosis.fr\\ +vincent.chabannes@cemosis.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP4: Feel++ Information} +\end{table} \subsection{Software Overview} \label{sec:WP4:Feel++:summary} Provide a brief overview of the software with respect to WP4. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} stochastic data assimilation: ensemble & provide short description here \\ +\end{tabular} + } + } + \caption{WP4: Feel++ Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP4:Feel++:performances} diff --git a/software/feelpp/WP5/WP5.tex b/software/feelpp/WP5/WP5.tex index 9b25179..db78357 100644 --- a/software/feelpp/WP5/WP5.tex +++ b/software/feelpp/WP5/WP5.tex @@ -1,17 +1,65 @@ \section{Software: Feel++} \label{sec:WP5:Feel++:software} -\begin{itemize} - \item \textbf{Contact Email(s):} vincent.chabannes@cemosis.fr, christophe.prudhomme@cemosis.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Feel++ Consortium\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CNRS\\ +Inria Grenoble\\ +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +christophe.prudhomme@cemosis.fr\\ +vincent.chabannes@cemosis.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP5: Feel++ Information} +\end{table} \subsection{Software Overview} \label{sec:WP5:Feel++:summary} Provide a brief overview of the software with respect to WP5. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} Iterative methods & provide short description here \\ +\end{tabular} + } + } + \caption{WP5: Feel++ Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP5:Feel++:performances} diff --git a/software/feelpp/feelpp.tex b/software/feelpp/feelpp.tex index ee1e731..21f5252 100644 --- a/software/feelpp/feelpp.tex +++ b/software/feelpp/feelpp.tex @@ -3,11 +3,39 @@ \section{Software: Feel++} -\begin{itemize} - \item \textbf{Contact Email(s):} vincent.chabannes@cemosis.fr, christophe.prudhomme@cemosis.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Feel++ Consortium\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CNRS\\ +Inria Grenoble\\ +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +christophe.prudhomme@cemosis.fr\\ +vincent.chabannes@cemosis.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/feelpp/feelpp}{https://github.com/feelpp/feelpp} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Feel++ Information} +\end{table} \subsection{Software summary} \label{sec:Feel++:summary} @@ -19,19 +47,103 @@ \subsection{Purpose} \label{sec:Feel++:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Feel++:environment_capabilities} + + +The following table summarizes these aspects for Feel++, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +C++\\ +C++\\ +Python\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +Parallelism - C++\\ +Task based\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +Data-management system\\ +Ensight\\ +Gmsh and associated formats\\ +HDF5\\ +JSON\\ +VTK\\ +VTK\\ +YAML\\ +in-house format\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +Checkpoint restart\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Benchmarking\\ +Continuous Delivery\\ +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +Debian\\ +Fedora\\ +Spack\\ +Ubuntu\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +Validation\\ +Verification\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +Docker\\ +Singularity\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +Dymola/OpenModelica/FMU\\ +HPdomain decomposition methods\\ +MMG/ParMMG\\ +OpenTurns\\ +PETSc\\ +Salome\\ +\end{tabular} & List of software Feel++ has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Feel++ programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:Feel++:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:Feel++:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::Feel++:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/freefempp/WP1/WP1.tex b/software/freefempp/WP1/WP1.tex index 1126842..cf2c0fc 100644 --- a/software/freefempp/WP1/WP1.tex +++ b/software/freefempp/WP1/WP1.tex @@ -1,19 +1,70 @@ -\section{Software: FreeFem++} -\label{sec:WP1:FreeFem++:software} +\section{Software: Freefem++} +\label{sec:WP1:Freefem++:software} -\begin{itemize} - \item \textbf{Contact Email(s):} frederic.hecht@sorbonne-universite.fr, pierre.jolivet@sorbonne-universite.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/FreeFem/FreeFem-sources}{https://github.com/FreeFem/FreeFem-sources} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria PARIS\\ +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +frederic.hecht@sorbonne-universite.fr\\ +pierre-henri.tournier@sorbonne-universite.fr\\ +pierre.jolivet@sorbonne-universite.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/FreeFem/FreeFem-sources}{https://github.com/FreeFem/FreeFem-sources} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP1: Freefem++ Information} +\end{table} \subsection{Software Overview} -\label{sec:WP1:FreeFem++:summary} +\label{sec:WP1:Freefem++:summary} Provide a brief overview of the software with respect to WP1. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} cG & provide short description here \\ +\rowcolor{numpexlightergray} dG/hdG & provide short description here \\ +\rowcolor{white} mesh adaptation & provide short description here \\ +\rowcolor{numpexlightergray} unstructured mesh & provide short description here \\ +\rowcolor{white} multiphysics coupling & provide short description here \\ +\end{tabular} + } + } + \caption{WP1: Freefem++ Features} +\end{table} + + \subsection{Parallel Capabilities} -\label{sec:WP1:FreeFem++:performances} +\label{sec:WP1:Freefem++:performances} \begin{itemize} @@ -25,7 +76,7 @@ \subsection{Parallel Capabilities} \end{itemize} \subsection{Initial Performance Metrics} -\label{sec:WP1:FreeFem++:metrics} +\label{sec:WP1:Freefem++:metrics} In this section, provide a summary of the initial performance metrics of the software with respect to WP1. You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. @@ -41,6 +92,6 @@ \subsubsection{Benchmark \#1} \end{itemize} \subsection{12 months roadmap} -\label{sec:WP1:FreeFem++:roadmap} +\label{sec:WP1:Freefem++:roadmap} Describe the planned improvements for the software in the context of WP1 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/freefempp/WP3/WP3.tex b/software/freefempp/WP3/WP3.tex index 5e7b16f..967e5ce 100644 --- a/software/freefempp/WP3/WP3.tex +++ b/software/freefempp/WP3/WP3.tex @@ -1,19 +1,68 @@ -\section{Software: FreeFem++} -\label{sec:WP3:FreeFem++:software} +\section{Software: Freefem++} +\label{sec:WP3:Freefem++:software} -\begin{itemize} - \item \textbf{Contact Email(s):} frederic.hecht@sorbonne-universite.fr, pierre.jolivet@sorbonne-universite.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/FreeFem/FreeFem-sources}{https://github.com/FreeFem/FreeFem-sources} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria PARIS\\ +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +frederic.hecht@sorbonne-universite.fr\\ +pierre-henri.tournier@sorbonne-universite.fr\\ +pierre.jolivet@sorbonne-universite.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/FreeFem/FreeFem-sources}{https://github.com/FreeFem/FreeFem-sources} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: Freefem++ Information} +\end{table} \subsection{Software Overview} -\label{sec:WP3:FreeFem++:summary} +\label{sec:WP3:Freefem++:summary} Provide a brief overview of the software with respect to WP3. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} domain decomposition methods & provide short description here \\ +\rowcolor{numpexlightergray} algebraic multiphysics coupling & provide short description here \\ +\rowcolor{white} reuse of Krylov subspaces for multiple right-hand sides & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: Freefem++ Features} +\end{table} + + \subsection{Parallel Capabilities} -\label{sec:WP3:FreeFem++:performances} +\label{sec:WP3:Freefem++:performances} \begin{itemize} @@ -25,7 +74,7 @@ \subsection{Parallel Capabilities} \end{itemize} \subsection{Initial Performance Metrics} -\label{sec:WP3:FreeFem++:metrics} +\label{sec:WP3:Freefem++:metrics} In this section, provide a summary of the initial performance metrics of the software with respect to WP3. You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. @@ -41,6 +90,6 @@ \subsubsection{Benchmark \#1} \end{itemize} \subsection{12 months roadmap} -\label{sec:WP3:FreeFem++:roadmap} +\label{sec:WP3:Freefem++:roadmap} Describe the planned improvements for the software in the context of WP3 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/freefempp/WP5/WP5.tex b/software/freefempp/WP5/WP5.tex new file mode 100644 index 0000000..07ff2fd --- /dev/null +++ b/software/freefempp/WP5/WP5.tex @@ -0,0 +1,93 @@ +\section{Software: Freefem++} +\label{sec:WP5:Freefem++:software} + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria PARIS\\ +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +frederic.hecht@sorbonne-universite.fr\\ +pierre-henri.tournier@sorbonne-universite.fr\\ +pierre.jolivet@sorbonne-universite.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/FreeFem/FreeFem-sources}{https://github.com/FreeFem/FreeFem-sources} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP5: Freefem++ Information} +\end{table} + +\subsection{Software Overview} +\label{sec:WP5:Freefem++:summary} + +Provide a brief overview of the software with respect to WP5. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} Iterative methods & provide short description here \\ +\end{tabular} + } + } + \caption{WP5: Freefem++ Features} +\end{table} + + +\subsection{Parallel Capabilities} +\label{sec:WP5:Freefem++:performances} + + +\begin{itemize} + \item describe the parallel programming environment : MPI, OpenMP, CUDA, OpenACC, etc. + \item describe the parallel computation environment: type of architecture and super computer used. + \item describe the parallel capabilities of the software + \item \textbf{Scalability:} Describe the general scalability properties of the software + \item \textbf{Integration with Other Systems:} Describe how the software integrates with other numerical libraries and middleware in the Exa-MA framework. +\end{itemize} + +\subsection{Initial Performance Metrics} +\label{sec:WP5:Freefem++:metrics} + +In this section, provide a summary of the initial performance metrics of the software with respect to WP5. +You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. + + + +\subsubsection{Benchmark \#1} +\begin{itemize} + \item describe the benchmark + \item \textbf{Benchmarking Tools Used:} Describe the tools used for parallel benchmarking and the metrics mesured + \item \textbf{Results Summary:} Results summary not available. + \item \textbf{Challenges Identified:} No challenges identified. +\end{itemize} + +\subsection{12 months roadmap} +\label{sec:WP5:Freefem++:roadmap} + +Describe the planned improvements for the software in the context of WP5 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/freefempp/freefempp.tex b/software/freefempp/freefempp.tex index 16d9e43..6c7c375 100644 --- a/software/freefempp/freefempp.tex +++ b/software/freefempp/freefempp.tex @@ -1,36 +1,129 @@ -\section{Software: FreeFem++} -\label{sec:FreeFem++:software} - - - -\begin{itemize} - \item \textbf{Contact Email(s):} frederic.hecht@sorbonne-universite.fr, pierre.jolivet@sorbonne-universite.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/FreeFem/FreeFem-sources}{https://github.com/FreeFem/FreeFem-sources} -\end{itemize} +\section{Software: Freefem++} +\label{sec:Freefem++:software} + + + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria PARIS\\ +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +frederic.hecht@sorbonne-universite.fr\\ +pierre-henri.tournier@sorbonne-universite.fr\\ +pierre.jolivet@sorbonne-universite.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/FreeFem/FreeFem-sources}{https://github.com/FreeFem/FreeFem-sources} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Freefem++ Information} +\end{table} \subsection{Software summary} -\label{sec:FreeFem++:summary} +\label{sec:Freefem++:summary} Detailed overview not available. \subsection{Purpose} -\label{sec:FreeFem++:purpose} +\label{sec:Freefem++:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Freefem++:environment_capabilities} + + +The following table summarizes these aspects for Freefem++, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +Gmsh and associated formats\\ +HDF5\\ +VTK\\ +in-house format\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +Debian\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +Validation\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +Docker\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +HPdomain decomposition methods\\ +MMG/ParMMG\\ +MUMPS\\ +PETSc\\ +Scotch\\ +\end{tabular} & List of software Freefem++ has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Freefem++ programming and computational environment} +\end{table} + \subsection{Mathematics} -\label{sec:FreeFem++:mathematics} +\label{sec:Freefem++:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} -\label{sec:FreeFem++:publications} +\label{sec:Freefem++:publications} + +Here is a list of relevant publications related to the software: + \subsection{Acknowledgements} -\label{sec::FreeFem++:acknowledgements} +\label{sec::Freefem++:acknowledgements} + +The software has been developed with the support of the following funding agencies and institutions: + + + Acknowledgements not available. diff --git a/software/hawen/WP1/WP1.tex b/software/hawen/WP1/WP1.tex index f32b1e7..7ce591d 100644 --- a/software/hawen/WP1/WP1.tex +++ b/software/hawen/WP1/WP1.tex @@ -1,17 +1,62 @@ \section{Software: Hawen} \label{sec:WP1:Hawen:software} -\begin{itemize} - \item \textbf{Contact Email(s):} florian.faucher@inria.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +florian.faucher@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP1: Hawen Information} +\end{table} \subsection{Software Overview} \label{sec:WP1:Hawen:summary} Provide a brief overview of the software with respect to WP1. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} dG/hdG & provide short description here \\ +\rowcolor{numpexlightergray} multiphysics coupling & provide short description here \\ +\end{tabular} + } + } + \caption{WP1: Hawen Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP1:Hawen:performances} diff --git a/software/hawen/WP3/WP3.tex b/software/hawen/WP3/WP3.tex index 31444f5..9f8eb25 100644 --- a/software/hawen/WP3/WP3.tex +++ b/software/hawen/WP3/WP3.tex @@ -1,17 +1,61 @@ \section{Software: Hawen} \label{sec:WP3:Hawen:software} -\begin{itemize} - \item \textbf{Contact Email(s):} florian.faucher@inria.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +florian.faucher@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: Hawen Information} +\end{table} \subsection{Software Overview} \label{sec:WP3:Hawen:summary} Provide a brief overview of the software with respect to WP3. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} "reuse of Krylov subspaces for multiple right-hand sides" & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: Hawen Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP3:Hawen:performances} diff --git a/software/hawen/WP4/WP4.tex b/software/hawen/WP4/WP4.tex index 3bdc1a8..0dfb477 100644 --- a/software/hawen/WP4/WP4.tex +++ b/software/hawen/WP4/WP4.tex @@ -1,17 +1,61 @@ \section{Software: Hawen} \label{sec:WP4:Hawen:software} -\begin{itemize} - \item \textbf{Contact Email(s):} florian.faucher@inria.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +florian.faucher@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP4: Hawen Information} +\end{table} \subsection{Software Overview} \label{sec:WP4:Hawen:summary} Provide a brief overview of the software with respect to WP4. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} deterministic inverse problem & provide short description here \\ +\end{tabular} + } + } + \caption{WP4: Hawen Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP4:Hawen:performances} diff --git a/software/hawen/hawen.tex b/software/hawen/hawen.tex index 9b0768e..cb2c630 100644 --- a/software/hawen/hawen.tex +++ b/software/hawen/hawen.tex @@ -3,11 +3,35 @@ \section{Software: Hawen} -\begin{itemize} - \item \textbf{Contact Email(s):} florian.faucher@inria.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +florian.faucher@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.com/ffaucher/hawen}{https://gitlab.com/ffaucher/hawen} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: GPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Hawen Information} +\end{table} \subsection{Software summary} \label{sec:Hawen:summary} @@ -19,19 +43,80 @@ \subsection{Purpose} \label{sec:Hawen:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Hawen:environment_capabilities} + + +The following table summarizes these aspects for Hawen, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +Fortran\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +Multithread\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +Gmsh and associated formats\\ +VTK\\ +in-house format\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +None\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +None\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +MUMPS\\ +\end{tabular} & List of software Hawen has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Hawen programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:Hawen:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:Hawen:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::Hawen:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/hpddm/WP3/WP3.tex b/software/hpddm/WP3/WP3.tex index f07b42a..67f0177 100644 --- a/software/hpddm/WP3/WP3.tex +++ b/software/hpddm/WP3/WP3.tex @@ -1,19 +1,34 @@ -\section{Software: HPDDM} -\label{sec:WP3:HPDDM:software} - -\begin{itemize} - \item \textbf{Contact Email(s):} pierre.joliv.et - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/hpddm/hpddm}{https://github.com/hpddm/hpddm} -\end{itemize} +\section{Software: 14} +\label{sec:WP3:14:software} + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + + \rowcolor{white}\textbf{Contact Emails} & pierre@joliv.et \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & CPU \\ + \rowcolor{white}\textbf{Repository Link} & \href{https://github.com/hpddm/hpddm}{https://github.com/hpddm/hpddm} \\ + \rowcolor{numpexlightergray}\textbf{License} & OSS:: LGPL v* \\ + \bottomrule + \end{tabular} + }} + \caption{14 Information} +\end{table} \subsection{Software Overview} -\label{sec:WP3:HPDDM:summary} +\label{sec:WP3:14:summary} Provide a brief overview of the software with respect to WP3. +nan + \subsection{Parallel Capabilities} -\label{sec:WP3:HPDDM:performances} +\label{sec:WP3:14:performances} \begin{itemize} @@ -25,7 +40,7 @@ \subsection{Parallel Capabilities} \end{itemize} \subsection{Initial Performance Metrics} -\label{sec:WP3:HPDDM:metrics} +\label{sec:WP3:14:metrics} In this section, provide a summary of the initial performance metrics of the software with respect to WP3. You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. @@ -41,6 +56,6 @@ \subsubsection{Benchmark \#1} \end{itemize} \subsection{12 months roadmap} -\label{sec:WP3:HPDDM:roadmap} +\label{sec:WP3:14:roadmap} Describe the planned improvements for the software in the context of WP3 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/hpddm/hpddm.tex b/software/hpddm/hpddm.tex index d54fe14..3ffeabd 100644 --- a/software/hpddm/hpddm.tex +++ b/software/hpddm/hpddm.tex @@ -3,11 +3,24 @@ \section{Software: HPDDM} -\begin{itemize} - \item \textbf{Contact Email(s):} pierre.joliv.et - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/hpddm/hpddm}{https://github.com/hpddm/hpddm} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + + \rowcolor{white}\textbf{Contact Emails} & pierre@joliv.et \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & CPU \\ + \rowcolor{white}\textbf{Repository Link} & \href{https://github.com/hpddm/hpddm}{https://github.com/hpddm/hpddm} \\ + \rowcolor{numpexlightergray}\textbf{License} & OSS:: LGPL v* \\ + \bottomrule + \end{tabular} + }} + \caption{HPDDM Information} +\end{table} \subsection{Software summary} \label{sec:HPDDM:summary} @@ -19,19 +32,62 @@ \subsection{Purpose} \label{sec:HPDDM:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::HPDDM:environment_capabilities} + + +The following table summarizes these aspects for HPDDM, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & C, +C++, +Fortran, +Python & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & MPI, +Multithread - OpenMP & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & in-house format & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & None & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & Continuous Integration & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & None & Software packaging and distribution.\\ + \rowcolor{white}Testing & Unit, Verification & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & None & Container technologies used to package and deploy the software.\\ + \bottomrule + \end{tabular} + }} + \caption{HPDDM programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:HPDDM:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:HPDDM:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::HPDDM:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/hpdomain-decomposition-methods/WP3/WP3.tex b/software/hpdomain-decomposition-methods/WP3/WP3.tex new file mode 100644 index 0000000..aac95b5 --- /dev/null +++ b/software/hpdomain-decomposition-methods/WP3/WP3.tex @@ -0,0 +1,97 @@ +\section{Software: HPdomain decomposition methods} +\label{sec:WP3:HPdomain decomposition methods:software} + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria PARIS\\ +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +pierre@joliv.et\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/hpdomain decomposition methods/hpdomain decomposition methods}{https://github.com/hpdomain decomposition methods/hpdomain decomposition methods} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: HPdomain decomposition methods Information} +\end{table} + +\subsection{Software Overview} +\label{sec:WP3:HPdomain decomposition methods:summary} + +Provide a brief overview of the software with respect to WP3. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} domain decomposition methods & provide short description here \\ +\rowcolor{numpexlightergray} multi-precision & provide short description here \\ +\rowcolor{white} tensor calculus & provide short description here \\ +\rowcolor{numpexlightergray} "reuse of Krylov subspaces for multiple right-hand sides" & provide short description here \\ +\rowcolor{white} randomization & provide short description here \\ +\rowcolor{numpexlightergray} low-rank & provide short description here \\ +\rowcolor{white} interface & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: HPdomain decomposition methods Features} +\end{table} + + +\subsection{Parallel Capabilities} +\label{sec:WP3:HPdomain decomposition methods:performances} + + +\begin{itemize} + \item describe the parallel programming environment : MPI, OpenMP, CUDA, OpenACC, etc. + \item describe the parallel computation environment: type of architecture and super computer used. + \item describe the parallel capabilities of the software + \item \textbf{Scalability:} Describe the general scalability properties of the software + \item \textbf{Integration with Other Systems:} Describe how the software integrates with other numerical libraries and middleware in the Exa-MA framework. +\end{itemize} + +\subsection{Initial Performance Metrics} +\label{sec:WP3:HPdomain decomposition methods:metrics} + +In this section, provide a summary of the initial performance metrics of the software with respect to WP3. +You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. + + + +\subsubsection{Benchmark \#1} +\begin{itemize} + \item describe the benchmark + \item \textbf{Benchmarking Tools Used:} Describe the tools used for parallel benchmarking and the metrics mesured + \item \textbf{Results Summary:} Results summary not available. + \item \textbf{Challenges Identified:} No challenges identified. +\end{itemize} + +\subsection{12 months roadmap} +\label{sec:WP3:HPdomain decomposition methods:roadmap} + +Describe the planned improvements for the software in the context of WP3 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/hpdomain-decomposition-methods/hpdomain-decomposition-methods.tex b/software/hpdomain-decomposition-methods/hpdomain-decomposition-methods.tex new file mode 100644 index 0000000..fbb0396 --- /dev/null +++ b/software/hpdomain-decomposition-methods/hpdomain-decomposition-methods.tex @@ -0,0 +1,129 @@ +\section{Software: HPdomain decomposition methods} +\label{sec:HPdomain decomposition methods:software} + + + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria PARIS\\ +Sorbonne U\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +pierre@joliv.et\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/hpdomain decomposition methods/hpdomain decomposition methods}{https://github.com/hpdomain decomposition methods/hpdomain decomposition methods} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS:: LGPL v*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{HPdomain decomposition methods Information} +\end{table} + +\subsection{Software summary} +\label{sec:HPdomain decomposition methods:summary} +Detailed overview not available. + + + +\subsection{Purpose} +\label{sec:HPdomain decomposition methods:purpose} +Purpose not available. + +\subsection{Programming and Computational Environment} +\label{sec::HPdomain decomposition methods:environment_capabilities} + + +The following table summarizes these aspects for HPdomain decomposition methods, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C\\ +C++\\ +Fortran\\ +Python\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +Multithread\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +in-house format\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +Verification\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +Feel++\\ +Freefem++\\ +MUMPS\\ +PETSc\\ +PaStIX\\ +\end{tabular} & List of software HPdomain decomposition methods has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{HPdomain decomposition methods programming and computational environment} +\end{table} + + + +\subsection{Mathematics} +\label{sec:HPdomain decomposition methods:mathematics} +Mathematics not available. + +In this section, provide a summary the mathematics used in the software. + + +\subsection{Relevant Publications} +\label{sec:HPdomain decomposition methods:publications} + +Here is a list of relevant publications related to the software: + + +\subsection{Acknowledgements} +\label{sec::HPdomain decomposition methods:acknowledgements} + +The software has been developed with the support of the following funding agencies and institutions: + + + + +Acknowledgements not available. + + diff --git a/software/mahyco/mahyco.tex b/software/mahyco/mahyco.tex index 6c7118b..6993507 100644 --- a/software/mahyco/mahyco.tex +++ b/software/mahyco/mahyco.tex @@ -3,11 +3,36 @@ \section{Software: MaHyCo} -\begin{itemize} - \item \textbf{Contact Email(s):} jean-philippe.perlat@cea.fr - \item \textbf{Supported Architecture(s):} HYBRID - \item \textbf{Repository Link:} \href{URL not visible}{URL not visible} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +jean-philippe.perlat@cea.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/cea-hpc/MaHyCo}{https://github.com/cea-hpc/MaHyCo} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: apache-2\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{MaHyCo Information} +\end{table} \subsection{Software summary} \label{sec:MaHyCo:summary} @@ -19,19 +44,78 @@ \subsection{Purpose} \label{sec:MaHyCo:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::MaHyCo:environment_capabilities} + + +The following table summarizes these aspects for MaHyCo, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +GPU\\ +MPI\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +XML\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +Checkpoint restart\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +None\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +Arcane Framework\\ +\end{tabular} & List of software MaHyCo has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{MaHyCo programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:MaHyCo:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:MaHyCo:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::MaHyCo:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/manta/WP3/WP3.tex b/software/manta/WP3/WP3.tex new file mode 100644 index 0000000..4cbcb67 --- /dev/null +++ b/software/manta/WP3/WP3.tex @@ -0,0 +1,90 @@ +\section{Software: MANTA} +\label{sec:WP3:MANTA:software} + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +CEA + consortium in development (see EUROPLEXUS)\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +olivier.jamond@cea.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{None}{None} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: MANTA Information} +\end{table} + +\subsection{Software Overview} +\label{sec:WP3:MANTA:summary} + +Provide a brief overview of the software with respect to WP3. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} multiphysics coupling & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: MANTA Features} +\end{table} + + +\subsection{Parallel Capabilities} +\label{sec:WP3:MANTA:performances} + + +\begin{itemize} + \item describe the parallel programming environment : MPI, OpenMP, CUDA, OpenACC, etc. + \item describe the parallel computation environment: type of architecture and super computer used. + \item describe the parallel capabilities of the software + \item \textbf{Scalability:} Describe the general scalability properties of the software + \item \textbf{Integration with Other Systems:} Describe how the software integrates with other numerical libraries and middleware in the Exa-MA framework. +\end{itemize} + +\subsection{Initial Performance Metrics} +\label{sec:WP3:MANTA:metrics} + +In this section, provide a summary of the initial performance metrics of the software with respect to WP3. +You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. + + + +\subsubsection{Benchmark \#1} +\begin{itemize} + \item describe the benchmark + \item \textbf{Benchmarking Tools Used:} Describe the tools used for parallel benchmarking and the metrics mesured + \item \textbf{Results Summary:} Results summary not available. + \item \textbf{Challenges Identified:} No challenges identified. +\end{itemize} + +\subsection{12 months roadmap} +\label{sec:WP3:MANTA:roadmap} + +Describe the planned improvements for the software in the context of WP3 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/manta/manta.tex b/software/manta/manta.tex index 9635a8f..d8df162 100644 --- a/software/manta/manta.tex +++ b/software/manta/manta.tex @@ -3,11 +3,35 @@ \section{Software: MANTA} -\begin{itemize} - \item \textbf{Contact Email(s):} olivier.jamond@cea.fr - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{URL not visible}{URL not visible} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +CEA + consortium in development (see EUROPLEXUS)\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +olivier.jamond@cea.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{None}{None} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{MANTA Information} +\end{table} \subsection{Software summary} \label{sec:MANTA:summary} @@ -19,19 +43,81 @@ \subsection{Purpose} \label{sec:MANTA:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::MANTA:environment_capabilities} + + +The following table summarizes these aspects for MANTA, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +Gmsh and associated formats\\ +MED\\ +MFront\\ +VTK\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +Verification\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +None\\ +\end{tabular} & List of software MANTA has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{MANTA programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:MANTA:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:MANTA:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::MANTA:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/maphyspp/WP3/WP3.tex b/software/maphyspp/WP3/WP3.tex new file mode 100644 index 0000000..5b14aef --- /dev/null +++ b/software/maphyspp/WP3/WP3.tex @@ -0,0 +1,46 @@ +\section{Software: Maphys++} +\label{sec:WP3:Maphys++:software} + +\begin{itemize} + \item \textbf{Contact Email(s):} gilles.marait@inria.fr + \item \textbf{Supported Architecture(s):} HYBRID + \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/solverstack/maphys/maphyspp}{https://gitlab.inria.fr/solverstack/maphys/maphyspp} +\end{itemize} + +\subsection{Software Overview} +\label{sec:WP3:Maphys++:summary} + +Provide a brief overview of the software with respect to WP3. + +\subsection{Parallel Capabilities} +\label{sec:WP3:Maphys++:performances} + + +\begin{itemize} + \item describe the parallel programming environment : MPI, OpenMP, CUDA, OpenACC, etc. + \item describe the parallel computation environment: type of architecture and super computer used. + \item describe the parallel capabilities of the software + \item \textbf{Scalability:} Describe the general scalability properties of the software + \item \textbf{Integration with Other Systems:} Describe how the software integrates with other numerical libraries and middleware in the Exa-MA framework. +\end{itemize} + +\subsection{Initial Performance Metrics} +\label{sec:WP3:Maphys++:metrics} + +In this section, provide a summary of the initial performance metrics of the software with respect to WP3. +You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. + + + +\subsubsection{Benchmark \#1} +\begin{itemize} + \item describe the benchmark + \item \textbf{Benchmarking Tools Used:} Describe the tools used for parallel benchmarking and the metrics mesured + \item \textbf{Results Summary:} Results summary not available. + \item \textbf{Challenges Identified:} No challenges identified. +\end{itemize} + +\subsection{12 months roadmap} +\label{sec:WP3:Maphys++:roadmap} + +Describe the planned improvements for the software in the context of WP3 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/maphyspp/maphyspp.tex b/software/maphyspp/maphyspp.tex new file mode 100644 index 0000000..1a4a88a --- /dev/null +++ b/software/maphyspp/maphyspp.tex @@ -0,0 +1,212 @@ +\section{Software: Maphys++} +\label{sec:Maphys++:software} + + + +\begin{itemize} + \item \textbf{Contact Email(s):} gilles.marait@inria.fr + \item \textbf{Supported Architecture(s):} HYBRID + \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/solverstack/maphys/maphyspp}{https://gitlab.inria.fr/solverstack/maphys/maphyspp} +\end{itemize} + +\subsection{Software summary} +\label{sec:Maphys++:summary} +Detailed overview not available. + + + +\subsection{Purpose} +\label{sec:Maphys++:purpose} +Purpose not available. + +\subsection{Computational Environment and Capabilities} +\label{sec:::environment_capabilities} + +\subsubsection{Languages} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Language & Supported \\ + \hline + C & \\ + C++ & \\ + Fortran & \\ + Python & \\ + Julia & \\ + Rust & \\ + Other & \\ + C++14 & \\ + C++17 & \\ + C++20 & \\ + C++23 & \\ + C# & \\ + \hline + \end{tabular} + \caption{Supported Languages} +\end{table} + +\subsubsection{Parallelism} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Parallelism Type & Supported \\ + \hline + MPI & \\ + Multithread & \\ + Multithread-OpenMP & \\ + Multithread-TBB & \\ + Parallelism - C++17 and after & \\ + Task based - C++ & \\ + Task based - Runtime & \\ + GPU & \\ + Chapel & \\ + \hline + \end{tabular} + \caption{Parallelism Capabilities} +\end{table} + +\subsubsection{GPU Capabilities} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + GPU Aspect & Supported \\ + \hline + OpenCL & \\ + NVIDIA & \\ + AMD & \\ + ARM & \\ + CUDA & \\ + ROCm & \\ + \hline + \end{tabular} + \caption{GPU Capabilities} +\end{table} + +\subsubsection{Data Formats} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Data Format & Supported \\ + \hline + Json & \\ + XML & \\ + YAML & \\ + HDF5 & \\ + Database & \\ + Data-management system & \\ + In-house format & \\ + VTK & \\ + Ensight & \\ + Gmsh and associated formats & \\ + MED & \\ + Adios & \\ + ASCII & \\ + ROOT & \\ + SQL & \\ + \hline + \end{tabular} + \caption{Supported Data Formats} +\end{table} + +\subsubsection{Resilience} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Resilience Feature & Supported \\ + \hline + Checkpoint Restart & \\ + OpenMPI-ULFM & \\ + FTI & \\ + ULFM & \\ + \hline + \end{tabular} + \caption{Resilience Features} +\end{table} + +\subsection{DevOps} +\label{sec:::devops} + +\subsubsection{Continuous Integration/Continuous Deployment/Continuous Benchmarking} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + CI/CD/Benchmarking Tool & Supported \\ + \hline + Continuous Integration & \\ + Continuous Deployment & \\ + Continuous Benchmarking & \\ + \hline + \end{tabular} + \caption{CI/CD/Benchmarking Tools} +\end{table} + +\subsubsection{Packages} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Package Manager & Supported \\ + \hline + Debian & \\ + Ubuntu & \\ + Fedora & \\ + GUIX-HPC & \\ + Spack & \\ + Other & \\ + \hline + \end{tabular} + \caption{Package Managers} +\end{table} + +\subsubsection{Containers} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Container Type & Supported \\ + \hline + Docker & \\ + Singularity & \\ + Other & \\ + \hline + \end{tabular} + \caption{Container Types} +\end{table} + +\subsubsection{Tests} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Test Type & Supported \\ + \hline + Unit Test & \\ + Verification Test & \\ + Validation Test & \\ + Fuzzy Test & \\ + Functional Test & \\ + \hline + \end{tabular} + \caption{Testing Types} +\end{table} + +\subsection{Mathematics} +\label{sec:Maphys++:mathematics} +Mathematics not available. + + +\subsection{Relevant Publications} +\label{sec:Maphys++:publications} + +\subsection{Acknowledgements} +\label{sec::Maphys++:acknowledgements} + +Acknowledgements not available. + + diff --git a/software/mmg-parmmg/WP1/WP1.tex b/software/mmg-parmmg/WP1/WP1.tex index 32bda1c..99059b6 100644 --- a/software/mmg-parmmg/WP1/WP1.tex +++ b/software/mmg-parmmg/WP1/WP1.tex @@ -1,19 +1,66 @@ -\section{Software: MMG-ParMMG} -\label{sec:WP1:MMG-ParMMG:software} +\section{Software: MMG/ParMMG} +\label{sec:WP1:MMG/ParMMG:software} -\begin{itemize} - \item \textbf{Contact Email(s):} No visible email - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{URL not visible}{URL not visible} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +Sorbonne U\\ +U Grenoble Alpes\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{None}{None} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP1: MMG/ParMMG Information} +\end{table} \subsection{Software Overview} -\label{sec:WP1:MMG-ParMMG:summary} +\label{sec:WP1:MMG/ParMMG:summary} Provide a brief overview of the software with respect to WP1. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} unstructured mesh & provide short description here \\ +\rowcolor{numpexlightergray} mesh adaptation & provide short description here \\ +\end{tabular} + } + } + \caption{WP1: MMG/ParMMG Features} +\end{table} + + \subsection{Parallel Capabilities} -\label{sec:WP1:MMG-ParMMG:performances} +\label{sec:WP1:MMG/ParMMG:performances} \begin{itemize} @@ -25,7 +72,7 @@ \subsection{Parallel Capabilities} \end{itemize} \subsection{Initial Performance Metrics} -\label{sec:WP1:MMG-ParMMG:metrics} +\label{sec:WP1:MMG/ParMMG:metrics} In this section, provide a summary of the initial performance metrics of the software with respect to WP1. You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. @@ -41,6 +88,6 @@ \subsubsection{Benchmark \#1} \end{itemize} \subsection{12 months roadmap} -\label{sec:WP1:MMG-ParMMG:roadmap} +\label{sec:WP1:MMG/ParMMG:roadmap} Describe the planned improvements for the software in the context of WP1 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/mmg-parmmg/mmg-parmmg.tex b/software/mmg-parmmg/mmg-parmmg.tex index be6d9de..93b09eb 100644 --- a/software/mmg-parmmg/mmg-parmmg.tex +++ b/software/mmg-parmmg/mmg-parmmg.tex @@ -1,36 +1,121 @@ -\section{Software: MMG-ParMMG} -\label{sec:MMG-ParMMG:software} - - - -\begin{itemize} - \item \textbf{Contact Email(s):} No visible email - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{URL not visible}{URL not visible} -\end{itemize} +\section{Software: MMG/ParMMG} +\label{sec:MMG/ParMMG:software} + + + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Inria\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria BXSO\\ +Sorbonne U\\ +U Grenoble Alpes\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{None}{None} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{MMG/ParMMG Information} +\end{table} \subsection{Software summary} -\label{sec:MMG-ParMMG:summary} +\label{sec:MMG/ParMMG:summary} Detailed overview not available. \subsection{Purpose} -\label{sec:MMG-ParMMG:purpose} +\label{sec:MMG/ParMMG:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::MMG/ParMMG:environment_capabilities} + + +The following table summarizes these aspects for MMG/ParMMG, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C\\ +Fortran\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +in-house format\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +None\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +None\\ +\end{tabular} & List of software MMG/ParMMG has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{MMG/ParMMG programming and computational environment} +\end{table} + \subsection{Mathematics} -\label{sec:MMG-ParMMG:mathematics} +\label{sec:MMG/ParMMG:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} -\label{sec:MMG-ParMMG:publications} +\label{sec:MMG/ParMMG:publications} + +Here is a list of relevant publications related to the software: + \subsection{Acknowledgements} -\label{sec::MMG-ParMMG:acknowledgements} +\label{sec::MMG/ParMMG:acknowledgements} + +The software has been developed with the support of the following funding agencies and institutions: + + + Acknowledgements not available. diff --git a/software/pbb/WP5/WP5.tex b/software/pbb/WP5/WP5.tex index 0bd3a82..f83c911 100644 --- a/software/pbb/WP5/WP5.tex +++ b/software/pbb/WP5/WP5.tex @@ -1,17 +1,62 @@ \section{Software: pBB} \label{sec:WP5:pBB:software} -\begin{itemize} - \item \textbf{Contact Email(s):} noureddine.melab@univ-lille.fr - \item \textbf{Supported Architecture(s):} HYBRID - \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/igmys/permutationbb}{https://gitlab.inria.fr/igmys/permutationbb} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Université de Lille\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria Lille\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +nouredine.melab@univ-lille.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.inria.fr/jgmys/permutationbb}{https://gitlab.inria.fr/jgmys/permutationbb} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: Cecill-*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP5: pBB Information} +\end{table} \subsection{Software Overview} \label{sec:WP5:pBB:summary} Provide a brief overview of the software with respect to WP5. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} Iterative methods & provide short description here \\ +\end{tabular} + } + } + \caption{WP5: pBB Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP5:pBB:performances} diff --git a/software/pbb/pbb.tex b/software/pbb/pbb.tex index 03a377f..9d0511b 100644 --- a/software/pbb/pbb.tex +++ b/software/pbb/pbb.tex @@ -3,11 +3,36 @@ \section{Software: pBB} -\begin{itemize} - \item \textbf{Contact Email(s):} noureddine.melab@univ-lille.fr - \item \textbf{Supported Architecture(s):} HYBRID - \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/igmys/permutationbb}{https://gitlab.inria.fr/igmys/permutationbb} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Université de Lille\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria Lille\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +nouredine.melab@univ-lille.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.inria.fr/jgmys/permutationbb}{https://gitlab.inria.fr/jgmys/permutationbb} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: Cecill-*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{pBB Information} +\end{table} \subsection{Software summary} \label{sec:pBB:summary} @@ -19,19 +44,80 @@ \subsection{Purpose} \label{sec:pBB:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::pBB:environment_capabilities} + + +The following table summarizes these aspects for pBB, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +Chapel\\ +GPU\\ +MPI\\ +Multithread\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +None\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +Checkpoint restart\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +None\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +None\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +None\\ +\end{tabular} & List of software pBB has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{pBB programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:pBB:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:pBB:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::pBB:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/samurai/WP1/WP1.tex b/software/samurai/WP1/WP1.tex index b503f17..14f181c 100644 --- a/software/samurai/WP1/WP1.tex +++ b/software/samurai/WP1/WP1.tex @@ -1,17 +1,62 @@ \section{Software: Samurai} \label{sec:WP1:Samurai:software} -\begin{itemize} - \item \textbf{Contact Email(s):} loic.gouarin@polytechnique.edu - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/hpc-maths/samurai}{https://github.com/hpc-maths/samurai} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +IP Paris\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +IPP\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +Loic Gouarin\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/hpc-maths/samurai}{https://github.com/hpc-maths/samurai} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS::BSD\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP1: Samurai Information} +\end{table} \subsection{Software Overview} \label{sec:WP1:Samurai:summary} Provide a brief overview of the software with respect to WP1. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} mesh adaptation & provide short description here \\ +\end{tabular} + } + } + \caption{WP1: Samurai Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP1:Samurai:performances} diff --git a/software/samurai/samurai.tex b/software/samurai/samurai.tex index 209999e..dbbc4a2 100644 --- a/software/samurai/samurai.tex +++ b/software/samurai/samurai.tex @@ -3,11 +3,36 @@ \section{Software: Samurai} -\begin{itemize} - \item \textbf{Contact Email(s):} loic.gouarin@polytechnique.edu - \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://github.com/hpc-maths/samurai}{https://github.com/hpc-maths/samurai} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +IP Paris\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +IPP\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +Loic Gouarin\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/hpc-maths/samurai}{https://github.com/hpc-maths/samurai} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS::BSD\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Samurai Information} +\end{table} \subsection{Software summary} \label{sec:Samurai:summary} @@ -19,19 +44,82 @@ \subsection{Purpose} \label{sec:Samurai:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Samurai:environment_capabilities} + + +The following table summarizes these aspects for Samurai, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +C++\\ +C++\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +Multithread\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +HDF5\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +Other\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +Validation\\ +Verification\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +PETSc\\ +\end{tabular} & List of software Samurai has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Samurai programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:Samurai:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:Samurai:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::Samurai:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/scimba/WP2/WP2.tex b/software/scimba/WP2/WP2.tex index 685d01f..f02b93d 100644 --- a/software/scimba/WP2/WP2.tex +++ b/software/scimba/WP2/WP2.tex @@ -1,17 +1,63 @@ \section{Software: Scimba} \label{sec:WP2:Scimba:software} -\begin{itemize} - \item \textbf{Contact Email(s):} emmanuel.franck@inria.fr, matthieu.boileau@math.unistra.fr, victor.michel-dansac@inria.fr - \item \textbf{Supported Architecture(s):} GPU - \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/scimba/scimba}{https://gitlab.inria.fr/scimba/scimba} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +INRIA\\ +UNISTRA\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +emmanuel.franck@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.inria.fr/scimba/scimba}{https://gitlab.inria.fr/scimba/scimba} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP2: Scimba Information} +\end{table} \subsection{Software Overview} \label{sec:WP2:Scimba:summary} Provide a brief overview of the software with respect to WP2. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} NN/Autoencoder & provide short description here \\ +\rowcolor{numpexlightergray} PINN & provide short description here \\ +\end{tabular} + } + } + \caption{WP2: Scimba Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP2:Scimba:performances} diff --git a/software/scimba/scimba.tex b/software/scimba/scimba.tex index 635ef6d..fa413e8 100644 --- a/software/scimba/scimba.tex +++ b/software/scimba/scimba.tex @@ -3,11 +3,36 @@ \section{Software: Scimba} -\begin{itemize} - \item \textbf{Contact Email(s):} emmanuel.franck@inria.fr, matthieu.boileau@math.unistra.fr, victor.michel-dansac@inria.fr - \item \textbf{Supported Architecture(s):} GPU - \item \textbf{Repository Link:} \href{https://gitlab.inria.fr/scimba/scimba}{https://gitlab.inria.fr/scimba/scimba} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +INRIA\\ +UNISTRA\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Unistra\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +emmanuel.franck@inria.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://gitlab.inria.fr/scimba/scimba}{https://gitlab.inria.fr/scimba/scimba} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +None\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Scimba Information} +\end{table} \subsection{Software summary} \label{sec:Scimba:summary} @@ -19,19 +44,77 @@ \subsection{Purpose} \label{sec:Scimba:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Scimba:environment_capabilities} + + +The following table summarizes these aspects for Scimba, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +Python\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +GPU\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +None\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +None\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +None\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +None\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +pytorch\\ +\end{tabular} & List of software Scimba has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Scimba programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:Scimba:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:Scimba:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::Scimba:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/trust-platform/WP3/WP3.tex b/software/trust-platform/WP3/WP3.tex new file mode 100644 index 0000000..0e115f9 --- /dev/null +++ b/software/trust-platform/WP3/WP3.tex @@ -0,0 +1,92 @@ +\section{Software: TRUST Platform} +\label{sec:WP3:TRUST Platform:software} + +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +pierre.ledac@cea.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/cea-trust-platform}{https://github.com/cea-trust-platform} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS::\\ +OSS::BSD\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP3: TRUST Platform Information} +\end{table} + +\subsection{Software Overview} +\label{sec:WP3:TRUST Platform:summary} + +Provide a brief overview of the software with respect to WP3. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} multiphysics coupling & provide short description here \\ +\end{tabular} + } + } + \caption{WP3: TRUST Platform Features} +\end{table} + + +\subsection{Parallel Capabilities} +\label{sec:WP3:TRUST Platform:performances} + + +\begin{itemize} + \item describe the parallel programming environment : MPI, OpenMP, CUDA, OpenACC, etc. + \item describe the parallel computation environment: type of architecture and super computer used. + \item describe the parallel capabilities of the software + \item \textbf{Scalability:} Describe the general scalability properties of the software + \item \textbf{Integration with Other Systems:} Describe how the software integrates with other numerical libraries and middleware in the Exa-MA framework. +\end{itemize} + +\subsection{Initial Performance Metrics} +\label{sec:WP3:TRUST Platform:metrics} + +In this section, provide a summary of the initial performance metrics of the software with respect to WP3. +You can list one or more benchmarks and their associated results, the challenges , bottlenecks and the expectations for future versions of the software. + + + +\subsubsection{Benchmark \#1} +\begin{itemize} + \item describe the benchmark + \item \textbf{Benchmarking Tools Used:} Describe the tools used for parallel benchmarking and the metrics mesured + \item \textbf{Results Summary:} Results summary not available. + \item \textbf{Challenges Identified:} No challenges identified. +\end{itemize} + +\subsection{12 months roadmap} +\label{sec:WP3:TRUST Platform:roadmap} + +Describe the planned improvements for the software in the context of WP3 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/trust-platform/trust-platform.tex b/software/trust-platform/trust-platform.tex index 284c277..e8744a7 100644 --- a/software/trust-platform/trust-platform.tex +++ b/software/trust-platform/trust-platform.tex @@ -3,11 +3,37 @@ \section{Software: TRUST Platform} -\begin{itemize} - \item \textbf{Contact Email(s):} pierre.ledac@cea.fr - \item \textbf{Supported Architecture(s):} HYBRID - \item \textbf{Repository Link:} \href{https://github.com/cea-trust-platform}{https://github.com/cea-trust-platform} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +CEA\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +pierre.ledac@cea.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +CPU\\ +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/cea-trust-platform}{https://github.com/cea-trust-platform} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS::\\ +OSS::BSD\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{TRUST Platform Information} +\end{table} \subsection{Software summary} \label{sec:TRUST Platform:summary} @@ -19,19 +45,82 @@ \subsection{Purpose} \label{sec:TRUST Platform:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::TRUST Platform:environment_capabilities} + + +The following table summarizes these aspects for TRUST Platform, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +C++\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +GPU\\ +MPI\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +HDF5\\ +MED\\ +VTK\\ +in-house format\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +Checkpoint restart\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +Continuous Integration\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +Unit\\ +Verification\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +None\\ +\end{tabular} & List of software TRUST Platform has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{TRUST Platform programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:TRUST Platform:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:TRUST Platform:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::TRUST Platform:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/software/uranie/WP6/WP6.tex b/software/uranie/WP6/WP6.tex index 3c379c2..cf7457d 100644 --- a/software/uranie/WP6/WP6.tex +++ b/software/uranie/WP6/WP6.tex @@ -3,32 +3,14 @@ \section{Software: Uranie} \begin{itemize} \item \textbf{Contact Email(s):} rudy.chocat@cea.fr, jean-baptiste.blanchard@cea.fr - \item \textbf{Supported Architecture(s):} CPU, GPU - \item \textbf{Repository Link:} \href{https://uranie.cea.fr/}{https://uranie.cea.fr/} + \item \textbf{Supported Architecture(s):} CPU + \item \textbf{Repository Link:} \href{https://sourceforge.net/projects/uranie/}{https://sourceforge.net/projects/uranie/} \end{itemize} \subsection{Software Overview} \label{sec:WP6:Uranie:summary} -Uranie platform is based on ROOT and has by cosnequence a lot of ROOT characteristics such as: -\begin{itemize} - \item interactive C++ interpreter (Cling) based on LLVM and Clang - \item Python interface (PyROOT) - \item SQL database access -\end{itemize} -Uranie is organized in different modules, each devoted to a specific task in the Uncertainty Quantification (UQ) framework. -\begin{itemize} - \item \textbf{DataServer module:} The DataServer module is the heart of the Uranie platform, and contains the DataServer class. It contains all the necessary information on the variables in a problem (names, units, probability distributions, data files, etc.) and enables basic statistical operations to be performed. - \item \textbf{Sampler module:} This module contains sampling algorithms, such as Monte Carlo or Latin Hypercube Sampling. - \item \textbf{Launcher \& Relauncher modules:} The Launcher and Relauncher module apply an analytical function (python or C++), external simulation code or any combination of these to the contents of a DataServer. The contents of the DataServer can result from a design of experiments generated using one of the sampling techniques, or can be loaded from an external source (ASCII file, SQL database, etc.). Calculations can be easily launched on a cluster or parallelized using different paradigms: fork, shared memory (thread), separate memory (MPI)... - \item \textbf{Modeler module:} The Modeler module can be used to build a surrogate model linking the output(s) and input factors (polynomial models, neural networks, etc.) as closely as possible to the results contained in a set of supplied points serving as a train sample. - \item \textbf{Sensitivity module:} The Sensitivity module is used to perform a sensitivity analysis of one of the output responses in relation to the input factors. Estimation of Sobol' indices and HSIC indices are implemented in this module. - \item \textbf{Optimizer \& Reoptimizer module:} The Optimizer and Reoptimizer libraries are dedicated to model optimization and calibration. Model calibration consists in defining a model's “degrees of freedom” so that future simulations can be optimally adapted to an experimental database. Optimization is a complex procedure, and several techniques are available to perform it with single- or multi-criteria objectives, with or without constraints. - \item \textbf{MeteModelOptim module:} The MetaModelOptim library is a module dedicated to optimizations where it is necessary to couple the generation of surrogate models (and more precisely kriging techniques) to genetic algorithms in an EGO-type approach. - \item \textbf{Calibration module:} The Calibration module is a dedicated module for obtaining the best estimates of some of the parameters of a specific model under consideration. Optimization algorithms and Metropolis-Hastings MCMC sampler are available in this module. - \item \textbf{Reliability module:} The Reliability module is dedicated to reliability analysis, i.e. the determination of the low probabilities characterizing rare events, such as failures. -\end{itemize} - +Provide a brief overview of the software with respect to WP6. \subsection{Parallel Capabilities} \label{sec:WP6:Uranie:performances} @@ -61,4 +43,4 @@ \subsubsection{Benchmark \#1} \subsection{12 months roadmap} \label{sec:WP6:Uranie:roadmap} -In the context of exascale computation, Uranie will have to perform uncertainty quantification on more complex simulation softwares, that will be heavily parallelized using for instance MPI or OpenMP, and run on supercomputers. For the specific case of uncertainty propagation. Ensemble-runs of a simulation software has to be performed, and this can be tricky when the software is parallelized. Memory storage will also be challenging in the exascale era and "on the fly" handling of the output data generated by the simulation software has to be performed by Uranie. In the next deliverable, an adaptation of the Relauncher module using the ICoCo API (\url{https://github.com/cea-trust-platform/icoco-coupling}) will be proposed and illustrated on an uncertainty propagation task using TRUST software, with on the fly processing of the data generated using TRUST Python API. \ No newline at end of file +Describe the planned improvements for the software in the context of WP6 and Exa-MA for the year to come that will be adressed in the next version of this deliverable. \ No newline at end of file diff --git a/software/uranie/uranie.tex b/software/uranie/uranie.tex index dbf1a10..bbf2ade 100644 --- a/software/uranie/uranie.tex +++ b/software/uranie/uranie.tex @@ -6,7 +6,7 @@ \section{Software: Uranie} \begin{itemize} \item \textbf{Contact Email(s):} rudy.chocat@cea.fr, jean-baptiste.blanchard@cea.fr \item \textbf{Supported Architecture(s):} CPU - \item \textbf{Repository Link:} \href{https://uranie.cea.fr/}{https://uranie.cea.fr/} + \item \textbf{Repository Link:} \href{https://sourceforge.net/projects/uranie/}{https://sourceforge.net/projects/uranie/} \end{itemize} \subsection{Software summary} @@ -19,7 +19,182 @@ \subsection{Purpose} \label{sec:Uranie:purpose} Purpose not available. - +\subsection{Computational Environment and Capabilities} +\label{sec:::environment_capabilities} + +\subsubsection{Languages} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Language & Supported \\ + \hline + C & \\ + C++ & \\ + Fortran & \\ + Python & \\ + Julia & \\ + Rust & \\ + Other & \\ + C++14 & \\ + C++17 & \\ + C++20 & \\ + C++23 & \\ + C# & \\ + \hline + \end{tabular} + \caption{Supported Languages} +\end{table} + +\subsubsection{Parallelism} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Parallelism Type & Supported \\ + \hline + MPI & \\ + Multithread & \\ + Multithread-OpenMP & \\ + Multithread-TBB & \\ + Parallelism - C++17 and after & \\ + Task based - C++ & \\ + Task based - Runtime & \\ + GPU & \\ + Chapel & \\ + \hline + \end{tabular} + \caption{Parallelism Capabilities} +\end{table} + +\subsubsection{GPU Capabilities} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + GPU Aspect & Supported \\ + \hline + OpenCL & \\ + NVIDIA & \\ + AMD & \\ + ARM & \\ + CUDA & \\ + ROCm & \\ + \hline + \end{tabular} + \caption{GPU Capabilities} +\end{table} + +\subsubsection{Data Formats} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Data Format & Supported \\ + \hline + Json & \\ + XML & \\ + YAML & \\ + HDF5 & \\ + Database & \\ + Data-management system & \\ + In-house format & \\ + VTK & \\ + Ensight & \\ + Gmsh and associated formats & \\ + MED & \\ + Adios & \\ + ASCII & \\ + ROOT & \\ + SQL & \\ + \hline + \end{tabular} + \caption{Supported Data Formats} +\end{table} + +\subsubsection{Resilience} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Resilience Feature & Supported \\ + \hline + Checkpoint Restart & \\ + OpenMPI-ULFM & \\ + FTI & \\ + ULFM & \\ + \hline + \end{tabular} + \caption{Resilience Features} +\end{table} + +\subsection{DevOps} +\label{sec:::devops} + +\subsubsection{Continuous Integration/Continuous Deployment/Continuous Benchmarking} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + CI/CD/Benchmarking Tool & Supported \\ + \hline + Continuous Integration & \\ + Continuous Deployment & \\ + Continuous Benchmarking & \\ + \hline + \end{tabular} + \caption{CI/CD/Benchmarking Tools} +\end{table} + +\subsubsection{Packages} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Package Manager & Supported \\ + \hline + Debian & \\ + Ubuntu & \\ + Fedora & \\ + GUIX-HPC & \\ + Spack & \\ + Other & \\ + \hline + \end{tabular} + \caption{Package Managers} +\end{table} + +\subsubsection{Containers} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Container Type & Supported \\ + \hline + Docker & \\ + Singularity & \\ + Other & \\ + \hline + \end{tabular} + \caption{Container Types} +\end{table} + +\subsubsection{Tests} +\begin{table}[h!] + \centering + \begin{tabular}{|l|c|} + \hline + Test Type & Supported \\ + \hline + Unit Test & \\ + Verification Test & \\ + Validation Test & \\ + Fuzzy Test & \\ + Functional Test & \\ + \hline + \end{tabular} + \caption{Testing Types} +\end{table} \subsection{Mathematics} \label{sec:Uranie:mathematics} diff --git a/software/zellij/WP5/WP5.tex b/software/zellij/WP5/WP5.tex index f7d8c2a..f9cb3f4 100644 --- a/software/zellij/WP5/WP5.tex +++ b/software/zellij/WP5/WP5.tex @@ -1,17 +1,62 @@ \section{Software: Zellij} \label{sec:WP5:Zellij:software} -\begin{itemize} - \item \textbf{Contact Email(s):} el-ghazali.talbi@univ-lille.fr - \item \textbf{Supported Architecture(s):} GPU - \item \textbf{Repository Link:} \href{https://github.com/ThomasFirmin/zellij}{https://github.com/ThomasFirmin/zellij} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Université de Lille\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria Lille\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +el-ghazali.talbi@univ-lille.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/ThomasFirmin/zellij}{https://github.com/ThomasFirmin/zellij} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: Cecill-*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{WP5: Zellij Information} +\end{table} \subsection{Software Overview} \label{sec:WP5:Zellij:summary} Provide a brief overview of the software with respect to WP5. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.25\linewidth}!{\color{numpexgray}\vrule}p{.6885\linewidth}!{\color{numpexgray}\vrule}} + + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Features} & {\rule{0pt}{2.5ex}\color{white}\bf Short Description }\\ + +\rowcolor{white} Metaheuristics & provide short description here \\ +\rowcolor{numpexlightergray} Iterative methods & provide short description here \\ +\end{tabular} + } + } + \caption{WP5: Zellij Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:WP5:Zellij:performances} diff --git a/software/zellij/zellij.tex b/software/zellij/zellij.tex index 2b5c1a3..91f6828 100644 --- a/software/zellij/zellij.tex +++ b/software/zellij/zellij.tex @@ -3,11 +3,35 @@ \section{Software: Zellij} -\begin{itemize} - \item \textbf{Contact Email(s):} el-ghazali.talbi@univ-lille.fr - \item \textbf{Supported Architecture(s):} GPU - \item \textbf{Repository Link:} \href{https://github.com/ThomasFirmin/zellij}{https://github.com/ThomasFirmin/zellij} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \begin{tabular}{l} +Université de Lille\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \begin{tabular}{l} +Inria Lille\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Contact Emails} & \begin{tabular}{l} +el-ghazali.talbi@univ-lille.fr\\ +\end{tabular} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} +GPU\\ +\end{tabular} \\ + \rowcolor{white}\textbf{Repository} & \href{https://github.com/ThomasFirmin/zellij}{https://github.com/ThomasFirmin/zellij} \\ + \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} +OSS: Cecill-*\\ +\end{tabular} \\ + \bottomrule + \end{tabular} + }} + \caption{Zellij Information} +\end{table} \subsection{Software summary} \label{sec:Zellij:summary} @@ -19,19 +43,77 @@ \subsection{Purpose} \label{sec:Zellij:purpose} Purpose not available. +\subsection{Programming and Computational Environment} +\label{sec::Zellij:environment_capabilities} + + +The following table summarizes these aspects for Zellij, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \begin{tabular}{l} +Python\\ +\end{tabular} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} +MPI\\ +\end{tabular} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \begin{tabular}{l} +None\\ +\end{tabular} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \begin{tabular}{l} +Checkpoint restart\\ +\end{tabular} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \begin{tabular}{l} +None\\ +\end{tabular} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \begin{tabular}{l} +None\\ +\end{tabular} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \begin{tabular}{l} +None\\ +\end{tabular} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \begin{tabular}{l} +None\\ +\end{tabular} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \begin{tabular}{l} +None\\ +\end{tabular} & List of software Zellij has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{Zellij programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:Zellij:mathematics} Mathematics not available. +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:Zellij:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::Zellij:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + Acknowledgements not available. diff --git a/templates/desc-software.tex b/templates/desc-software.tex index c201e5a..0f51d4d 100644 --- a/templates/desc-software.tex +++ b/templates/desc-software.tex @@ -3,11 +3,25 @@ \section{Software: \VAR{software.name}} -\begin{itemize} - \item \textbf{Contact Email(s):} \VAR{software.email} - \item \textbf{Supported Architecture(s):} \VAR{software.architecture} - \item \textbf{Repository Link:} \href{\VAR{software.repository}}{\VAR{software.repository}} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \VAR{software.Consortium} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \VAR{software.Partner} \\ + \rowcolor{white}\textbf{Contact Emails} & \VAR{software.Emails} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \VAR{software.Benchmarked} \\ + \rowcolor{white}\textbf{Repository} & \href{\VAR{software.Repository}}{\VAR{software.Repository}} \\ + \rowcolor{numpexlightergray}\textbf{License} & \VAR{software.License} \\ + \bottomrule + \end{tabular} + }} + \caption{\VAR{software.name} Information} +\end{table} \subsection{Software summary} \label{sec:\VAR{software.name}:summary} @@ -19,19 +33,59 @@ \subsection{Purpose} \label{sec:\VAR{software.name}:purpose} \VAR{software.purpose | default('Purpose not available.')} +\subsection{Programming and Computational Environment} +\label{sec:\VAR{wp}:\VAR{software.name}:environment_capabilities} + + +The following table summarizes these aspects for \VAR{software.name}, providing a view of its programming and computational capabilities. + +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{lp{.3\textwidth}p{.5\textwidth}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ + \rowcolor{white}Languages & \VAR{software.Languages} & Programming languages and language standards supported by the software \\ + \rowcolor{numpexlightergray}Parallelism & \VAR{software.Parallelism} & Parallel computing methods and frameworks utilized by the software.\\ + \rowcolor{white}Data Formats & \VAR{software.Data} & Data formats that the software can handle or produce.\\ + \rowcolor{numpexlightergray}Resilience & \VAR{software.Resilience} & Fault tolerance and recovery mechanisms employed by the software.\\ + \rowcolor{white}DevOps & \VAR{software.CI} & Outlines the development and operational practices including continuous integration, containerization, and testing methodologies. \\ + \rowcolor{numpexlightergray}Packaging & \VAR{software.Packaging} & Software packaging and distribution.\\ + \rowcolor{white}Testing & \VAR{software.Tests} & Testing methodologies employed to ensure software quality and correctness.\\ + \rowcolor{numpexlightergray}Containerization & \VAR{software.Containers} & Container technologies used to package and deploy the software.\\ + \rowcolor{white}Interfaces & \VAR{software.Interfaces} & List of software \VAR{software.name} has interfaces with.\\ + \bottomrule + \end{tabular} + }} + \caption{\VAR{software.name} programming and computational environment} +\end{table} + \subsection{Mathematics} \label{sec:\VAR{software.name}:mathematics} \VAR{software.mathematics | default('Mathematics not available.')} +In this section, provide a summary the mathematics used in the software. + \subsection{Relevant Publications} \label{sec:\VAR{software.name}:publications} +Here is a list of relevant publications related to the software: + + \subsection{Acknowledgements} \label{sec::\VAR{software.name}:acknowledgements} +The software has been developed with the support of the following funding agencies and institutions: + + + + \VAR{software.acknowledgements | default('Acknowledgements not available.')} diff --git a/templates/wp-software.tex b/templates/wp-software.tex index 0addd27..3b01520 100644 --- a/templates/wp-software.tex +++ b/templates/wp-software.tex @@ -1,17 +1,46 @@ \section{Software: \VAR{software.name}} \label{sec:\VAR{wp}:\VAR{software.name}:software} -\begin{itemize} - \item \textbf{Contact Email(s):} \VAR{software.email} - \item \textbf{Supported Architecture(s):} \VAR{software.architecture} - \item \textbf{Repository Link:} \href{\VAR{software.repository}}{\VAR{software.repository}} -\end{itemize} +\begin{table}[h!] + \centering + { \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + {\fontsize{9}{11}\selectfont + \begin{tabular}{!{\color{numpexgray}\vrule}p{.4\textwidth}!{\color{numpexgray}\vrule}p{.6\textwidth}!{\color{numpexgray}\vrule}} + \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Field} & {\rule{0pt}{2.5ex}\color{white}\bf Details} \\ + \rowcolor{white}\textbf{Consortium} & \VAR{software.Consortium} \\ + \rowcolor{numpexlightergray}\textbf{Exa-MA Partners} & \VAR{software.Partner} \\ + \rowcolor{white}\textbf{Contact Emails} & \VAR{software.Emails} \\ + \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \VAR{software.Benchmarked} \\ + \rowcolor{white}\textbf{Repository} & \href{\VAR{software.Repository}}{\VAR{software.Repository}} \\ + \rowcolor{numpexlightergray}\textbf{License} & \VAR{software.License} \\ + \bottomrule + \end{tabular} + }} + \caption{\VAR{wp}: \VAR{software.name} Information} +\end{table} \subsection{Software Overview} \label{sec:\VAR{wp}:\VAR{software.name}:summary} Provide a brief overview of the software with respect to \VAR{wp}. +\begin{table}[h!] + \centering + { + \setlength{\parindent}{0pt} + \def\arraystretch{1.25} + \arrayrulecolor{numpexgray} + { + \fontsize{9}{11}\selectfont + \VAR{software.WP} + } + } + \caption{\VAR{wp}: \VAR{software.name} Features} +\end{table} + + \subsection{Parallel Capabilities} \label{sec:\VAR{wp}:\VAR{software.name}:performances} From c40d9a913f12b2f3eb084808e358f7e853338219 Mon Sep 17 00:00:00 2001 From: Christophe Prud'homme Date: Mon, 16 Sep 2024 11:05:55 +0200 Subject: [PATCH 2/4] up history add information store in excel sheet in the report #15 --- exa-ma-d7.1.tex | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/exa-ma-d7.1.tex b/exa-ma-d7.1.tex index d75c641..02f6898 100644 --- a/exa-ma-d7.1.tex +++ b/exa-ma-d7.1.tex @@ -95,9 +95,9 @@ \delivResponsible{UNISTRA} % Deliverable Version, Contractual and Actual Date, Dissemination Level, Type -\delivVersion{v0.1} +\delivVersion{v0.0.5} \ContractualDate{15/10/2024} -\ActualDate{dd/mm/yyyy} +\ActualDate{\today} \delivDissLevel{PU} % PU, PP, RE, CO \delivType{Report} @@ -117,8 +117,10 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Change Log %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\istChange{20/08/2024}{v0.1}{Prud'homme Christophe (UNISTRA)}{Draft report template} +\istChange{16/09/2024}{v0.0.5}{Prud'homme Christophe (UNISTRA)}{ToC: add list of computer science features per software, add list of math features per workpackage, add statistics about Exa-MA software in chapter Software} +\istChange{02/09/2024}{v0.0.4}{Prud'homme Christophe (UNISTRA)}{ToC: add profiling tools in methodology chapter and udated the chapter overall} +\istChange{30/08/2024}{v0.0.3}{Prud'homme Christophe (UNISTRA)}{ToC: setup architecture of D7.1;add benchmarking methodology chapter;add samurai software to be benchmarked} +\istChange{20/08/2024}{v0.0.1}{Prud'homme Christophe (UNISTRA)}{Draft report template} \istChange{}{}{}{} From 8d73feb5341f49688a32a6e7ef6f1195db3a5841 Mon Sep 17 00:00:00 2001 From: Christophe Prud'homme Date: Mon, 16 Sep 2024 11:16:31 +0200 Subject: [PATCH 3/4] up language add information store in excel sheet in the report #15 --- chapters/software.tex | 2 +- gen.py | 2 +- software/feelpp/feelpp.tex | 4 ++-- software/samurai/samurai.tex | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/chapters/software.tex b/chapters/software.tex index 623205d..aeb0890 100644 --- a/chapters/software.tex +++ b/chapters/software.tex @@ -23,7 +23,7 @@ \chapter{Software} \begin{figure}[H] \centering \begin{tikzpicture} -\pie[text=legend, color={red, orange, yellow, lime, skyblue}, sum=auto]{15/C++, 1/C\#, 3/C, 4/Fortran, 4/Python} +\pie[text=legend, color={red, orange, yellow, lime, skyblue, pink, cyan, magenta}, sum=auto]{11/C++, 1/C\#, 3/C, 4/Fortran, 2/C++17, 4/Python, 1/C++20, 1/C++14} \end{tikzpicture} \caption{Distribution of programming languages} \label{fig:languages} diff --git a/gen.py b/gen.py index b589e80..72da103 100644 --- a/gen.py +++ b/gen.py @@ -170,7 +170,7 @@ def normalize_languages(lang_string): for lang in languages: if 'C++' in lang: # Consolidate all C++ variations - normalized_languages.append('C++') + normalized_languages.append(lang) else: normalized_languages.append(lang) return normalized_languages diff --git a/software/feelpp/feelpp.tex b/software/feelpp/feelpp.tex index 21f5252..085178c 100644 --- a/software/feelpp/feelpp.tex +++ b/software/feelpp/feelpp.tex @@ -64,8 +64,8 @@ \subsection{Programming and Computational Environment} \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ \rowcolor{white}Languages & \begin{tabular}{l} C++\\ -C++\\ -C++\\ +C++17\\ +C++20\\ Python\\ \end{tabular} & Programming languages and language standards supported by the software \\ \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} diff --git a/software/samurai/samurai.tex b/software/samurai/samurai.tex index dbbc4a2..41d42a9 100644 --- a/software/samurai/samurai.tex +++ b/software/samurai/samurai.tex @@ -61,8 +61,8 @@ \subsection{Programming and Computational Environment} \rowcolor{numpexgray}{\rule{0pt}{2.5ex}\color{white}\bf Category} & {\rule{0pt}{2.5ex}\color{white}\bf Details} & {\rule{0pt}{2.5ex}\color{white}\bf Description}\\ \rowcolor{white}Languages & \begin{tabular}{l} C++\\ -C++\\ -C++\\ +C++14\\ +C++17\\ \end{tabular} & Programming languages and language standards supported by the software \\ \rowcolor{numpexlightergray}Parallelism & \begin{tabular}{l} MPI\\ From 9c593a4ac5c254823bfa7a14c59016b68a1a1adb Mon Sep 17 00:00:00 2001 From: Christophe Prud'homme Date: Mon, 16 Sep 2024 11:50:02 +0200 Subject: [PATCH 4/4] update Trust to be Hybrid (CPU and GPU) /cc @pledac --- chapters/software.tex | 2 +- exama-software.xlsx | Bin 213138 -> 213174 bytes gen.py | 3 +-- software/trust-platform/WP3/WP3.tex | 1 + software/trust-platform/trust-platform.tex | 1 + 5 files changed, 4 insertions(+), 3 deletions(-) diff --git a/chapters/software.tex b/chapters/software.tex index aeb0890..245a08b 100644 --- a/chapters/software.tex +++ b/chapters/software.tex @@ -12,7 +12,7 @@ \chapter{Software} \begin{figure}[H] \centering \begin{tikzpicture} -\pie[text=legend, color={red, orange}, sum=auto]{13/CPU, 7/GPU} +\pie[text=legend, color={red, orange, yellow}, sum=auto]{13/CPU, 7/GPU, 1/Hybrid} \end{tikzpicture} \caption{Distribution of hardware architectures} \label{fig:arch} diff --git a/exama-software.xlsx b/exama-software.xlsx index 294bc42c1633e6751476c19ded9274d10c027a4a..624c4232caf01a588fbd1783f5c680d437ccadf8 100644 GIT binary patch delta 91678 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\v z;906d@An<0GkeXq*5OVVr>Ro%^UL&7Tii^}jq~5XX?n>z{?*@4IlmjSdG^RBTfb$0 z{(AKIdwVJCFEy)id^Icg;xZbE@VA(9$`{z*a?V$RCtcvN{IWrqT1XBgou}tKCvO%^M@c*7xuXf{sRd~>6wi3nQ8T3e(>R1W* z0s0gdvPB9WLMMpQ@MClZnU#h0&~F_Atj9YmpyAS!r`jgM3qc2wSOUBiU5Z%^OR{J1 z(@OZY5b4!0%8aO@b2kNO^#V#OY%SQ>g&-k_i;D~TW&Tr+#u04rjUcattd(ODW6o?yz?m}b7zvNKDlRazizR-ZWrv_c;FTWItOU?* zGELS(0{KS{=I26vd6#I2BCYbU2>Ue(;-L($rZrQz5tTJe2Rdtj@>_Z+L{JlbYwQyF z{EA>b)QCp(Bp?sh01^<=8x#{~jJXk(hxySt%ua7JX6J)C19Mb)U}wDrv#VjX!<(aa zG<9=kKr*PzPxrP<9fKjrMPX?`l8B)KtcDT>DFDJjYs^WJ0xZIf0=M$`7X%@}im)*I zcN@&tPX!iD75139ts+yCFB;Dy2P|IF{}V486=_w3$*9NWYk~O%7u1|q;(|lW)-uzE zg=@YO3nO?Z9?1mrSY^ZRl;e{?7($?|i|ew(ownOu78zY&z+xeK0tS`eRSnMdxo!;5 z2SE~K7FBhl7pB48ixWAo#MF?X1hlp8#cGQ5D8V9_0PX1FtL}iJ_z#MHAC%&vFXz%0 zMTywXA-k1f9gN~+GiBBSP@MmRB0CUMaW{|?=~QM>p&P>NteqkF-%Z|J<3%_6&tR-V zQ5qyl1r|V)j0Mse#tfucWg(EzZ%xN_0X*;z6=UHTTw0X{9u~!f?^j)byP1rQYyt57 zf4~zCVQ>a3Ts)c?fPOTyB~e-GY9POARN6YK$kL33f+aR<tH!7_jNouc0<4@`wyn03AE@05hP$8Gw)IB zfCM^{0)VL4I&`=Pd9^V7fewukadqaZp*k4aAv+d^G3d||$pAx4en`5Pf*;7$9UpV6fvPE{7nAMKKPh(Xukc5Q+x#va{9zdCSZIb5cl>2BtPe6HG17 zq8Z;5L7r;Bd_XZa<&+Jkgb_X>%#R5fzc#863VgKiK@d2Zi{+Dr7!hGbG*Ukz;BwBV zx#Y_uH;BLKqpx9HV}R=yeIp&6qV>{o2wC&DrBDH88KwE#a#tZXb&qAL;06Z1e*=f$ z*Z&4j7Gaha>zTpUYXLPzH^H35(k8){PM3fs5#%+i`KwZFPFCwT1=||LRtsK>#)rW| zDrlh<|IK*25<^e2pxL>q(K(t-HBN2u{;lC+a(taQLV%zxgG*EDPy-M15gGzmO4NXv6DvZl*eu$1a$v3xHmAL3LF>@FLiLJ8$vwDun>6NF%FT| z#&U?LYJ-Hi&I1k!#9MpeVs&2KZ5oM#pnYJ=TwM205VD&L3nL}k3oVkp=UH+E5Tpz) zlEuPqAbr}fCe}wDlurI>E(qe#T*_C95J}8FawP#FANi2C+OPz&lAjHaq>~ml@ri@^ z2K=!QWWJwci5x=#rkoxUvvyxll9Xg7i82`$!Q30w>x7 zZZb)7010*xUkmh^_#0%e?2qh?molmO%2=s`JcS3e93g08oP9|qxXPK-vgK?z#88)6 zTq|85GL|dF0Hid7iye=g2Md^E*4NmB@KTo7qb-J;8!_P=dJ8!; zIPqDl7-*UV4YpVlV>?C)UZ%!!8)Q9!eK9k`g~^-_n9(c0L=Om?J%Dk5li8WQ#Cl5M zV)#`=MxVK5nCS!H)pHmy4&)NcIP39Ei-FA-n0~>5hRki(YK4=SIf!TuT!M=uibv-4 z;q_Qkv!02tm~S;=XTTJ47?gxvqaG7tRS&Xo&w$w&&0qnRX0Ri&40fRuLzoAn{Pmk1 z{mH)gzLS8c7&32NwuazdbpY81zR(<WhmX-=D)QbCRzin-MqucUs2RcH V=+F!unjw3QUAv?q_j}*(`)iCkV~(}= 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%0A?|7?h1+rFTg0LHUH5?ZSq@0)`XggZo1$5bm};cj z6K0~MUNPo~*7Ldb(kRTO2qbN2jfg0a_e9r;2L}v270Cw^8iMqP28#v{0fM6;aZtnp zl_XT4p`<0Dhz?Mry{)m5;2-g*88|EP^kiM|*%gY+*Cu(x5l73*o-@ zY-^keIOKW!UKL_94+>)eSk%)4b^akra+r_c{_&>8qU@Mb&#`!+m0W{^;H=;2PEQ&N zwo*7EL8qWD1p81DJQxlt5;77B2Z@c$Mo2?wIjJtG4$JU!)nys!jjIdWaZ*0r`SYb> zFaG>S!R5EW%B7poOZ3qd^ASv4Tc&(MA)@sVK@)*0K!Al6~LDlaM5lmI-CD zL?J}78%wB=ovcH4gUK?+%oy{3rtZD!cHj5^zVE%a`}v&DZ=UBl%lDk$`JM0io%0-z z6MeOhc|iW-V@#_6=V`tR1MqWC>gxpOQF*bEPjrI#gv#i4Rfy?cTY;QG7E=ewExMA} zeF!QGTGyOz)%sGigPafIIBe^a{VlE(YS!+x!3CgGb)&r^Sq|0cpNX2|1;))KWAj8< z@voYMiZhy{ZxtekuJgQnF#O=bcD1-h=MOvY?z-}}t87SAYW~x1CFK-uANRbMYH_tg z`ON$}9{b8($2RvK8_sJlWrg)wVH;`WCFk^f9EG^l9tr%;IV|4FZsL^#TSV0T)tsS2)B1Z3-{?JeV701?B>QC=?TgP?G7K(X zHm%hXtWr;G=Tmrg2O5?oCqA%?HomyniuM*rG7pP(DBLrACe%D^v4y2~7ZLSRPjV{z zxiYFLIzh`%HKnI$vjcQzyi;8s$I38QY}NLrWQh|Bm)L>txJ860BIKlHqP3mr_&Y|~ z)DKNEg{ea?i~G6&b8`DL`|?wli_f;7D#C|^?Y(kQ^boIAd>BJ%SwMs7$&12`B62l0 zobH;gwtV_~$Ybd66EC<@YHc_L#&3)JiD;;_dkft^#mW@DYr(~{zHEh9f4uOC1qP6b zO-W9#J<^Klr;(R_^m*7Ft?@B*LCbQ>gx+!M$+804pbG^6(XGj`3bO3Am4y-Ht=o92EOvbEe)#&ya8&;W>2*^t_q% z5mXl*$Hn=e`2n3Roz3IWufCYx9&|sgi1;>#?fz+ykAlNymJwg-o9~ zffH`-}S4mvWUoDP;c8KkH>R7;IO?O zA0LzXm`-Z{weE3$=pheWeTTrIc2mx41L>6$?IIGI&3isZBKf*}KTW5Z6zp23+6RwI+}bKV&lnlzW0MK;ScM!KgOr(E~uc$))K+sXn)8>Ps@Dw#*I3E7F< z7c$#@T=bgKf^(RP@D_=BF}RX`K&S)92#zRyH|WDofZs3?VwTP0gUfM4?)3IjYPXqG z)0ug9>Mr}+O?^8i-kg;qN}QZYg|gn+sg^0UxwBZ|lH~L?2Hu;uxiULok`Vn^&K*O| zk24wHX0G#{=k8uMeLKr6kvsg|T$vA8NK6;-TPZjCRbB zH9M+S?fJ&++I>#GMCerL&goESYY6Bj5z=A~i92UrRyQE_@5?Iy{iI%I%rvMRrM&?R zaq3h*iRva@-;Cn{zM*~SbV0l@i@3*mWh;@UyC03%?xt;h=6j5} zM6l1uGggPR7WotnqS+qAy$@xjGX<~dQ~SE#)5N=|9ibuKe%_o?mDCIg z4ivw~u6tuEN@^Ph^L62siUMdOw?s{Y=Ja;MoJhy=6F2pkA2vBmLrdaC*FdJJlal2$ zm(}TySM!9dIIIp??Ws9^@_pDr&TGdn>78b0j--yo(GN`*4G&dBZGN2tjjGSk&~rGJ znKZJaD=T`kljq{q8fJN^LXQJ`ATvcaweK@8!pGmrh5`JK(>^}Ly({WuoEMD010{6V zh2o!YeQ;TCx9;WQ29B~u@y^)ydAo;>D`f0x%SgW<_o`|gvDv}w?hl5gpig{J%*}ga zA(o{TJSMeIL+-eohMd~H-3h{49L?-DH*#j)HrW|QmPHws0JH`?6N&h> z-OT3M_6=GL6PzLiEb?L;u@4nG+x(-pTXE1jYVy7+(<@43=jS3zh?nyD&TX}O6yM;(f>iY^O3OXvNmpRredc&6Z@$ieKbdlk-)>U^WT z`mj5PAB5%Yw*vNC$=1l!G#!&e)mLV^<4<=LN?rUM$q{_NLh9vKWeKAOY<>i%Z%U18 zK@Xf&CELyy_wp#m4*K9!m3TJtb+<7!+#GeeQKNh{_hrOI@APZZ`3>iBAnzM};r;ki zpPg6c<|Oh+HX#Y~`_6qw`=fWEK$*v|W#quK%8BE@u70CAwAuH5S^R=K8!1^zG9CJc zIrDe&t>IPovC}sv1Y&oK;l{aB*xNQG?4*gj`sR(R-&Vsu15G-ICY5JZ+Ew--D@53S z)U#dn+pUr}-4ns{x=5A*pst_#N^)8y>bne*Bdt-AdY+}bfxVO96cn_Z^Hq#7F%1Qd z$ZrQ^^}b(LFlV(iKHjfxI(zQ^qrkKzW5I@rz*4W*r))|EIzkgXcU$Q+=@$>bJMZFc z>y^P-n`b{$lQ%QdwIyI{Ol>4<=gGDmdYD%)8Nv&=PBM9Fsv2I4*}YeMt&($A5&$Q0 zn%X!Iuos&np%WwZDao5xK#ypYhQaau_mr9;ySZUs>;%JazJ*4O(dmI-r|@`i3csEb zUze%m8Ph3_iK9X8oaVAu-Y3b*Y;fSfDQ@ANmZm38{;)p$G9h|fmK23M-OlG@>7}s& zr)QPdYP~Ohu^~+pP0K@2>e$;JDKAtlD$*AgmKb}Ny@MB!G#DQe*ss?WxG%`TE3<<} z_8LydLe8a5`Upu;eO3CBQCw&9s1^6Ro7EvCZe8mD0c{Hd>%;Hp;lo# z;;-U+h;13~cu&Jn##+W?$DuuB^3LlV=%H&aFym)J=#bg^Aux;h&)#HPK)iJ?0^Q-pmzTTP9UukYPq6c19o zmyQ<@ef3u=Rp0s6<@?UElii$w2~Q(znA4rSZJb5F`ZVdFOOtG$o|oA^u*W9PZC_GG zjM+Sd$>Wl81wGhRdTa&?yN&}O3&@3)oa%7{*GbCHLcX``P#~62#nAU+uBjSH-SslJ z00%$ZvbX4$jte|U28~+hN25*_`^Bi~z8bZ`x%+;BY5Oi<_b)!bGo*GZS_emS%X~$sXlBOy+=UhMqIQNHZX=B=_n@1l#3M|e0%9`uLC(5c5j}RW=;S%3Sh}~= z@KC)yoW70IwmjbIy|S=(kqrW-*`|r*|A!xo#i5FAiNv&6M9aVw?gHnJ8pzX zikIAX2k8H02ij(5miO<$r3J*qVATp8Vx~T?OCY+C1^_LyipN!@O7}et%C!p~Q?_CI zZ1-G;dp_g)W^XT_S^hGQL^0@rp8L&RnN%^caQ?>o1ZjxldKfF?o)IyTbrI29ZxUm# za&fvJKdy7SiHS)`=$shnxIc_9NfUpua$4;bbg)fK!>v3H2-hCAYJQcW8##;6Fnry1 zS?~19HFNn}3Qu)rWWACp z*)u4iBUT)R;Z9p04{nDFoYpouWd5YSUuLk!IoaXE*^8o;>aOi4%=J>zU!A$(W2`?@Zw(cf6?%AWXe+Td}fS?P)Qp*UI@6m3_EN=m4@u27a_0DCxpc1*px zu8V={flZHZve!8U<-JiG{C2a*aLSEGtrx7#1{aKT{PD`{^eVs{4HB@JE^xJ80v*o_v&rr0$R9R!*=w5kE2(vTUh8I56~K*ILOHUdh&RaPn}uq32`z zWWq_!AzqSrSKurPpqop*3!Rq!c54S*)J$pqvZx7(Tw(X}YB(i!m&0;g@h+Sw7MXmA#hTo5ag<=PQ&?y9+#WKU03a;rJVR-K5LLwLO!Sx1Zlx-x;#i$V#6- zP44gmKGOuD_qXcV#-zJZ#Je8aeQnsfIb}9^#N1@ZSla7ztfv{N zcD^@ztENc+?M~dnaXX3g^eoa7)ggysH5r)Qxeg}KXlhdOd<7CefUeWcW7Ms}+6*7- z)RM7?(G^8oNNKVZQ}sHtQn3`*9_oVD^d&e z?`m7mDj6Q~W?(t0a(L;%_7SGI&eO=<@qF3$d2Ug)Ls{PiX8~2TGgcuci{!SnoY&`q6#$L~tRpjUh{t^;_tqN= zaMHba60U6}*A;_rh)HyIT`D#oRDqK4Sq*4pObisD5cU$+*8T7hcwlM2@}M)N4_Dj) z@0BNzgK<^^y6a0yQKFRn9{_R>u=bja9c(aObHNK$zN(~z99bF}oP3<2m_;fZr1+u& zyLbCy*5~~LgI<-Q&})9~j##xrvGIXN0yR7QGd@JTBQB7ZP!vweCyRAXEb`?&l)vvK zK!Kv`)#E80`08k{ub66C*~f}oSA5ClzGUQ}>6FFwS4Bg?ZWXWRpQZ(p0;U+E#8Yww#1_f16(KE4r1h|7Oj zJ6%~jEj`pS@9rDUh&tI0kC|=}xHKkhq4DY{fPPGoW=e?+JdzCEf`@LQ?1hTV+Z>1A zSb?6Ta0+V7kKZ7&&%+skl~Z>=eAHtcdY$z>1*nJ|H+&|L+gRCvqMbFLjki1I+`k;dFz93*=P-Pyyj(BAoZ2Pb$ctOTh z%U$`u-R!V*MrLK!JVVt}pNUAvs^)h8JWF zmI#6G`oG5Bq1b=>u6#eh9~0jmars74qim?id5*kI@&r=#8T-J3#Azkho6R%LLlwkp zqppIzE^cSvi%Tv>s$ah?e|oX_V;Z6V4RI2SWvi5bHnR_XvP@W4wA=3d1#~)aOIMv> z;e0nuK<;XJf=PerP>fUA%_2=6!`e&8v1aL9^>}sfrNW?sEO`7$AhA)q_k$0AME`|* z6W#X@ifeDL!#M5~TM~v|*0g{L+2lvfh^{##&SyzqTxqMexnjm+xNwneRJiO;0^_Bl zgd2Cy9INEi<4HVuPko$ZMQPoQ*XCC3Fuw>`d~!I{5b3>dsV#b;^}2hdUFWi@l5JUT zyHDF<#cyCzUijMpxMKSZFQ3SWout;D`CAey?Sj+<8<-i&N4aO z8V^1Gd{F|j;Ii=}Q6pJ5S6-v({?|}gUWRp91$J=+EqBDw7s)VbwN|iis0H?bZ#kwKKj>R^SGF@6tQ?8 zfz-KSlf%4jg4v{jO?7%gk1y`tBE0Wec+Hc?7cJfOTBj~Vr<$@XTUkoBCLQYo3rNc0 zu`p%HWx*x$4yklt4QSN-Iyc|{Ogs>B(2Vz1!P5*ryB@74?tV`=nM1vqLk=m0A3I7@ zYx@Fj`IP;YBwgJTON)nXLsOHCp`jws_8}3e)`L}@`DtXWC%~52H+JD|@uDz2dcOzT z`WTxaj!*X_AE0w&sb=3tJJM`|bxYc_Me*u=OY;3=qnk>l<8|HZurS6g4%PntxI3DRk$E)RhN{c5{Aqqkt zuE9XQaB@fMRB%1l`>PrZ75DwBw@bNwDU8+Vov?dld+}~yE05}c$2%iGPB&)8`5k(( z1&r62j;R=lMt2jhcAaF8XPmvYXV*i<#l(|OxM{eO^-BA7@3r@?48uzfa`oNlI$JEm z_0j(=b_>%S$LIs5*+;^|%PHs0oV}86ZSD2p64Zg8?Dh4OL}*F9j+%W$6X}D>oS*C; zY-GFn;tkDN10kSm9%hgeYv#nkz02c%U8F-v<=CZyLiSh;CNtNA_FdhC^vH=EpLBzw z={dTUP%HhIP5QcTnMVh+VXntFsyTX0wO&-^w4AI5^E$8?=<{+SH^d3b%d;xI&kszltOSh6yRypSlP^pw#5WY^QgNJA;bu|>O!B;AGO zFMnZcyglkzz~)VxoCW@Xi4nUMX_*mo^pFqKGhDyYF(60%%c94L{pW=>*{>rl(ILaZ z_L-SkY}ZR)zSTTQcdyHo{^DMG`_$^%a}STeab%SfSrIsj^Z9W$IlJo?dqQn`j%lf4z}Y!PZ{ z8o4c75#a6WnOm7_%2z1pv6LU|tSPeOr%W8VWz^xkX1#pLc__tF3C;52!Gr7`en)xp z>?{UWySDvGHItKd686^%@P>Iq0{2c~%kmIIr7Ps?3HiYOGV*u5rJaB<|CQ)yUhTDxK+mT8wqH zt`P(H^ssjrrMpu`(CVK{_6Oz6(yZBSU+*KksYo+z>s^6ze}dX!6P=4^=p&>~7Rsk z=kq80Blq!g3g739zc(;W5Dd@Hxhyr-wTuM94aCztgz%=MS%dcRegOO#7@Hr#2 zz5nX*gT+UgtEaAW=Qp-aZF+Zpcd}zc#xXqiHT%FP>?ixjxTo$MA1)JP9ztEG`)Kh zch}w!W>st3bBpD!*NFzU>VXV)x+Tf*sx(MQ*tG@pIqidYPcW-Jx*fNpbuZ&5ud_lX z*7F7PE22G?I|UzZ-P{^>{NU;-1*uzwV$A!KE{dO#v`K%!lE8QK&9;NaVK29ZozRb0 z%dU=)Oab0Pcwg_J6_{n$@Z01asrLHXYPpfqrRrIMX`O(B>wK9^^gVX$553N87Zi3p zb~Kc!cu%a`!57a&PhY78RbhwxP$#$oQ3yR;MIZ}{6JLT0QiIDq=skQw&VRy@93ZzZo>8!k)t zIbnu-OZRc7uS7aiQ7bfjx0?%-h+CV$!MC)vSbJYTku-JzCTGs3;+HY|>0C;RqMkp! z)tRF7`QT|Gx4Aw1yiKiKq0C~h&pS*@6v`dhqBM-TE_!EnI7xl?bnWSc1SgJ%A(H7# z&JOyCRXzOa0F$nmxpsbIwey*R-a6-~J~{zZaza%)G~}R{%X8ryHz6V1E(5-2xst3S zxM^~4$uZd}L!$T7sk!Awy|dwar|x}~B*snC0&RB>u|w_~TO9MqAM;*QWFnOcr=Fl*>h+!Bi_C~p@Fg58+zQYO{;WC3t%65^-#O`+={&~yPP83dB5lx zeQm!U;n*twoqF2r;4wzgrYfN>I<>~R0H9xdp6rm6oHFNcJ!a>HE<`^fl z%3=ReTmMm+{pF`h#`cY#IA+Fi+EP1nIw3MOPp8{MlbQJNFj#iNd~DnPf#x!ogu_M& zdkwY}gna;Zog8Bg-~ExuT_btp7^mV0q$|vnJ>2sAb-H$M#*#aZ^-ps`8ymQ3P7RjT zNx0vVNLJdtNsRm2j)1gLC65D(`4S6FgX-2tvPWJf%5^U=h9Rz{pUPx4Iqk}!Uhjck zF=@S;b@b%jDsn|)@4dZDZ7&Yp5A-TFS+q^K6{i@UHwI`6J-jCrzWbqu0F$VMKiH*b zs%XP^`-pPa9G90L7=4Mcdx^Qrr;?-3iZ&~MIp(3hU9t+HjeH|zRBn2fi>IK!Nu)f% zi}S7YaT5lNz;5#v>mD)L$nZshLe8vr23&96#U7)f^5VuGfAFTI3Z(fR80uZ9zPZA))Oc}ARL#tsj@ zYN&ZBbfvw{S0+3>K|qjQ53aL=&C}_aNyql5=?{XU<>wD&xXF)lOW8eA@`&ULZ?IQ$ z5D}=4J~&!$?~tzj^gd(HD}Er*i;MBR<6_^_Jc%CbnFYzGEe2O4POvTczm{o;D>@pT(aMx@+iYL> zd;YA`k3NZiJPkZgv5ro+?KAL@=uR=sJ{3NC#j`B$*1P@6=S1#3*xV3@=LuIY6EKe9 zJ)VB%lA+~8%zKqHNina^F-~^g2~B&8zE0=gUM2Zl$f@I{hCcY_t+YPTKg#==yOonC zv+m7KKQq@-CPNR2K*gH#o-Mnqk+(ToIM}W!pRqS%7k!i;0~AXDp6q>(0u~QGdC7?8 z$WDkZTyigC;>?pQs4ZT=2jT(5cF ze$4gEwC6!@JYpV6q`ftayp|~=;(1yi++geT)Y!)-R?eNCjD<3fJ0^NgZOfi7gWvU%5s@!uRo%?i z8K_6-n=zNmh>V*y(aHRQBUQAQ1M>CAH`R%<#LuFBjbzW17*flb!~N|e|fzF2qw)M z0|AstY064-423w7NWo%M$*YJM+hBOUFGWyr-Cb}61tlQ`*0b2qYoC`Wfq}2cw~^$T z{#+DknF0`6kQ53KR9aUI>u;P(3KH}zizz`jRFVo88c84f;j`{YOfGC_TpC81*2My- zqw{kvc%KI3BC#82L(h+5@kdbWZ0kWW9diO=1bpA@B6PAJ{sB*N>Njn`dX%+{ul7HL zp-hLy1Iii=*K9suP|YhYfCHKzP*}n=5?fvm!q^)Qd|K>=+4sXZ`WNC3y7JFC1DZ|^ zj-Qq%fGfaWr-n0DWtIN9ZSF&WXz~uIcsm%p1r#Q0@8x`JhD!SA6{NQjZ+vij_Gupn!ZDHo_ZCK7IH#2W*J+Q zJbL6IeG;~@Oh03iq~Jv$OvFS@lP4m?(DS&6{5XYI6~T{u z`21Jv{rrhKgRUox;N!sox91fb8~lhLWK>j~bVubFg@h!Pcm=48W-z;!P|9x8#{TIXTT&0~S=*Iz6~_Y2nHg(WSz~46EC12=CG3%$+H_ z9v5VYmcQ4TMa)S~gLV0`?p@Mi_(VWbvXt4SDFpP;V9Xoc$#m60>%fIl6&D1hH$!@= zST~+GcVN_quum6eP)mI*BRHT>RU9IUcH}K_z z5fg|yi^ujQD3)5>erlDGwQkx!>gwD>k>W3Eq+JWLDA%2KCi>ivC?9(5+X6%TR2JOK-_pDJv&NOck52M>H?>;4_}j4UVd_;t}CHAbSA(T6wWz5-&Wz z2t7W&^l8ff9NL#(Svq5qWiwD76OVh4$3GdC*n^hgu6sOIv_;)tj39a9+@NM~qh6

jQj_l`;PgvIoha=9*TWZ;#VL@23U&ULxN{YWJu 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 SfRRPcQ(+SOqy(7Q(0>7{o-$nk diff --git a/gen.py b/gen.py index 72da103..a45e9f6 100644 --- a/gen.py +++ b/gen.py @@ -13,8 +13,7 @@ # Assuming the data starts from the first row and first column, and ends at column 'X' (24th) and row 46 df = pd.read_excel(file_path, sheet_name=sheet_name,engine='openpyxl') -benchmarked_software = df[df['Benchmarked'].isin( - ['Yes', 'CPU', 'GPU', 'CPU, GPU', 'GPU, CPU'])] +benchmarked_software = df[df['Benchmarked'].str.contains('CPU|GPU|HYBRID', na=False)] # replace # in Languages with Sharp benchmarked_software['Languages'] = benchmarked_software['Languages'].str.replace( diff --git a/software/trust-platform/WP3/WP3.tex b/software/trust-platform/WP3/WP3.tex index 0e115f9..c566a14 100644 --- a/software/trust-platform/WP3/WP3.tex +++ b/software/trust-platform/WP3/WP3.tex @@ -21,6 +21,7 @@ \section{Software: TRUST Platform} \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} CPU\\ GPU\\ +Hybrid\\ \end{tabular} \\ \rowcolor{white}\textbf{Repository} & \href{https://github.com/cea-trust-platform}{https://github.com/cea-trust-platform} \\ \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l} diff --git a/software/trust-platform/trust-platform.tex b/software/trust-platform/trust-platform.tex index e8744a7..4f3711b 100644 --- a/software/trust-platform/trust-platform.tex +++ b/software/trust-platform/trust-platform.tex @@ -23,6 +23,7 @@ \section{Software: TRUST Platform} \rowcolor{numpexlightergray}\textbf{Supported Architectures} & \begin{tabular}{l} CPU\\ GPU\\ +Hybrid\\ \end{tabular} \\ \rowcolor{white}\textbf{Repository} & \href{https://github.com/cea-trust-platform}{https://github.com/cea-trust-platform} \\ \rowcolor{numpexlightergray}\textbf{License} & \begin{tabular}{l}