def filter_metadata(metadata, pset, arguments, suite): """Remove all variables from metadata that are not used in the given suite""" success = True # Output: filtered dictionaries metadata_filtered = {} pset_filtered = {} arguments_filtered = {} # Loop through all variables and check if the calling subroutine is in list of subroutines for var_name in sorted(metadata.keys()): keep = False for var in metadata[var_name][:]: container_string = decode_container(var.container) subroutine = container_string[container_string.find('SUBROUTINE') + len('SUBROUTINE') + 1:] if subroutine in suite.all_subroutines_called: keep = True break if keep: metadata_filtered[var_name] = metadata[var_name] pset_filtered[var_name] = pset[var_name] else: print "filtering out variable {0}".format(var_name) for scheme in arguments.keys(): if scheme in suite.all_schemes_called: arguments_filtered[scheme] = arguments[scheme] return (success, metadata_filtered, pset_filtered, arguments_filtered)
def metadata_to_html(metadata, model, filename): """Create an HTML page with a table that lists each variable provided by the model. Contrary to metadata_to_latex below, this table does not include information on variables requested by schemes. The primary use of the HTML table is to help physics scheme developers to identify the variables they need when writing a CCPP-compliant scheme.""" shading = { 0 : 'darkgray', 1 : 'lightgray' } success = True # Header html = '''<html> <title>CCPP variables provided by model {model}</title> <body> <h1>CCPP variables provided by model {model}</h1> <table columns="6" border="1" cellpadding="4"> <tr> <th bgcolor="{bgcolor}" align="left" >standard_name</th> <th bgcolor="{bgcolor}" align="left" >long_name </th> <th bgcolor="{bgcolor}" align="left" >units </th> <th bgcolor="{bgcolor}" align="right">rank </th> <th bgcolor="{bgcolor}" align="left" >type </th> <th bgcolor="{bgcolor}" align="left" >kind </th> <th bgcolor="{bgcolor}" align="left" >source </th> <th bgcolor="{bgcolor}" align="left" >{model} name </th> </tr> '''.format(model=model, bgcolor = shading[0]) count = 0 for var_name in sorted(metadata.keys()): for var in metadata[var_name]: # Alternate shading, count is 0 1 0 1 ... count = (count+1) % 2 # ... create html row ... line = '''<tr> <td bgcolor="{bgcolor}" align="left" >{v.standard_name}</td> <td bgcolor="{bgcolor}" align="left" >{v.long_name} </td> <td bgcolor="{bgcolor}" align="left" >{v.units} </td> <td bgcolor="{bgcolor}" align="right">{rank} </td> <td bgcolor="{bgcolor}" align="left" >{v.type} </td> <td bgcolor="{bgcolor}" align="left" >{v.kind} </td> <td bgcolor="{bgcolor}" align="left" >{container} </td> <td bgcolor="{bgcolor}" align="left" >{v.local_name} </td> </tr>'''.format(v=var, rank=var.rank.count(':'), container = decode_container(var.container), bgcolor=shading[count]) html += line # Footer html += '''</table> </body> </html> ''' filepath = os.path.split(os.path.abspath(filename))[0] if not os.path.isdir(filepath): os.makedirs(filepath) with open(filename, 'w') as f: f.write(html) logging.info('Metadata table for model {0} written to {1}'.format(model, filename)) return success
def filter_metadata(metadata, arguments, dependencies, schemes_in_files, suites): """Remove all variables from metadata that are not used in the given suite; also remove information on argument lists, dependencies and schemes in files""" success = True # Output: filtered dictionaries metadata_filtered = collections.OrderedDict() arguments_filtered = collections.OrderedDict() dependencies_filtered = collections.OrderedDict() schemes_in_files_filtered = collections.OrderedDict() # Loop through all variables and check if the calling subroutine is in list of subroutines for var_name in sorted(metadata.keys()): keep = False for var in metadata[var_name][:]: container_string = decode_container(var.container) subroutine = container_string[container_string.find('SUBROUTINE') + len('SUBROUTINE') + 1:] # Replace the full CCPP stage name with the abbreviated version for ccpp_stage in CCPP_STAGES.keys(): subroutine = subroutine.replace(ccpp_stage, CCPP_STAGES[ccpp_stage]) for suite in suites: if subroutine in suite.all_subroutines_called: keep = True break if keep: break if keep: metadata_filtered[var_name] = metadata[var_name] else: logging.info("filtering out variable {0}".format(var_name)) # Filter argument lists for scheme in arguments.keys(): for suite in suites: if scheme in suite.all_schemes_called: arguments_filtered[scheme] = arguments[scheme] break # Filter dependencies for scheme in dependencies.keys(): for suite in suites: if scheme in suite.all_schemes_called: dependencies_filtered[scheme] = dependencies[scheme] break # Filter schemes_in_files for scheme in schemes_in_files.keys(): for suite in suites: if scheme in suite.all_schemes_called: schemes_in_files_filtered[scheme] = schemes_in_files[scheme] return (success, metadata_filtered, arguments_filtered, dependencies_filtered, schemes_in_files_filtered)
def filter_metadata(metadata, arguments, dependencies, schemes_in_files, suites): """Remove all variables from metadata that are not used in the given suite; also remove information on argument lists, dependencies and schemes in files""" success = True # Output: filtered dictionaries metadata_filtered = {} arguments_filtered = {} dependencies_filtered = {} schemes_in_files_filtered = {} # Loop through all variables and check if the calling subroutine is in list of subroutines for var_name in sorted(metadata.keys()): keep = False for var in metadata[var_name][:]: container_string = decode_container(var.container) subroutine = container_string[container_string.find('SUBROUTINE')+len('SUBROUTINE')+1:] for suite in suites: if subroutine in suite.all_subroutines_called: keep = True break if keep: break if keep: metadata_filtered[var_name] = metadata[var_name] else: logging.info("filtering out variable {0}".format(var_name)) # Filter argument lists for scheme in arguments.keys(): for suite in suites: if scheme in suite.all_schemes_called: arguments_filtered[scheme] = arguments[scheme] break # Filter dependencies for scheme in dependencies.keys(): for suite in suites: if scheme in suite.all_schemes_called: dependencies_filtered[scheme] = dependencies[scheme] break # Filter schemes_in_files for scheme in schemes_in_files.keys(): for suite in suites: if scheme in suite.all_schemes_called: schemes_in_files_filtered[scheme] = schemes_in_files[scheme] return (success, metadata_filtered, arguments_filtered, dependencies_filtered, schemes_in_files_filtered)
def metadata_to_latex(metadata_define, metadata_request, model, filename): """Create a LaTeX document with a table that lists each variable provided and/or requested. Uses the GMTB LaTeX templates and style definitons in gmtb.sty.""" shading = {0: 'darkgray', 1: 'lightgray'} success = True var_names = sorted( list(set(list(metadata_define.keys()) + list(metadata_request.keys())))) latex = '''\\documentclass[12pt,letterpaper,oneside,landscape]{{scrbook}} \\usepackage{{import}} \\import{{../common/}}{{gmtb.sty}} \\renewcommand{{\\thesection}}{{\\arabic{{section}}}} \\renewcommand{{\\thesubsection}}{{\\arabic{{section}}.\\arabic{{subsection}}}} \\begin{{document}} \\section{{CCPP variables provided by model {model} vs requested by pool of physics}}\\label{{sec_ccpp_variables}} \\subsection{{List of variables}} \\begin{{longtable}}{{l}}'''.format(model=model) for var_name in var_names: if var_name in metadata_define.keys(): var = metadata_define[var_name][0] else: var = metadata_request[var_name][0] line = ''' \hyperlink{{{standard_name_ref}}}{{\\blue\\underline{{\\execout{{{standard_name}}}}}}} \\\\'''.format( standard_name=escape_tex(var.standard_name), standard_name_ref=var.standard_name) latex += line latex += ''' \\end{longtable}\\pagebreak \\subsection{Description of variables} {{\\small\\begin{description} ''' for var_name in var_names: if var_name in metadata_define.keys(): var = metadata_define[var_name][0] target = escape_tex(decode_container(var.container)) local_name = escape_tex(var.local_name) else: var = metadata_request[var_name][0] target = 'MISSING' local_name = 'MISSING' if var_name in metadata_request.keys(): requested_list = [ escape_tex(decode_container(v.container)) for v in metadata_request[var_name] ] # for the purpose of the table, just output the name of the subroutine for i in range(len(requested_list)): entry = requested_list[i] requested_list[i] = entry[entry.find('SUBROUTINE') + len('SUBROUTINE') + 1:] requested = '\\newline '.join(sorted(requested_list)) else: requested = 'NOT REQUESTED' # Create output text = ''' \\begin{{samepage}}\\item{{ \hypertarget{{{standard_name_ref}}}{{\\blue\\exec{{{standard_name}}}}}}}\\\\ \\nopagebreak \\begin{{tabular}}{{ll}} \\execout{{long\_name }} & \\execout{{{long_name} }} \\\\ \\execout{{units }} & \\execout{{{units} }} \\\\ \\execout{{rank }} & \\execout{{{rank} }} \\\\ \\execout{{type }} & \\execout{{{type} }} \\\\ \\execout{{kind }} & \\execout{{{kind} }} \\\\ \\execout{{source }} & \\execout{{{target} }} \\\\ \\execout{{local\_name}} & \\execout{{{local_name} }} \\\\ \\execout{{requested }} & \\execout{{\\vtop{{{requested}}}}} \\\\ \\end{{tabular}} \\vspace{{4pt}} \\end{{samepage}}'''.format(standard_name=escape_tex(var.standard_name), standard_name_ref=var.standard_name, long_name=escape_tex(var.long_name), units=escape_tex(var.units), rank=var.rank.count(':'), type=escape_tex(var.type), kind=escape_tex(var.kind), target=target, local_name=local_name, requested=requested) latex += text # Footer latex += ''' \\end{description}}} \\end{document} ''' filepath = os.path.split(os.path.abspath(filename))[0] if not os.path.isdir(filepath): os.makedirs(filepath) with open(filename, 'w') as f: f.write(latex) logging.info('Metadata table for model {0} written to {1}'.format( model, filename)) return success