예제 #1
0
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.')
예제 #2
0
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.')
예제 #3
0
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.')
예제 #4
0
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.')