import datetime
import logging
import os
from pytmosph3r.log.logger import root_logger, Logger
from pytmosph3r.log import setLogLevel
from pytmosph3r.config import Config
from pytmosph3r.mpi import get_rank
from pytmosph3r.interface.io import write_spectrum
from pytmosph3r.interface.hdf5 import write_hdf5
from pytmosph3r.interface.netcdf import write_netcdf
from pytmosph3r.parser import pytmosph3r_parser
from . import __version__ as version
"""The entry point to Pytmosph3R"""
[docs]def main():
"""Reads a config file and runs Pytmosph3R"""
root_logger.info('Welcome to Pytmosph3R %s'%version)
root_logger.info("\n"\
" ,MMM8&&&.\n"\
" _...MMMMM88&&&&..._\n"\
" .::'''MMMMM88&&&&&&'''::.\n"\
":: MMMMM88&&&&&& ::\n"\
"'::....MMMMM88&&&&&&....::'\n"\
" `''''MMMMM88&&&&''''`\n"\
" 'MMM8&&&'\n")
parser = pytmosph3r_parser()
args = parser.parse_args()
if args.all:
if args.verbose is None:
args.verbose = 2
if args.h5_output is None:
args.h5_output = "output_pytmosph3r.h5"
if args.nc_output is None:
args.nc_output = "output_pytmosph3r.nc"
if args.spectrum_dat_output is None:
args.spectrum_dat_output = "spectrum_pytmosph3r.dat"
elif args.verbose is None:
args.verbose = 0
start_time = datetime.datetime.now()
root_logger.info('Pytmosph3R PROGRAM START AT %s', start_time)
Logger.verbose = args.verbose
if args.debug:
import cProfile
pr = cProfile.Profile()
pr.enable()
setLogLevel(logging.DEBUG)
import ntpath
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
prefix = "%s_"%args.debug
stats_file = prefix+path_leaf(args.input_file)
stats_file = os.path.join(args.output_folder, stats_file)
stats_file = os.path.splitext(stats_file)[0]+".prof"
# Parse the input file
config = Config()
config.search_path(args.input_file)
config.read(config.filename)
# Setup global parameters
config.setup_globals()
# Generate a model from the input
model = config.generate_model()
if get_rank(): # MPI "slaves" just wait for transmittance data
model.radiative_transfer.compute(model)
if args.debug:
pr.disable()
pr.create_stats()
stats_file = os.path.splitext(stats_file)[0]+"_"+str(get_rank())+".prof"
pr.dump_stats(stats_file)
return
model.build()
os.makedirs(args.output_folder, exist_ok=True)
h5_output = os.path.join(args.output_folder, args.h5_output)
# Write model parameters
if h5_output and not args.light_output:
root_logger.info('Saving model into %s ...', h5_output)
write_hdf5(h5_output, model)
root_logger.info('Save - DONE')
model.run()
if args.spectrum_dat_output:
spectrum_dat_output = os.path.join(args.output_folder, args.spectrum_dat_output)
write_spectrum(spectrum_dat_output, model)
if h5_output and not args.light_output:
root_logger.info('Saving output into %s (verbose = %s) ...', h5_output, args.verbose)
write_hdf5(h5_output, model, "Output")
root_logger.info('Save - DONE')
if args.nc_output:
nc_output = os.path.join(args.output_folder, args.nc_output)
root_logger.info('Creating netCDF file at %s ...', nc_output)
write_netcdf(nc_output, model, args.radius_scale)
end_time = datetime.datetime.now()
root_logger.info('Pytmosph3R PROGRAM END AT %s s', end_time)
total_time = end_time - start_time
root_logger.info('Pytmosph3R run in %.2f s', total_time.total_seconds())
if args.debug:
pr.disable()
pr.create_stats()
root_logger.info('Recording stats in %s', stats_file)
pr.dump_stats(stats_file)
root_logger.info('Stats - DONE')
if get_rank() == 0:
from pytmosph3r.plot import Plot
plot = Plot(model=model, out_folder=args.output_folder)
if args.plot:
plot.interactive = True
plot.plot_spectrum(legend=False)
else:
root_logger.warning("More than 1 MPI process: no plot")
if __name__ == "__main__":
main()