Commit ed31ec86 authored by Giovanni La Mura's avatar Giovanni La Mura
Browse files

Implement geometry configuration from script

parent 551d68e7
Loading
Loading
Loading
Loading
+121 −32
Original line number Diff line number Diff line
@@ -36,8 +36,9 @@ def main():
        print_help()
    else:
        sconf, gconf = load_model(argv[1])
        if sconf is not None:
        if (sconf is not None) and (gconf is not None):
            result = write_legacy_sconf(sconf)
            if (result == 0): result += write_legacy_gconf(gconf)
        else:
            print("ERROR: could not create configuration.")
            result = 1
@@ -52,7 +53,8 @@ def interpolate_constants(sconf):
    for i in range(sconf['configurations']):
        for j in range(sconf['nshl'][i]):
            file_idx = sconf['dielec_id'][i][j]
            file_name = sconf['dielec_file'][int(file_idx) - 1]
            dielec_path = PurePath(sconf['dielec_path'], sconf['dielec_file'][int(file_idx) - 1])
            file_name = str(dielec_path)
            dielec_file = open(file_name, 'r')
            wavelengths = []
            rpart = []
@@ -142,6 +144,7 @@ def load_model(model_file):
        sconf['xi_end'] = float(model['radiation_settings']['scale_end'])
        sconf['xi_step'] = float(model['radiation_settings']['scale_step'])
        sconf['configurations'] = int(model['particle_settings']['n_types'])
        sconf['dielec_path'] = model['material_settings']['dielec_path']
        sconf['dielec_file'] = model['material_settings']['dielec_file']
        num_dielec = len(model['particle_settings']['dielec_id'])
        if (len(model['particle_settings']['n_layers']) != sconf['configurations']):
@@ -221,6 +224,44 @@ def load_model(model_file):
                else:
                    for j in range(sconf['nshl'][i]):
                        sconf['rcf'][i][j] = float(model['particle_settings']['rad_frac'][i][j])
        # Create the gconf dict
        str_polar = model['radiation_settings']['polarization']
        if (str_polar not in ["LINEAR", "CIRCULAR"]):
            print("ERROR: %s is not a recognized polarization state."%str_polar)
            return (None, None)
        gconf = {
            'out_file': PurePath(
                model['input_settings']['input_folder'],
                model['input_settings']['geometry_file']
            )
        }
        gconf['nsph'] = sconf['nsph']
        gconf['application'] = model['particle_settings']['application']
        gconf['li'] = int(model['geometry_settings']['li'])
        gconf['le'] = int(
            gconf['li'] if gconf['application'] == "SPHERE" else model['geometry_settings']['le']
        )
        gconf['inpol'] = 0 if str_polar == "LINEAR" else 1
        gconf['npnt'] = int(model['geometry_settings']['npnt'])
        gconf['npntts'] = int(model['geometry_settings']['npntts'])
        gconf['iavm'] = int(model['geometry_settings']['iavm'])
        gconf['isam'] = int(model['geometry_settings']['isam'])
        gconf['th'] = float(model['geometry_settings']['in_th_start'])
        gconf['thstp'] = float(model['geometry_settings']['in_th_step'])
        gconf['thlst'] = float(model['geometry_settings']['in_th_end'])
        gconf['ph'] = float(model['geometry_settings']['in_ph_start'])
        gconf['phstp'] = float(model['geometry_settings']['in_ph_step'])
        gconf['phlst'] = float(model['geometry_settings']['in_ph_end'])
        gconf['ths'] = float(model['geometry_settings']['in_th_start'])
        gconf['thsstp'] = float(model['geometry_settings']['in_th_step'])
        gconf['thslst'] = float(model['geometry_settings']['in_th_end'])
        gconf['phs'] = float(model['geometry_settings']['in_ph_start'])
        gconf['phsstp'] = float(model['geometry_settings']['in_ph_step'])
        gconf['phslst'] = float(model['geometry_settings']['in_ph_end'])
        gconf['vec_sph_x'] = [0.0 for i in range(gconf['nsph'])]
        gconf['vec_sph_y'] = [0.0 for i in range(gconf['nsph'])]
        gconf['vec_sph_z'] = [0.0 for i in range(gconf['nsph'])]
        gconf['jwtm'] = int(model['output_settings']['jwtm'])
    else: # model is None
        print("ERROR: could not parse " + model_file + "!")
    return (sconf, gconf)
@@ -241,7 +282,8 @@ def match_grid(sconf):
    for i in range(sconf['configurations']):
        for j in range(sconf['nshl'][i]):
            file_idx = sconf['dielec_id'][i][j]
            file_name = sconf['dielec_file'][int(file_idx) - 1]
            dielec_path = PurePath(sconf['dielec_path'], sconf['dielec_file'][int(file_idx) - 1])
            file_name = str(dielec_path)
            dielec_file = open(file_name, 'r')
            wavelengths = []
            rpart = []
@@ -302,8 +344,11 @@ def match_grid(sconf):

## \brief Print a command-line help summary.
def print_help():
    print("                                               ")
    print("***              MODEL_MAKER                ***")
    print("###############################################")
    print("#                                             #")
    print("#           NPtm_code MODEL_MAKER             #")
    print("#                                             #")
    print("###############################################")
    print("                                               ")
    print("Create input files for FORTRAN and C++ code.   ")
    print("                                               ")
@@ -315,18 +360,65 @@ def print_help():
    print("--help                Print this help and exit.")
    print("                                               ")

def write_legacy_sconf(sconf):
## \brief Write the geometry configuration dictionary to legacy format.
#
#  \param conf: `dict` Geometry configuration dictionary.
#  \return result: `int` An exit code (0 if successful).
def write_legacy_gconf(conf):
    result = 0
    out_file = str(conf['out_file'])
    nsph = conf['nsph']
    str_line = "INIT"
    # Write legacy output
    output = open(out_file, 'w')
    if (conf['application'] == "SPHERE"):
        str_line = " {0:4d} {1:4d} {2:4d} {3:4d} {4:4d} {5:4d}\n".format(
            nsph, conf['li'], conf['inpol'], conf['npnt'], conf['npntts'], conf['isam']
        )
        output.write(str_line)
    else:
        mxndm = 2 * nsph * conf['li'] * (conf['li'] + 2)
        str_line = " {0:4d} {1:4d} {2:4d} {3:4d} {4:4d} {5:4d} {6:4d} {7:4d}\n".format(
            nsph, conf['li'], conf['le'], mxndm, conf['inpol'],
            conf['npnt'], conf['npntts'], conf['iavm'], conf['isam']
        )
        output.write(str_line)
        for si in range(nsph):
            str_line = " {0:15.8E} {1:15.8E} {2:15.8E}\n".format(
                conf['vec_sph_x'][si], conf['vec_sph_y'][si], conf['vec_sph_z'][si]
            )
            output.write(str_line)
    str_line = " {0:7.2E}  {1:7.2E}  {2:7.2E}  {3:7.2E}  {4:7.2E}  {5:7.2E}\n".format(
        conf['th'], conf['thstp'], conf['thlst'],
        conf['ph'], conf['phstp'], conf['phlst']
    )
    output.write(str_line)
    str_line = " {0:7.2E}  {1:7.2E}  {2:7.2E}  {3:7.2E}  {4:7.2E}  {5:7.2E}\n".format(
        conf['ths'], conf['thsstp'], conf['thslst'],
        conf['phs'], conf['phsstp'], conf['phslst']
    )
    output.write(str_line)
    str_line = " {0:d}\n0\n".format(conf['jwtm'])
    output.write(str_line)
    output.close()
    return result

## \brief Write the scatterer configuration dictionary to legacy format.
#
#  \param conf: `dict` Scatterer configuration dictionary.
#  \return result: `int` An exit code (0 if successful).
def write_legacy_sconf(conf):
    result = 0
    out_file = str(sconf['out_file'])
    nsph = sconf['nsph']
    ies = sconf['ies']
    exdc = sconf['exdc']
    wp = sconf['wp']
    xip = sconf['xip']
    idfc = sconf['idfc']
    instpc = sconf['instpc']
    out_file = str(conf['out_file'])
    nsph = conf['nsph']
    ies = conf['ies']
    exdc = conf['exdc']
    wp = conf['wp']
    xip = conf['xip']
    idfc = conf['idfc']
    instpc = conf['instpc']
    xi_flag = 3
    nxi = sconf['nxi']
    nxi = conf['nxi']
    # Write legacy output
    output = open(out_file, 'w')
    str_line = " {0:3d}{1:3d}\n".format(nsph, ies)
@@ -337,14 +429,14 @@ def write_legacy_sconf(sconf):
    output.write(str_line)
    if (instpc == 0):
        for ixi in range(nxi):
            str_line = "{0:.3E}\n".format(sconf['vec_xi'][ixi])
            str_line = "{0:.3E}\n".format(conf['vec_xi'][ixi])
            output.write(str_line)
    else:
        str_line = "{0:.3E}  {1:.3E}\n".format(sconf['xi_start'], sconf['xi_step'])
        str_line = "{0:.3E}  {1:.3E}\n".format(conf['xi_start'], conf['xi_step'])
        output.write(str_line)
    sphere_count = 0
    for si in range(nsph):
        str_line = "{0:5d}".format(sconf['vec_types'][si])
        str_line = "{0:5d}".format(conf['vec_types'][si])
        output.write(str_line)
        sphere_count += 1
        if (sphere_count == 16):
@@ -352,20 +444,20 @@ def write_legacy_sconf(sconf):
            sphere_count = 0
    if (sphere_count != 0):
        output.write("\n")
    for ci in range(sconf['configurations']):
        str_line = "{0:3d}   {1:15.7E}\n".format(sconf['nshl'][ci], sconf['ros'][ci])
    for ci in range(conf['configurations']):
        str_line = "{0:3d}   {1:15.7E}\n".format(conf['nshl'][ci], conf['ros'][ci])
        output.write(str_line)
        for cj in range(sconf['nshl'][ci]):
            str_line = " {0:.7E}\n".format(sconf['rcf'][ci][cj])
        for cj in range(conf['nshl'][ci]):
            str_line = " {0:.7E}\n".format(conf['rcf'][ci][cj])
            output.write(str_line)
    if (sconf['idfc'] == 0):
    if (conf['idfc'] == 0):
        # Write all wavelength dependent constants for each layer in each configuration
        for xi in range(sconf['configurations']):
            for xj in range(sconf['nshl'][xi]):
                for xk in range(sconf['nxi']):
                    for xii in range(sconf['configurations']):
                        rdc0 = sconf['rdc0'][xj][xii][xk]
                        idc0 = sconf['idc0'][xj][xii][xk]
        for xi in range(conf['configurations']):
            for xj in range(conf['nshl'][xi]):
                for xk in range(conf['nxi']):
                    for xii in range(conf['configurations']):
                        rdc0 = conf['rdc0'][xj][xii][xk]
                        idc0 = conf['idc0'][xj][xii][xk]
                        if (rdc0 != 0.0 and idc0 != 0.0):
                            str_line = "({0:11.5E},{1:11.5E})\n".format(rdc0, idc0)
                            output.write(str_line)
@@ -373,9 +465,6 @@ def write_legacy_sconf(sconf):
    output.close()
    return result

def write_gconf(model, out_file):
    return

## \brief Exit code (0 for success)
exit_code = main()
exit(exit_code)