Amrex.jl 3.83 KB
Newer Older
William F Godoy's avatar
William F Godoy committed
1 2 3 4 5 6

abstract type AbstractAmrex <: AbstractExtractor end

mutable struct Amrex <: AbstractAmrex
    app::String
    outputPrefix::String
William F Godoy's avatar
William F Godoy committed
7 8
    inputs::Array{String}
    outputs::Array{String}
William F Godoy's avatar
William F Godoy committed
9
    runlogFile::String
William F Godoy's avatar
William F Godoy committed
10

William F Godoy's avatar
William F Godoy committed
11
    Amrex(outputPrefix::String, runlogFile::String) = new(
William F Godoy's avatar
William F Godoy committed
12 13
        "Amrex",
        outputPrefix,
William F Godoy's avatar
William F Godoy committed
14
        ["max_step", "amr.check_int", "amr.plot_int", "amr.n_cell", "amr.max_level", "caseID"],
William F Godoy's avatar
William F Godoy committed
15
        ["plots_size", "checkpoints_size"],
William F Godoy's avatar
William F Godoy committed
16
        runlogFile,
William F Godoy's avatar
William F Godoy committed
17
    )
William F Godoy's avatar
William F Godoy committed
18 19 20 21 22 23 24 25 26
end


"""
    Parses an input file with entries key = value, returns all entries in a Dict
    # Arguments
    - `extractor::AbstractAmrex` : input type extending AbstractAmrex
    - `inputFile::String` : input file to be parsed, absolute path is preferred
"""
William F Godoy's avatar
William F Godoy committed
27
function _input_parser(extractor::AbstractAmrex, inputFile::String)::Dict{String,String}
William F Godoy's avatar
William F Godoy committed
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

    parameters = Dict{String,String}()
    # get file contents in a single iterable type, \n newline is removed 
    fileContents = readlines(inputFile)

    # go through each line
    for line in fileContents
        if isempty(line)
            continue
        end

        # remove comments marked with #
        result = findfirst("#", line)

        if isnothing(result) == false
            line = SubString(line, 1, result[1] - 1)
            if isempty(line)
                continue
            end
        end

        parameter = split(line, "=")
        parameters[strip(parameter[1])] = strip(parameter[2])

    end

    return parameters
end
56 57 58 59 60 61 62

"""
    Get actual independent variables for I/O characterization: 
    number of cells or ncells, output frequency or nplots, ncheckpoints, etc.    
    from input parameters 
    # Arguments
    - `extractor::AbstractAmrex` : input type extending AbstractAmrex
William F Godoy's avatar
William F Godoy committed
63
    - `parameters::Dict{Any,Any}` : input file to be parsed, absolute path is preferred
64
"""
William F Godoy's avatar
William F Godoy committed
65
function _get_independent_variables(extractor::AbstractAmrex, parameters)::Dict{String,Any}
66

William F Godoy's avatar
William F Godoy committed
67
    independentVariables = Dict{String,Any}()
68 69 70 71 72 73

    # Number of output events, 
    # get is the safe way. 3rd argument is a default fallback if key not found
    maxStepStr = get(parameters, "max_step", "")

    if maxStepStr != ""
William F Godoy's avatar
William F Godoy committed
74 75

        # safe string conversion to a type
76 77 78 79 80
        maxStep = parse(Int64, maxStepStr)

        plotIntStr = get(parameters, "amr.plot_int", "")
        if plotIntStr != ""
            plotFrequency = parse(Int64, plotIntStr)
William F Godoy's avatar
William F Godoy committed
81
            independentVariables["amr.plot_int"] = plotFrequency
82 83 84 85 86 87 88 89
            independentVariables["amr.nplot_files"] = floor(Int32, maxStep / plotFrequency)
        else
            throw(NoSuchFieldException("jexio Amrex: Can't find amr.plot_int"))
        end

        checkIntStr = get(parameters, "amr.check_int", "")
        if checkIntStr != ""
            checkpointFrequency = parse(Int64, checkIntStr)
William F Godoy's avatar
William F Godoy committed
90 91 92
            independentVariables["amr.check_int"] = checkpointFrequency
            independentVariables["amr.ncheck_files"] =
                floor(Int32, maxStep / checkpointFrequency)
93 94 95 96
        else
            throw(NoSuchFieldException("jexio Amrex: Can't find amr.check_int"))
        end

97
    end
98 99 100 101 102 103 104 105 106 107 108 109 110

    # Using the dot "." operator to apply it on an element-by-element basis (like a dot product)
    # input is a dictionary with key="amr.ncell" and value = {"nx" "ny" "nz"},  
    # output is nx*ny*nz
    # Example:  
    # input Dict[ "amr.n_cell" => ["16" "16"] ], if key not found return 0
    # >ncells
    #   256
    ncells = prod(parse.(Int64, split(get(parameters, "amr.n_cell", ["0"]))))
    independentVariables["amr.ncells"] = ncells

    maxLevel = get(parameters, "amr.max_level", "")
    independentVariables["amr.max_level"] = maxLevel == "" ? 1 : parse(Int32, maxLevel)
William F Godoy's avatar
William F Godoy committed
111

112 113
    regrid = get(parameters, "amr.regrid_int", "")
    independentVariables["amr.regrid_int"] = regrid == "" ? 1 : parse(Int32, regrid)
William F Godoy's avatar
William F Godoy committed
114

115 116
    return independentVariables

117
end
William F Godoy's avatar
William F Godoy committed
118 119 120 121 122


function _get_inputs_X(extractor::AbstractAmrex)

end