From 1a7b33f662dece333565bf09ef149a7088b0dbce Mon Sep 17 00:00:00 2001 From: Noe Brucy Date: Mon, 14 Dec 2020 10:20:41 +0100 Subject: [PATCH] add galactica import scripts --- fragdisk_galactica.py | 315 ++++++++++++++++++++++++++++++++++++++++ ismfeed_galactica.py | 325 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 640 insertions(+) create mode 100644 fragdisk_galactica.py create mode 100644 ismfeed_galactica.py diff --git a/fragdisk_galactica.py b/fragdisk_galactica.py new file mode 100644 index 0000000..2ceb295 --- /dev/null +++ b/fragdisk_galactica.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# This file is part of the 'astrophysix' Python package. +# +# Copyright © Commissariat a l'Energie Atomique et aux Energies Alternatives (CEA) +# +# FREE SOFTWARE LICENCING +# ----------------------- +# This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free +# software. You can use, modify and/or redistribute the software under the terms of the CeCILL license as circulated by +# CEA, CNRS and INRIA at the following URL: "http://www.cecill.info". As a counterpart to the access to the source code +# and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty +# and the software's author, the holder of the economic rights, and the successive licensors have only limited +# liability. In this respect, the user's attention is drawn to the risks associated with loading, using, modifying +# and/or developing or reproducing the software by the user in light of its specific status of free software, that may +# mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and +# experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the +# software's suitability as regards their requirements in conditions enabling the security of their systems and/or data +# to be ensured and, more generally, to use and operate it in the same conditions as regards security. The fact that +# you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. +# +# +# COMMERCIAL SOFTWARE LICENCING +# ----------------------------- +# You can obtain this software from CEA under other licencing terms for commercial purposes. For this you will need to +# negotiate a specific contract with a legal representative of CEA. +# +from __future__ import print_function, unicode_literals +import os +import numpy as N +import h5py + +from astrophysix.simdm import SimulationStudy, Project, ProjectCategory +from astrophysix.simdm.experiment import ( + Simulation, + AppliedAlgorithm, + ParameterSetting, + ParameterVisibility, + ResolvedPhysicalProcess, +) +from astrophysix.simdm.protocol import ( + SimulationCode, + AlgoType, + Algorithm, + InputParameter, + PhysicalProcess, + Physics, +) +from astrophysix.simdm.results import GenericResult, Snapshot +from astrophysix.simdm.datafiles import Datafile, PlotType, PlotInfo +from astrophysix.utils.file import FileType +from astrophysix import units as U + +from plotter import * +import datetime +from mpl_toolkits.axes_grid1 import AxesGrid, Grid +from matplotlib import gridspec + +P.rcParams["text.usetex"] = False + + +pp_params = default_params() +pp_params.input.nml_filename = "disk.nml" +# pp_params.out.interactive = True +pp_params.pymses.map_size = 2048 +pp_params.pymses.zoom = 4 +pp_params.pymses.filter = False +pp_params.pymses.variables = ["rho", "vel", "P", "g"] +pp_params.pymses.multiprocessing = True +pp_params.process.verbose = True +pp_params.disk.enable = True +pp_params.disk.nb_bin = 100 +pp_params.pdf.nb_bin = 100 +pp_params.process.num_process = 10 +in_dir = "/drf/projets/alfven-data/nbrucy/simus/fragdisk" +out_dir = "/dsm/anais/storageA/nbrucy/visus/fragdisk/mnras" +nml_key = "cloud_params/beta_cool" + +# --- Runs ----- + +pp_params.astrophysix.simu_fmt = "beta{nml[cloud_params/beta_cool]:g}_{tag:.8}" +pp_params.astrophysix.descr_fmt = ( + "Group {tag:.8}, $\\beta$ = {nml[cloud_params/beta_cool]}" +) + +pl_orp = Plotter( + in_dir, + filter_name="104_beta4_jr13", + in_nums="last", + path_out=out_dir, + pp_params=pp_params, +) +orp = cst.Unit.create_unit("ORP", base_unit=pl_orp.comp.info["unit_time"] * 0.79) + +# JR13_TIC +runs = "*_jr13" +pl_jr13 = Plotter( + in_dir, + filter_name=runs, + in_nums="all", + sort_run_by=nml_key, + path_out=out_dir, + tag="jr13_tic_mnras", + pp_params=pp_params, + unit_time=orp, +) +print("JR13_TIC defined") + +# JR12_TIC +runs_12 = "0[0-9][0-9]_beta*_jr12" +pl_jr12_tic = Plotter( + in_dir, + filter_name=runs_12, + in_nums="all", + sort_run_by=nml_key, + filter_nml=("cloud_params", "!=", 7), + path_out=out_dir, + tag="jr12_tic_mnras", + pp_params=pp_params, + unit_time=orp, +) + +pp_params.astrophysix.simu_fmt = "beta{nml[cloud_params/beta_cool]:g}_{tag:.4}" +pp_params.astrophysix.descr_fmt = ( + "Group {tag:.4}, $\\beta$ = {nml[cloud_params/beta_cool]}" +) +print("JR12_TIC defined") + +# JR12 +in_dir_conv = "/drf/projets/alfven-data/nbrucy/simus/conv_disk" +out_dir_conv = "/dsm/anais/storageA/nbrucy/visus/conv_disk" +runs = "[7-8][0-9]_beta*_j*" +pl_jr12 = Plotter( + in_dir_conv, + filter_name=runs, + in_nums="all", + sort_run_by=nml_key, + path_out=out_dir, + tag="jr12_mnras", + pp_params=pp_params, + unit_time=orp, +) +print("JR12 defined") + +# JR11 +runs = "*beta*_jr11" +pl_l11 = Plotter( + in_dir_conv, + filter_name=runs, + sort_run_by=nml_key, + filter_nml=("cloud_params/beta_cool", ">", 3), + path_out=out_dir_conv, + tag="jr11_mnras", + pp_params=pp_params, + unit_time=orp, +) + +print("JR11 defined") + + +pls = [pl_l11, pl_jr12, pl_jr12_tic, pl_jr13] + + +# ----------------------------------------------- Project creation --------------------------------------------------- # +# Available project categories are : +# - ProjectCategory.SolarMHD +# - ProjectCategory.PlanetaryAtmospheres +# - ProjectCategory.StarPlanetInteractions +# - ProjectCategory.StarFormation +# - ProjectCategory.Supernovae +# - ProjectCategory.GalaxyFormation +# - ProjectCategory.GalaxyMergers +# - ProjectCategory.Cosmology +proj = Project( + category=ProjectCategory.StarPlanetInteractions, + project_title="Fragdisk", + alias="FRAGDISK", + short_description="Fragmentation of self-gravitating disks", + general_description=""" + Study of the fragmentation of self-gravitating disks. See Brucy & Hennebelle 2021 (submitted) for more details. + + This database is currently being completed. + + Abstract: + + Self-gravitating disks are believed to play an important role in astrophysics in particular regarding the star and planet formation process. + In this context, disks subject to an idealized cooling process, characterized by a cooling timescale β expressed in unit of orbital timescale, + have been extensively studied. We take advantage of the Riemann solver and the 3D Godunov scheme implemented in the code Ramses + to perform high resolution simulations, complementing previous studies that have used Smoothed Particle Hydrodynamics (SPH) or 2D grid codes. + """, + data_description="""The data available for this project is the underlying data of the article Brucy & Hennebelle 2021. + The data is not already fully uploaded. 3D datacube extraction on demand is planned""", + directory_path="~nbrucy/simus/fragdisk", +) +print(proj) +# -------------------------------------------------------------------------------------------------------------------- # + +# -------------------------------------------------------------------------------------------------------------------- # +redo = True +for pl in pls: + pl.pp_params.process.verbose = True + pl.comp.pp_params.process.verbose = True + for run in pl.runs: + simu = pl.simulations[run] + proj.simulations.add(simu) + + +# -------------------------------------------------------------------------------------------------------------------- # + + +for pl in pls: + select = {"time": 4.5} + pl.coldens( + "z", + overwrite=redo, + overwrite_dep=False, + unit_space=cst.cm, + unit_time=orp, + nml_key="cloud_params/beta_cool", + vmin=1e-2, + vmax=1e2, + put_units=False, + select=select, + label=r"$\Sigma$", + ) + + pl.coldens( + "y", + overwrite=redo, + overwrite_dep=False, + unit_space=cst.cm, + unit_time=orp, + nml_key="cloud_params/beta_cool", + vmin=1e-2, + vmax=1e2, + put_units=False, + select=select, + label=r"$\Sigma$", + ) + + pl.slice_rho( + "z", + overwrite=redo, + overwrite_dep=False, + unit_space=cst.cm, + unit_time=orp, + nml_key="cloud_params/beta_cool", + put_units=False, + select=select, + label=r"$\rho$", + ) + + pl.slice_rho( + "y", + overwrite=redo, + overwrite_dep=False, + unit_space=cst.cm, + unit_time=orp, + nml_key="cloud_params/beta_cool", + put_units=False, + select=select, + label=r"$\rho$", + ) + + pl.slice_P( + "z", + overwrite=redo, + overwrite_dep=False, + unit_space=cst.cm, + unit_time=orp, + nml_key="cloud_params/beta_cool", + put_units=False, + select=select, + label=r"$P$", + ) + + pl.pdf_coldens( + "z", + overwrite=redo, + overwrite_dep=False, + unit_time=orp, + nml_key="cloud_params/beta_cool", + label=r"$\log(\sigma)$", + kind="step", + color="k", + select=select, + ) + + +# -------------------------------------------------------------------------------------------------------------------- # + + +# Create HDF5 files +for simu in proj.simulations: + for snap in simu.snapshots: + for df in snap.datafiles: + name = df[FileType.JPEG_FILE].filename + name = os.path.splitext(name)[0] + ".h5" + h5 = h5py.File(out_dir + "/" + name, "w") + p = h5.create_group("plot") + df.plot_info.hsp_save_to_h5(p) + h5.close() + df[FileType.HDF5_FILE] = out_dir + "/" + name + +for param in ramses.input_parameters: + param.key = os.path.basename(param.key) + +study = SimulationStudy(project=proj) + +for sim in study.project.simulations: + for snap in sim.snapshots: + snap.time = (snap.time[0], cst.year) + +proj.galactica_validity_check() +study.save_HDF5(out_dir + "/fragdisk_study.h5") diff --git a/ismfeed_galactica.py b/ismfeed_galactica.py new file mode 100644 index 0000000..6354729 --- /dev/null +++ b/ismfeed_galactica.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# This file is part of the 'astrophysix' Python package. +# +# Copyright © Commissariat a l'Energie Atomique et aux Energies Alternatives (CEA) +# +# FREE SOFTWARE LICENCING +# ----------------------- +# This software is governed by the CeCILL license under French law and abiding by the rules of distribution of free +# software. You can use, modify and/or redistribute the software under the terms of the CeCILL license as circulated by +# CEA, CNRS and INRIA at the following URL: "http://www.cecill.info". As a counterpart to the access to the source code +# and rights to copy, modify and redistribute granted by the license, users are provided only with a limited warranty +# and the software's author, the holder of the economic rights, and the successive licensors have only limited +# liability. In this respect, the user's attention is drawn to the risks associated with loading, using, modifying +# and/or developing or reproducing the software by the user in light of its specific status of free software, that may +# mean that it is complicated to manipulate, and that also therefore means that it is reserved for developers and +# experienced professionals having in-depth computer knowledge. Users are therefore encouraged to load and test the +# software's suitability as regards their requirements in conditions enabling the security of their systems and/or data +# to be ensured and, more generally, to use and operate it in the same conditions as regards security. The fact that +# you are presently reading this means that you have had knowledge of the CeCILL license and that you accept its terms. +# +# +# COMMERCIAL SOFTWARE LICENCING +# ----------------------------- +# You can obtain this software from CEA under other licencing terms for commercial purposes. For this you will need to +# negotiate a specific contract with a legal representative of CEA. +# +from __future__ import print_function, unicode_literals +import os +import numpy as N + +from astrophysix.simdm import SimulationStudy, Project, ProjectCategory +from astrophysix.simdm.experiment import ( + Simulation, + AppliedAlgorithm, + ParameterSetting, + ParameterVisibility, + ResolvedPhysicalProcess, +) +from astrophysix.simdm.protocol import ( + SimulationCode, + AlgoType, + Algorithm, + InputParameter, + PhysicalProcess, + Physics, +) +from astrophysix.simdm.results import GenericResult, Snapshot +from astrophysix.simdm.datafiles import Datafile, PlotType, PlotInfo +from astrophysix.utils.file import FileType +from astrophysix import units as U + +# ----------------------------------------------- Project creation --------------------------------------------------- # +# Available project categories are : +# - ProjectCategory.SolarMHD +# - ProjectCategory.PlanetaryAtmospheres +# - ProjectCategory.StarPlanetInteractions +# - ProjectCategory.StarFormation +# - ProjectCategory.Supernovae +# - ProjectCategory.GalaxyFormation +# - ProjectCategory.GalaxyMergers +# - ProjectCategory.Cosmology +proj = Project( + category=ProjectCategory.StarFormation, + project_title="Ismfeed", + alias="ismfeed", + short_description="Impact of feedback and turbulence on star formation", + general_description="""Impact of feedback and turbulence on star formation. The simulation presented here are described in Brucy et al. 2020, ApJL, L38""", + data_description="The data available in this project...", + directory_path="~nbrucy/simus/ismfeed", +) +print(proj) +# -------------------------------------------------------------------------------------------------------------------- # + + +# --------------------------------------- Simulation code definition ------------------------------------------------- # +ramses = SimulationCode( + name="Ramses 3 (MHD)", + code_name="Ramses", + code_version="3.10.1", + alias="RAMSES_3", + url="https://www.ics.uzh.ch/~teyssier/ramses/RAMSES.html", + description="Ramses MHD code", +) +# => Add algorithms : available algorithm types are : +# - AlgoType.AdaptiveMeshRefinement +# - AlgoType.VoronoiMovingMesh +# - AlgoType.SmoothParticleHydrodynamics +# - AlgoType.Godunov +# - AlgoType.PoissonMultigrid +# - AlgoType.PoissonConjugateGradient +# - AlgoType.ParticleMesh +# - AlgoType.FriendOfFriend +# - AlgoType.HLLCRiemann +# - AlgoType.RayTracer +# amr = ramses.algorithms.add(Algorithm(algo_type=AlgoType.AdaptiveMeshRefinement, description="AMR")) +ramses.algorithms.add( + Algorithm(algo_type=AlgoType.Godunov, description="Godunov scheme") +) +ramses.algorithms.add( + Algorithm(algo_type=AlgoType.HLLCRiemann, description="HLLC Riemann solver") +) +ramses.algorithms.add( + Algorithm( + algo_type=AlgoType.PoissonMultigrid, description="Multigrid Poisson solver" + ) +) +ramses.algorithms.add( + Algorithm(algo_type=AlgoType.ParticleMesh, description="PM solver") +) + +# => Add input parameters +ramses.input_parameters.add( + InputParameter( + key="amr_params/levelmin", + name="Lmin", + description="min. level of AMR refinement", + ) +) +ramses.input_parameters.add( + InputParameter( + key="amr_params/levelmax", + name="Lmax", + description="max. level of AMR refinement", + ) +) + +ramses.input_parameters.add( + InputParameter( + key="turb_params/turb_rms", name="f_rms", description="Amplitude of the driving" + ) +) +ramses.input_parameters.add( + InputParameter( + key="cloud_params/dens0", name="n_0", description="Midplane density in cm**-3" + ) +) +ramses.input_parameters.add( + InputParameter( + key="cloud_params/bx_bound", + name="bx_bound", + description="imposed magnetic field at the x boundary (1 implies that the magnetic pressure is equal to thermal pressure in WNM, which corresponds to about 5muG)", + ) +) + + +# => Add physical processes : available physics are : +# - Physics.SelfGravity +# - Physics.Hydrodynamics +# - Physics.MHD +# - Physics.StarFormation +# - Physics.SupernovaeFeedback +# - Physics.AGNFeedback +# - Physics.MolecularCooling +ramses.physical_processes.add( + PhysicalProcess( + physics=Physics.StarFormation, + description="Star Formation is triggered when density overpass", + ) +) +ramses.physical_processes.add( + PhysicalProcess( + physics=Physics.MHD, description="Magneto-hydrodynamical equations are solved" + ) +) +ramses.physical_processes.add( + PhysicalProcess(physics=Physics.SelfGravity, description="Self-Gravity is applied.") +) +ramses.physical_processes.add( + PhysicalProcess(physics=Physics.SupernovaeFeedback, description="SN feedback") +) +# -------------------------------------------------------------------------------------------------------------------- # + + +# -------------------------------------------- Simulation setup ------------------------------------------------------ # +simu = Simulation( + simu_code=ramses, + name="Noturb_1", + alias="noturb_1", + description="Simulation without turbulence", + directory_path="~nbrucy/simus/turb/", +) +proj.simulations.add(simu) + +# Add applied algorithms implementation details. Warning : corresponding algorithms must have been added in the 'ramses' +# simulation code. +# simu.applied_algorithms.add(AppliedAlgorithm(algorithm=amr, details="My AMR implementation [Teyssier 2002]")) +# simu.applied_algorithms.add(AppliedAlgorithm(algorithm=ramses.algorithms[AlgoType.HLLCRiemann.name], +# details="My Riemann solver implementation [Teyssier 2002]")) + +# Add parameter setting. Warning : corresponding input parameter must have been added in the 'ramses' simulation code. +# Available parameter visibility options are : +# - ParameterVisibility.NOT_DISPLAYED +# - ParameterVisibility.ADVANCED_DISPLAY +# - ParameterVisibility.BASIC_DISPLAY +simu.parameter_settings.add( + ParameterSetting( + input_param=ramses.input_parameters["levelmin"], + value=8, + visibility=ParameterVisibility.BASIC_DISPLAY, + ) +) +simu.parameter_settings.add( + ParameterSetting( + input_param=lmax, value=12, visibility=ParameterVisibility.BASIC_DISPLAY + ) +) + +# Add resolved physical process implementation details. Warning : corresponding physical process must have been added to +# the 'ramses' simulation code +simu.resolved_physics.add( + ResolvedPhysicalProcess( + physics=ramses.physical_processes[Physics.StarFormation.name], + details="Star formation specific implementation", + ) +) +simu.resolved_physics.add( + ResolvedPhysicalProcess( + physics=grav, details="self-gravity specific implementation" + ) +) +# -------------------------------------------------------------------------------------------------------------------- # + + +# -------------------------------------- Simulation generic result and snapshots ------------------------------------- # +# Generic result +gres = GenericResult( + name="Key result 1 !", + description="My description", + directory_path="/my/path/to/result", +) +simu.generic_results.add(gres) + +# Simulation snapshot +# In one-line +sn = simu.snapshots.add( + Snapshot( + name="My best snapshot !", + description="My first snapshot description", + time=(125, U.kyr), + physical_size=(250.0, U.kpc), + directory_path="/path/to/snapshot1", + data_reference="OUTPUT_00056", + ) +) +# Or create snapshot, then add it to the simulation +sn2 = Snapshot( + name="My second best snapshot !", + description="My second snapshot description", + time=(0.26, U.Myr), + physical_size=(0.25, U.Mpc), + directory_path="/path/to/snapshot2", + data_reference="OUTPUT_00158", +) +simu.snapshots.add(sn2) +# -------------------------------------------------------------------------------------------------------------------- # + + +# ---------------------------------------------------- Result datafiles ---------------------------------------------- # +# Datafile creation +imf_df = sn.datafiles.add( + Datafile( + name="Initial mass function plot", + description="This is my plot detailed description", + ) +) + +# Add attached files to a datafile (1 per file type). Available file types are : +# - FileType.HDF5_FILE +# - FileType.PNG_FILE +# - FileType.JPEG_FILE +# - FileType.FITS_FILE +# - FileType.TARGZ_FILE +# - FileType.PICKLE_FILE +# - FileType.JSON_FILE +# - FileType.CSV_FILE +# - FileType.ASCII_FILE +imf_df[FileType.PNG_FILE] = os.path.join( + "/data", "io", "datafiles", "plot_image_IMF.png" +) +imf_df[FileType.JPEG_FILE] = os.path.join( + "/data", "io", "datafiles", "plot_with_legend.jpg" +) +imf_df[FileType.FITS_FILE] = os.path.join( + "/data", "io", "datafiles", "cassiopea_A_0.5-1.5keV.fits" +) +imf_df[FileType.TARGZ_FILE] = os.path.join("/data", "io", "datafiles", "archive.tar.gz") +imf_df[FileType.JSON_FILE] = os.path.join( + "/data", "io", "datafiles", "test_header_249.json" +) +imf_df[FileType.ASCII_FILE] = os.path.join("/data", "io", "datafiles", "abstract.txt") +imf_df[FileType.HDF5_FILE] = os.path.join("/data", "io", "HDF5", "study.h5") +imf_df[FileType.PICKLE_FILE] = os.path.join( + "/data", "io", "datafiles", "dict_saved.pkl" +) + +# Datafile plot information (for plot future updates and online interactive visualisation on Galactica web pages). +# Available plot types are : +# - LINE_PLOT +# - SCATTER_PLOT +# - HISTOGRAM +# - HISTOGRAM_2D +# - IMAGE +# - MAP_2D +imf_df.plot_info = PlotInfo( + plot_type=PlotType.LINE_PLOT, + xaxis_values=N.array([10.0, 20.0, 30.0, 40.0, 50.0]), + yaxis_values=N.array([1.256, 2.456, 3.921, 4.327, 5.159]), + xaxis_log_scale=False, + yaxis_log_scale=False, + xaxis_label="Mass", + yaxis_label="Probability", + xaxis_unit=U.Msun, + plot_title="Initial mass function", + yaxis_unit=U.Mpc, +) +# -------------------------------------------------------------------------------------------------------------------- # + + +# Save study in HDF5 file +study = SimulationStudy(project=proj) +study.save_HDF5("./frig_study.h5") + +# Eventually reload it from HDF5 file to edit its content +# study = SimulationStudy.load_HDF5("./frig_study.h5")