def main(): """Main routine that handles the CCPP prebuild for different host models.""" # Parse command line arguments (success, host_model, debug) = parse_arguments() if not success: raise Exception('Call to parse_arguments failed.') success = setup_logging(debug) if not success: raise Exception('Call to setup_logging failed.') (success, config) = import_config(host_model) if not success: raise Exception('Call to import_config failed.') # Variables defined by the host model (success, metadata_define) = gather_variable_definitions(config['variable_definition_files']) if not success: raise Exception('Call to gather_variable_definitions failed.') # Create an HTML table with all variables provided by the model success = metadata_to_html(metadata_define, host_model, config['html_vartable_file']) if not success: raise Exception('Call to metadata_to_html failed.') # Variables requested by the CCPP physics schemes (success, metadata_request, arguments_request) = collect_physics_subroutines(config['scheme_files']) if not success: raise Exception('Call to collect_physics_subroutines failed.') # Process optional arguments based on configuration in above dictionary optional_arguments (success, metadata_request, arguments_request) = check_optional_arguments(metadata_request,arguments_request, config['optional_arguments']) if not success: raise Exception('Call to check_optional_arguments failed.') # Create a LaTeX table with all variables requested by the pool of physics and/or provided by the host model success = metadata_to_latex(metadata_define, metadata_request, host_model, config['latex_vartable_file']) if not success: raise Exception('Call to metadata_to_latex failed.') # Check requested against defined arguments to generate metadata (list/dict of variables for CCPP) (success, modules, metadata) = compare_metadata(metadata_define, metadata_request) if not success: raise Exception('Call to compare_metadata failed.') # Crate module use statements to inject into the host model cap (success, module_use_statements) = create_module_use_statements(modules, config['module_use_template_host_cap']) if not success: raise Exception('Call to create_module_use_statements failed.') # Crate ccpp_fiels_add statements to inject into the host model cap (success, ccpp_field_add_statements) = create_ccpp_field_add_statements(metadata, config['ccpp_data_structure']) if not success: raise Exception('Call to create_ccpp_field_add_statements failed.') # Generate include files for module_use_statements and ccpp_field_add_statements success = generate_include_files(module_use_statements, ccpp_field_add_statements, config['target_files'], config['module_include_file'], config['fields_include_file']) if not success: raise Exception('Call to generate_include_files failed.') # Generate scheme caps (success, scheme_caps) = generate_scheme_caps(metadata_request, arguments_request, config['caps_dir'], config['module_use_template_scheme_cap']) if not success: raise Exception('Call to generate_scheme_caps failed.') # Add filenames of schemes to makefile - add dependencies for schemes success = generate_schemes_makefile(config['scheme_files_dependencies'] + config['scheme_files'], config['schemes_makefile'], config['schemes_cmakefile']) if not success: raise Exception('Call to generate_schemes_makefile failed.') # Add filenames of scheme caps to makefile success = generate_caps_makefile(scheme_caps, config['caps_makefile'], config['caps_cmakefile'], config['caps_dir']) if not success: raise Exception('Call to generate_caps_makefile failed.') logging.info('CCPP prebuild step completed successfully.')
def main(): """Main routine that handles the CCPP prebuild for different host models.""" # Parse command line arguments (success, configfile, clean, debug, sdfs, builddir) = parse_arguments() if not success: raise Exception('Call to parse_arguments failed.') success = setup_logging(debug) if not success: raise Exception('Call to setup_logging failed.') (success, config) = import_config(configfile, builddir) if not success: raise Exception('Call to import_config failed.') # Perform clean if requested, then exit if clean: success = clean_files(config) logging.info('CCPP prebuild clean completed successfully, exiting.') sys.exit(0) # If no suite definition files were given, get all of them if not sdfs: (success, sdfs) = get_all_suites(config['suites_dir']) if not success: raise Exception('Call to get_all_sdfs failed.') # Parse suite definition files for prebuild (success, suites) = parse_suites(config['suites_dir'], sdfs) if not success: raise Exception('Parsing suite definition files failed.') # Variables defined by the host model (success, metadata_define, dependencies_define) = gather_variable_definitions( config['variable_definition_files'], config['typedefs_new_metadata']) if not success: raise Exception('Call to gather_variable_definitions failed.') # Create an HTML table with all variables provided by the model success = metadata_to_html(metadata_define, config['host_model'], config['html_vartable_file']) if not success: raise Exception('Call to metadata_to_html failed.') # Variables requested by the CCPP physics schemes (success, metadata_request, arguments_request, dependencies_request, schemes_in_files) = collect_physics_subroutines(config['scheme_files']) if not success: raise Exception('Call to collect_physics_subroutines failed.') # Filter metadata/arguments - remove whatever is not included in suite definition files (success, metadata_request, arguments_request, dependencies_request, schemes_in_files) = filter_metadata(metadata_request, arguments_request, dependencies_request, schemes_in_files, suites) if not success: raise Exception('Call to filter_metadata failed.') (success, schemes_and_dependencies_to_compile ) = generate_list_of_schemes_and_dependencies_to_compile( schemes_in_files, dependencies_request, dependencies_define) if not success: raise Exception( 'Call to generate_list_of_schemes_and_dependencies_to_compile failed.' ) # Process optional arguments based on configuration in above dictionary optional_arguments (success, metadata_request, arguments_request) = check_optional_arguments( metadata_request, arguments_request, config['optional_arguments']) if not success: raise Exception('Call to check_optional_arguments failed.') # Create a LaTeX table with all variables requested by the pool of physics and/or provided by the host model success = metadata_to_latex(metadata_define, metadata_request, config['host_model'], config['latex_vartable_file']) if not success: raise Exception('Call to metadata_to_latex failed.') # Check requested against defined arguments to generate metadata (list/dict of variables for CCPP) (success, modules, metadata) = compare_metadata(metadata_define, metadata_request) if not success: raise Exception('Call to compare_metadata failed.') # Add Fortran module files of typedefs to makefile/cmakefile/shell script success = generate_typedefs_makefile(metadata_define, config['typedefs_makefile'], config['typedefs_cmakefile'], config['typedefs_sourcefile']) if not success: raise Exception('Call to generate_typedefs_makefile failed.') # Add filenames of schemes and variable definition files (types) to makefile/cmakefile/shell script success = generate_schemes_makefile( schemes_and_dependencies_to_compile + config['variable_definition_files'], config['schemes_makefile'], config['schemes_cmakefile'], config['schemes_sourcefile']) if not success: raise Exception('Call to generate_schemes_makefile failed.') # Static build: generate caps for entire suite and groups in the specified suite; generate API (success, suite_and_group_caps) = generate_suite_and_group_caps( suites, metadata_request, metadata_define, arguments_request, config['caps_dir']) if not success: raise Exception('Call to generate_suite_and_group_caps failed.') (success, api) = generate_static_api(suites, config['static_api_dir']) if not success: raise Exception('Call to generate_static_api failed.') success = api.write_sourcefile(config['static_api_srcfile']) if not success: raise Exception("Writing API sourcefile {sourcefile} failed".format( sourcefile=config['static_api_srcfile'])) # Add filenames of caps to makefile/cmakefile/shell script all_caps = suite_and_group_caps success = generate_caps_makefile(all_caps, config['caps_makefile'], config['caps_cmakefile'], config['caps_sourcefile'], config['caps_dir']) if not success: raise Exception('Call to generate_caps_makefile failed.') logging.info('CCPP prebuild step completed successfully.')
def main(): """Main routine that handles the CCPP prebuild for different host models.""" # Parse command line arguments (success, configfile, debug, static, sdf) = parse_arguments() if not success: raise Exception('Call to parse_arguments failed.') success = setup_logging(debug) if not success: raise Exception('Call to setup_logging failed.') (success, config) = import_config(configfile) if not success: raise Exception('Call to import_config failed.') if static: # Parse suite definition file for static build suite = Suite(sdf_name=sdf) success = suite.parse() if not success: raise Exception( 'Parsing suite definition file {0} failed.'.format(sdf)) # Check that each scheme only belongs to one set of physics # this is required for using the optimized version of ccpp_field_get # that supplies the build-time derived index in the array success = check_unique_pset_per_scheme(config['scheme_files']) if not success: raise Exception('Call to check_unique_pset_per_scheme failed.') # Variables defined by the host model (success, metadata_define) = gather_variable_definitions( config['variable_definition_files']) if not success: raise Exception('Call to gather_variable_definitions failed.') # Create an HTML table with all variables provided by the model success = metadata_to_html(metadata_define, config['host_model'], config['html_vartable_file']) if not success: raise Exception('Call to metadata_to_html failed.') # Variables requested by the CCPP physics schemes (success, metadata_request, pset_request, arguments_request, pset_schemes) = collect_physics_subroutines(config['scheme_files']) if not success: raise Exception('Call to collect_physics_subroutines failed.') # For static build, also check that each group only contains scheme that # belong to one set of physics; this is required for using the optimized # version of ccpp_field_get that supplies the build-time derived index # of the variable in the cdata structure if static: success = check_unique_pset_per_group(suite, pset_schemes) if not success: raise Exception('Call to check_unique_pset_per_group failed.') # Filter metadata/pset/arguments for static build - remove whatever is not included in suite definition file if static: (success, metadata_request, pset_request, arguments_request) = filter_metadata(metadata_request, pset_request, arguments_request, suite) if not success: raise Exception('Call to filter_metadata failed.') # Process optional arguments based on configuration in above dictionary optional_arguments (success, metadata_request, arguments_request) = check_optional_arguments( metadata_request, arguments_request, config['optional_arguments']) if not success: raise Exception('Call to check_optional_arguments failed.') # Create a LaTeX table with all variables requested by the pool of physics and/or provided by the host model success = metadata_to_latex(metadata_define, metadata_request, pset_request, config['host_model'], config['latex_vartable_file']) if not success: raise Exception('Call to metadata_to_latex failed.') # Flatten list of list of psets for all variables psets_merged = list(set(itertools.chain(*pset_request.values()))) # Check requested against defined arguments to generate metadata (list/dict of variables for CCPP) (success, modules, metadata) = compare_metadata(metadata_define, metadata_request, pset_request, psets_merged) if not success: raise Exception('Call to compare_metadata failed.') # Dictionary of indices of variables in the cdata structure, per pset ccpp_field_maps = {} for pset in psets_merged: # Create module use statements to inject into the host model cap (success, module_use_statements) = create_module_use_statements( modules[pset], pset, config['module_use_template_host_cap']) if not success: raise Exception('Call to create_module_use_statements failed.') # Only process variables that fall into this pset metadata_filtered = { key: value for (key, value) in metadata.items() if pset in pset_request[key] } # Create ccpp_fiels_add statements to inject into the host model cap; # this returns a ccpp_field_map that contains indices of variables in # the cdata structure for the given pset (success, ccpp_field_add_statements, ccpp_field_map) = create_ccpp_field_add_statements( metadata_filtered, pset, config['ccpp_data_structure']) if not success: raise Exception('Call to create_ccpp_field_add_statements failed.') ccpp_field_maps[pset] = ccpp_field_map # Generate include files for module_use_statements and ccpp_field_add_statements success = generate_include_files( module_use_statements, ccpp_field_add_statements, config['target_files'], config['module_include_file'].format(set=pset), config['fields_include_file'].format(set=pset)) if not success: raise Exception('Call to generate_include_files failed.') # Static build: generate caps for entire suite and groups in the specified suite; generate API if static: (success, suite_and_group_caps) = generate_suite_and_group_caps( suite, metadata_request, metadata_define, arguments_request, ccpp_field_maps, config['caps_dir'], config['module_use_template_scheme_cap']) if not success: raise Exception('Call to generate_suite_and_group_caps failed.') (success, api) = generate_static_api(suite, config['caps_dir']) if not success: raise Exception('Call to generate_static_api failed.') # Generate scheme caps (success, scheme_caps) = generate_scheme_caps( metadata_request, arguments_request, pset_schemes, ccpp_field_maps, config['caps_dir'], config['module_use_template_scheme_cap']) if not success: raise Exception('Call to generate_scheme_caps failed.') # Add filenames of schemes to makefile - add dependencies for schemes success = generate_schemes_makefile( config['scheme_files_dependencies'] + config['scheme_files'].keys(), config['schemes_makefile'], config['schemes_cmakefile']) if not success: raise Exception('Call to generate_schemes_makefile failed.') # DH* NOT FOR STATIC BUILD - add static code (group and suite drivers) instead? # Add filenames of scheme caps to makefile if static: all_caps = scheme_caps + suite_and_group_caps + [api.filename] else: all_caps = scheme_caps success = generate_caps_makefile(all_caps, config['caps_makefile'], config['caps_cmakefile'], config['caps_dir']) if not success: raise Exception('Call to generate_caps_makefile failed.') logging.info('CCPP prebuild step completed successfully.')
def main(): """Main routine that handles the CCPP prebuild for different host models.""" # Parse command line arguments (success, configfile, clean, debug, sdfs, builddir) = parse_arguments() if not success: raise Exception('Call to parse_arguments failed.') success = setup_logging(debug) if not success: raise Exception('Call to setup_logging failed.') (success, config) = import_config(configfile, builddir) if not success: raise Exception('Call to import_config failed.') # Perform clean if requested, then exit if clean: success = clean_files(config) logging.info('CCPP prebuild clean completed successfully, exiting.') sys.exit(0) # Parse suite definition files for prebuild (success, suites) = parse_suites(config['suites_dir'], sdfs) if not success: raise Exception('Parsing suite definition files failed.') # Check that each scheme only belongs to one set of physics # this is required for using the optimized version of ccpp_field_get # that supplies the build-time derived index in the array success = check_unique_pset_per_scheme(config['scheme_files']) if not success: raise Exception('Call to check_unique_pset_per_scheme failed.') # Variables defined by the host model (success, metadata_define) = gather_variable_definitions( config['variable_definition_files'], config['typedefs_new_metadata']) if not success: raise Exception('Call to gather_variable_definitions failed.') # Create an HTML table with all variables provided by the model success = metadata_to_html(metadata_define, config['host_model'], config['html_vartable_file']) if not success: raise Exception('Call to metadata_to_html failed.') # Variables requested by the CCPP physics schemes (success, metadata_request, pset_request, arguments_request, pset_schemes) = collect_physics_subroutines(config['scheme_files']) if not success: raise Exception('Call to collect_physics_subroutines failed.') # Filter metadata/pset/arguments - remove whatever is not included in suite definition files (success, metadata_request, pset_request, arguments_request) = filter_metadata(metadata_request, pset_request, arguments_request, suites) if not success: raise Exception('Call to filter_metadata failed.') # Process optional arguments based on configuration in above dictionary optional_arguments (success, metadata_request, arguments_request) = check_optional_arguments( metadata_request, arguments_request, config['optional_arguments']) if not success: raise Exception('Call to check_optional_arguments failed.') # Create a LaTeX table with all variables requested by the pool of physics and/or provided by the host model success = metadata_to_latex(metadata_define, metadata_request, pset_request, config['host_model'], config['latex_vartable_file']) if not success: raise Exception('Call to metadata_to_latex failed.') # Flatten list of list of psets for all variables psets_merged = list(set(itertools.chain(*pset_request.values()))) # Check requested against defined arguments to generate metadata (list/dict of variables for CCPP) (success, modules, metadata) = compare_metadata(metadata_define, metadata_request, pset_request, psets_merged) if not success: raise Exception('Call to compare_metadata failed.') # Add Fortran module files of typedefs to makefile/cmakefile/shell script success = generate_typedefs_makefile(metadata_define, config['typedefs_makefile'], config['typedefs_cmakefile'], config['typedefs_sourcefile']) if not success: raise Exception('Call to generate_typedefs_makefile failed.') # Add filenames of schemes to makefile/cmakefile/shell script - add dependencies for schemes success = generate_schemes_makefile( config['scheme_files_dependencies'] + list(config['scheme_files'].keys()), config['schemes_makefile'], config['schemes_cmakefile'], config['schemes_sourcefile']) if not success: raise Exception('Call to generate_schemes_makefile failed.') # Static build: generate caps for entire suite and groups in the specified suite; generate API (success, suite_and_group_caps) = generate_suite_and_group_caps( suites, metadata_request, metadata_define, arguments_request, config['caps_dir']) if not success: raise Exception('Call to generate_suite_and_group_caps failed.') (success, api) = generate_static_api(suites, config['static_api_dir']) if not success: raise Exception('Call to generate_static_api failed.') success = api.write_sourcefile(config['static_api_srcfile']) if not success: raise Exception("Writing API sourcefile {sourcefile} failed".format( sourcefile=config['static_api_srcfile'])) # Add filenames of caps to makefile/cmakefile/shell script all_caps = suite_and_group_caps success = generate_caps_makefile(all_caps, config['caps_makefile'], config['caps_cmakefile'], config['caps_sourcefile'], config['caps_dir']) if not success: raise Exception('Call to generate_caps_makefile failed.') logging.info('CCPP prebuild step completed successfully.')