Ejemplo n.º 1
0
    def load(f, version='mf2k', exe_name='mf2005.exe', 
             verbose=False, model_ws=None):
        """
        Load an existing model.

        Parameters
        ----------
        f : MODFLOW name file
            File to load.
        
        model_ws : model workspace path

        Returns
        -------
        ml : Modflow object

        Examples
        --------

        >>> import flopy
        >>> ml = flopy.modflow.Modflow.load(f)

        """
        ml = Modflow(f.split('.')[0], version=version, exe_name=exe_name, 
                     verbose=False, model_ws=model_ws)
        try:
            namefile_path = os.path.join(ml.model_ws, ml.namefile)
            ext_unit_dict = mfreadnam.parsenamefile(namefile_path, ml.mfnam_packages)
        except Exception as e:
            print "error loading namfile entries from file"
            print str(e)
            return None
        dis = None
        dis_key = None
        for key, item in ext_unit_dict.iteritems():
            if item.filetype.lower() == "dis":
                dis = item
                dis_key = key
        pck = dis.package.load(dis.filename, ml, ext_unit_dict=ext_unit_dict)
        ext_unit_dict.pop(dis_key)
        if verbose:
            print ext_unit_dict
        for key, item in ext_unit_dict.iteritems():
            if item.package is not None:
                pck = item.package.load(item.filename, ml, ext_unit_dict=ext_unit_dict)
                pass
            elif "data" not in item.filetype.lower():
                if verbose:
                    print "skipping package", item.filetype, item.filename
        return ml
Ejemplo n.º 2
0
Archivo: mf.py Proyecto: visr/flopy
    def load(f, version='mf2k', exe_name='mf2005.exe', verbose=False,
             model_ws='.', load_only=None,forgive=True):
        """
        Load an existing model.

        Parameters
        ----------
        f : MODFLOW name file
            File to load.
        
        model_ws : model workspace path

        load_only : (optional) filetype(s) to load (e.g. ["bas6", "lpf"])

        forgive : flag to raise exception(s) on package load failure - good for debugging

        Returns
        -------
        ml : Modflow object

        Examples
        --------

        >>> import flopy
        >>> ml = flopy.modflow.Modflow.load(f)

        """
        # test if name file is passed with extension (i.e., is a valid file)
        if os.path.isfile(os.path.join(model_ws, f)):
            modelname = f.rpartition('.')[0]
        else:
            modelname = f

        # if model_ws is None:
        #    model_ws = os.path.dirname(f)
        if verbose:
            sys.stdout.write('\nCreating new model with name: {}\n{}\n\n'.
                             format(modelname, 50 * '-'))
        ml = Modflow(modelname, version=version, exe_name=exe_name,
                     verbose=verbose, model_ws=model_ws)

        files_succesfully_loaded = []
        files_not_loaded = []

        # read name file
        try:
            namefile_path = os.path.join(ml.model_ws, f)
            ext_unit_dict = mfreadnam.parsenamefile(namefile_path,
                                                    ml.mfnam_packages,
                                                    verbose=verbose)
        except Exception as e:
            #print("error loading name file entries from file")
            #print(str(e))
            #return None
            raise Exception("error loading name file entries from file:\n" + str(e))

        if ml.verbose:
            print('\n{}\nExternal unit dictionary:\n{}\n{}\n'.
                  format(50 * '-', ext_unit_dict, 50 * '-'))

        # load dis
        dis = None
        dis_key = None
        for key, item in ext_unit_dict.items():
            if item.filetype == "DIS":
                dis = item
                dis_key = key
                break
        try:
            pck = dis.package.load(dis.filename, ml,
                                   ext_unit_dict=ext_unit_dict)
            files_succesfully_loaded.append(dis.filename)
            if ml.verbose:
                sys.stdout.write('   {:4s} package load...success\n'
                                 .format(pck.name[0]))
            ext_unit_dict.pop(dis_key)
        except Exception as e:
            s = 'Could not read discretization package: {}. Stopping...' \
                .format(os.path.basename(dis.filename))
            raise Exception(s + " " + str(e))

        if load_only is None:
            load_only = []
            for key, item in ext_unit_dict.items():
                load_only.append(item.filetype)
        else:
            if not isinstance(load_only, list):
                load_only = [load_only]
            not_found = []
            for i, filetype in enumerate(load_only):
                filetype = filetype.upper()
                if filetype != 'DIS':
                    load_only[i] = filetype
                    found = False
                    for key, item in ext_unit_dict.items():
                        if item.filetype == filetype:
                            found = True
                            break
                    if not found:
                        not_found.append(filetype)
            if len(not_found) > 0:
                raise Exception("the following load_only entries were not found "
                                "in the ext_unit_dict: " + ','.join(not_found))


        # zone, mult, pval
        ml.mfpar.set_pval(ml, ext_unit_dict)
        ml.mfpar.set_zone(ml, ext_unit_dict)
        ml.mfpar.set_mult(ml, ext_unit_dict)

        # try loading packages in ext_unit_dict
        for key, item in ext_unit_dict.items():
            if item.package is not None:
                if item.filetype in load_only and item.filetype != "DIS":
                    if not forgive:
                        pck = item.package.load(item.filename, ml,
                                                ext_unit_dict=ext_unit_dict)
                        files_succesfully_loaded.append(item.filename)
                        if ml.verbose:
                            sys.stdout.write('   {:4s} package load...success\n'
                                             .format(pck.name[0]))
                    else:
                        try:
                            pck = item.package.load(item.filename, ml,
                                                    ext_unit_dict=ext_unit_dict)
                            files_succesfully_loaded.append(item.filename)
                            if ml.verbose:
                                sys.stdout.write('   {:4s} package load...success\n'
                                                 .format(pck.name[0]))
                        except BaseException as o:
                            ml.load_fail = True
                            if ml.verbose:
                                sys.stdout.write('   {:4s} package load...failed\n   {!s}\n'
                                                 .format(item.filetype, o))
                            files_not_loaded.append(item.filename)
                else:
                    if ml.verbose:
                        sys.stdout.write('   {:4s} package load...skipped\n'
                                         .format(item.filetype))
                    files_not_loaded.append(item.filename)
            elif "data" not in item.filetype.lower():
                files_not_loaded.append(item.filename)
                if ml.verbose:
                    sys.stdout.write('   {:4s} package load...skipped\n'
                                     .format(item.filetype))
            elif "data" in item.filetype.lower():
                if ml.verbose:
                    sys.stdout.write('   {} file load...skipped\n      {}\n'
                                     .format(item.filetype,
                                             os.path.basename(item.filename)))
                if key not in ml.pop_key_list:
                    ml.external_fnames.append(item.filename)
                    ml.external_units.append(key)
                    ml.external_binflag.append("binary"
                                               in item.filetype.lower())

        # pop binary output keys and any external file units that are now
        # internal
        for key in ml.pop_key_list:
            try:
                ml.remove_external(unit=key)
                ext_unit_dict.pop(key)
            except:
                if ml.verbose:
                    sys.stdout.write('Warning: external file unit " +\
                        "{} does not exist in ext_unit_dict.\n'.format(key))

        # write message indicating packages that were successfully loaded
        if ml.verbose:
            print(1 * '\n')
            s = '   The following {0} packages were successfully loaded.' \
                .format(len(files_succesfully_loaded))
            print(s)
            for fname in files_succesfully_loaded:
                print('      ' + os.path.basename(fname))
            if len(files_not_loaded) > 0:
                s = '   The following {0} packages were not loaded.'.format(
                    len(files_not_loaded))
                print(s)
                for fname in files_not_loaded:
                    print('      ' + os.path.basename(fname))
                print('\n')

        # return model object
        return ml
Ejemplo n.º 3
0
    def load(f,
             version='mt3dms',
             exe_name='mt3dms.exe',
             verbose=False,
             model_ws='.',
             load_only=None,
             forgive=False,
             modflowmodel=None):
        """
        Load an existing model.

        Parameters
        ----------
        f : string
            Full path and name of MT3D name file.

        version : string
            The version of MT3D (mt3dms, or mt3d-usgs)
            (default is mt3dms)

        exe_name : string
            The name of the executable to use if this loaded model is run.
            (default is mt3dms.exe)

        verbose : bool
            Write information on the load process if True.
            (default is False)

        model_ws : string
            The path for the model workspace.
            (default is the current working directory '.')

        load_only : list of strings
            Filetype(s) to load (e.g. ['btn', 'adv'])
            (default is None, which means that all will be loaded)

        modflowmodel : flopy.modflow.mf.Modflow
            This is a flopy Modflow model object upon which this Mt3dms
            model is based. (the default is None)

        Returns
        -------
        mt : flopy.mt3d.mt.Mt3dms
            flopy Mt3d model object

        Notes
        -----
        The load method does not retain the name for the MODFLOW-generated
        FTL file.  This can be added manually after the MT3D model has been
        loaded.  The syntax for doing this manually is
        mt.ftlfilename = 'example.ftl'

        Examples
        --------

        >>> import mf2web
        >>> f = 'example.nam'
        >>> mt = mf2web.mt3d.Mt3dms.load(f)
        >>> mt.ftlfilename = 'example.ftl'

        """
        # test if name file is passed with extension (i.e., is a valid file)
        modelname_extension = None
        if os.path.isfile(os.path.join(model_ws, f)):
            modelname = f.rpartition('.')[0]
            modelname_extension = f.rpartition('.')[2]
        else:
            modelname = f

        if verbose:
            sys.stdout.write(
                '\nCreating new model with name: {}\n{}\n\n'.format(
                    modelname, 50 * '-'))
        mt = Mt3dms(modelname=modelname,
                    namefile_ext=modelname_extension,
                    version=version,
                    exe_name=exe_name,
                    verbose=verbose,
                    model_ws=model_ws,
                    modflowmodel=modflowmodel)

        files_successfully_loaded = []
        files_not_loaded = []

        # read name file
        try:
            # namefile_path = os.path.join(mt.model_ws, mt.namefile)
            # namefile_path = f
            namefile_path = os.path.join(mt.model_ws, f)
            ext_unit_dict = mfreadnam.parsenamefile(namefile_path,
                                                    mt.mfnam_packages,
                                                    verbose=verbose)
        except Exception as e:
            # print("error loading name file entries from file")
            # print(str(e))
            # return None
            raise Exception("error loading name file entries from file:\n" +
                            str(e))

        if mt.verbose:
            print('\n{}\nExternal unit dictionary:\n{}\n{}\n'.format(
                50 * '-', ext_unit_dict, 50 * '-'))

        # reset unit number for list file
        unitnumber = None
        for key, value in ext_unit_dict.items():
            if value.filetype == 'LIST':
                unitnumber = key
                filepth = os.path.basename(value.filename)
        if unitnumber == 'LIST':
            unitnumber = 16
        if unitnumber is not None:
            mt.lst.unit_number = [unitnumber]
            mt.lst.file_name = [filepth]

        # set ftl information
        unitnumber = None
        for key, value in ext_unit_dict.items():
            if value.filetype == 'FTL':
                unitnumber = key
                filepth = os.path.basename(value.filename)
        if unitnumber == 'FTL':
            unitnumber = 10
        if unitnumber is not None:
            mt.ftlunit = unitnumber
            mt.ftlfilename = filepth

        # load btn
        btn = None
        btn_key = None
        for key, item in ext_unit_dict.items():
            if item.filetype.lower() == "btn":
                btn = item
                btn_key = key
                break

        if btn is None:
            return None

        try:
            pck = btn.package.load(btn.filename,
                                   mt,
                                   ext_unit_dict=ext_unit_dict)
        except Exception as e:
            raise Exception('error loading BTN: {0}'.format(str(e)))
        files_successfully_loaded.append(btn.filename)
        if mt.verbose:
            sys.stdout.write('   {:4s} package load...success\n'.format(
                pck.name[0]))
        ext_unit_dict.pop(btn_key)

        if load_only is None:
            load_only = []
            for key, item in ext_unit_dict.items():
                load_only.append(item.filetype)
        else:
            if not isinstance(load_only, list):
                load_only = [load_only]
            not_found = []
            for i, filetype in enumerate(load_only):
                filetype = filetype.upper()
                if filetype != 'BTN':
                    load_only[i] = filetype
                    found = False
                    for key, item in ext_unit_dict.items():
                        if item.filetype == filetype:
                            found = True
                            break
                    if not found:
                        not_found.append(filetype)
            if len(not_found) > 0:
                raise Exception(
                    "the following load_only entries were not found "
                    "in the ext_unit_dict: " + ','.join(not_found))

        # try loading packages in ext_unit_dict
        for key, item in ext_unit_dict.items():
            if item.package is not None:
                if item.filetype in load_only:
                    if forgive:
                        try:
                            pck = item.package.load(
                                item.filename, mt, ext_unit_dict=ext_unit_dict)
                            files_successfully_loaded.append(item.filename)
                            if mt.verbose:
                                sys.stdout.write(
                                    '   {:4s} package load...success\n'.format(
                                        pck.name[0]))
                        except BaseException as o:
                            if mt.verbose:
                                sys.stdout.write(
                                    '   {:4s} package load...failed\n   {!s}\n'
                                    .format(item.filetype, o))
                            files_not_loaded.append(item.filename)
                    else:
                        pck = item.package.load(item.filename,
                                                mt,
                                                ext_unit_dict=ext_unit_dict)
                        files_successfully_loaded.append(item.filename)
                        if mt.verbose:
                            sys.stdout.write(
                                '   {:4s} package load...success\n'.format(
                                    pck.name[0]))
                else:
                    if mt.verbose:
                        sys.stdout.write(
                            '   {:4s} package load...skipped\n'.format(
                                item.filetype))
                    files_not_loaded.append(item.filename)
            elif "data" not in item.filetype.lower():
                files_not_loaded.append(item.filename)
                if mt.verbose:
                    sys.stdout.write(
                        '   {:4s} package load...skipped\n'.format(
                            item.filetype))
            elif "data" in item.filetype.lower():
                if mt.verbose:
                    sys.stdout.write(
                        '   {} file load...skipped\n      {}\n'.format(
                            item.filetype, os.path.basename(item.filename)))
                if key not in mt.pop_key_list:
                    mt.external_fnames.append(item.filename)
                    mt.external_units.append(key)
                    mt.external_binflag.append(
                        "binary" in item.filetype.lower())
                    mt.external_output.append(False)

        # pop binary output keys and any external file units that are now
        # internal
        for key in mt.pop_key_list:
            try:
                mt.remove_external(unit=key)
                ext_unit_dict.pop(key)
            except:
                if mt.verbose:
                    sys.stdout.write('Warning: external file unit " +\
                        "{} does not exist in ext_unit_dict.\n'.format(key))

        # write message indicating packages that were successfully loaded
        if mt.verbose:
            print(1 * '\n')
            s = '   The following {0} packages were successfully loaded.' \
                .format(len(files_successfully_loaded))
            print(s)
            for fname in files_successfully_loaded:
                print('      ' + os.path.basename(fname))
            if len(files_not_loaded) > 0:
                s = '   The following {0} packages were not loaded.'.format(
                    len(files_not_loaded))
                print(s)
                for fname in files_not_loaded:
                    print('      ' + os.path.basename(fname))
                print('\n')

        # return model object
        return mt
Ejemplo n.º 4
0
def flopy_mf2005_load(m, load_only=None, forgive=False, check=False):
    """Execute the code in flopy.modflow.Modflow.load on an existing
    flopy.modflow.Modflow instance."""
    version = m.version
    verbose = m.verbose
    model_ws = m.model_ws

    # similar to modflow command: if file does not exist , try file.nam
    namefile_path = os.path.join(model_ws, m.namefile)
    if (not os.path.isfile(namefile_path)
            and os.path.isfile(namefile_path + '.nam')):
        namefile_path += '.nam'
    if not os.path.isfile(namefile_path):
        raise IOError('cannot find name file: ' + str(namefile_path))

    files_successfully_loaded = []
    files_not_loaded = []

    # set the reference information
    ref_attributes = SpatialReference.load(namefile_path)

    # read name file
    ext_unit_dict = mfreadnam.parsenamefile(namefile_path,
                                            m.mfnam_packages,
                                            verbose=verbose)
    if m.verbose:
        print('\n{}\nExternal unit dictionary:\n{}\n{}\n'.format(
            50 * '-', ext_unit_dict, 50 * '-'))

    # create a dict where key is the package name, value is unitnumber
    ext_pkg_d = {v.filetype: k for (k, v) in ext_unit_dict.items()}

    # version is assumed to be mfnwt
    m.set_version(version)

    # reset unit number for list file
    if 'LIST' in ext_pkg_d:
        unitnumber = ext_pkg_d['LIST']
        filepth = os.path.basename(ext_unit_dict[unitnumber].filename)
        m.lst.unit_number = [unitnumber]
        m.lst.file_name = [filepth]

    # look for the free format flag in bas6
    bas_key = ext_pkg_d.get('BAS6')
    if bas_key is not None:
        bas = ext_unit_dict[bas_key]
        start = bas.filehandle.tell()
        line = bas.filehandle.readline()
        while line.startswith("#"):
            line = bas.filehandle.readline()
        if "FREE" in line.upper():
            m.free_format_input = True
        bas.filehandle.seek(start)
    if verbose:
        print("ModflowBas6 free format:{0}\n".format(m.free_format_input))

    # load dis
    dis_key = ext_pkg_d.get('DIS') or ext_pkg_d.get('DISU')
    if dis_key is None:
        raise KeyError('discretization entry not found in nam file')
    disnamdata = ext_unit_dict[dis_key]
    dis = disnamdata.package.load(disnamdata.filename,
                                  m,
                                  ext_unit_dict=ext_unit_dict,
                                  check=False)
    files_successfully_loaded.append(disnamdata.filename)
    if m.verbose:
        print('   {:4s} package load...success'.format(dis.name[0]))
    m.setup_grid()  # reset model grid now that DIS package is loaded
    assert m.pop_key_list.pop() == dis_key
    ext_unit_dict.pop(dis_key)
    start_datetime = ref_attributes.pop("start_datetime", "01-01-1970")
    itmuni = ref_attributes.pop("itmuni", 4)
    ref_source = ref_attributes.pop("source", "defaults")
    # if m.structured:
    #    # get model units from usgs.model.reference, if provided
    #    if ref_source == 'usgs.model.reference':
    #        pass
    #    # otherwise get them from the DIS file
    #    else:
    #        itmuni = dis.itmuni
    #        ref_attributes['lenuni'] = dis.lenuni
    #    sr = SpatialReference(delr=m.dis.delr.array, delc=ml.dis.delc.array,
    #                          **ref_attributes)
    # else:
    #    sr = None
    #
    dis.sr = m.sr
    dis.tr = TemporalReference(itmuni=itmuni, start_datetime=start_datetime)
    dis.start_datetime = start_datetime

    if load_only is None:
        # load all packages/files
        load_only = ext_pkg_d.keys()
    else:  # check items in list
        if not isinstance(load_only, list):
            load_only = [load_only]
        not_found = []
        for i, filetype in enumerate(load_only):
            load_only[i] = filetype = filetype.upper()
            if filetype not in ext_pkg_d:
                not_found.append(filetype)
        if not_found:
            raise KeyError("the following load_only entries were not found "
                           "in the ext_unit_dict: " + str(not_found))

    # try loading packages in ext_unit_dict
    for key, item in ext_unit_dict.items():
        if item.package is not None:
            if item.filetype in load_only:
                if forgive:
                    try:
                        package_load_args = \
                            list(inspect.getargspec(item.package.load))[0]
                        if "check" in package_load_args:
                            pck = item.package.load(
                                item.filename,
                                m,
                                ext_unit_dict=ext_unit_dict,
                                check=False)
                        else:
                            pck = item.package.load(
                                item.filename, m, ext_unit_dict=ext_unit_dict)
                        files_successfully_loaded.append(item.filename)
                        if m.verbose:
                            print('   {:4s} package load...success'.format(
                                item.filetype))
                    except Exception as e:
                        m.load_fail = True
                        if m.verbose:
                            print('   {:4s} package load...failed\n   {!s}'.
                                  format(item.filetype, e))
                        files_not_loaded.append(item.filename)
                else:
                    package_load_args = \
                        list(inspect.getargspec(item.package.load))[0]
                    if "check" in package_load_args:
                        pck = item.package.load(item.filename,
                                                m,
                                                ext_unit_dict=ext_unit_dict,
                                                check=False)
                    else:
                        pck = item.package.load(item.filename,
                                                m,
                                                ext_unit_dict=ext_unit_dict)
                    files_successfully_loaded.append(item.filename)
                    if m.verbose:
                        print('   {:4s} package load...success'.format(
                            item.filetype))
            else:
                if m.verbose:
                    print('   {:4s} package load...skipped'.format(
                        item.filetype))
                files_not_loaded.append(item.filename)
        elif "data" not in item.filetype.lower():
            files_not_loaded.append(item.filename)
            if m.verbose:
                print('   {:4s} package load...skipped'.format(item.filetype))
        elif "data" in item.filetype.lower():
            if m.verbose:
                print('   {} file load...skipped\n      {}'.format(
                    item.filetype, os.path.basename(item.filename)))
            if key not in m.pop_key_list:
                # do not add unit number (key) if it already exists
                if key not in m.external_units:
                    m.external_fnames.append(item.filename)
                    m.external_units.append(key)
                    m.external_binflag.append(
                        "binary" in item.filetype.lower())
                    m.external_output.append(False)
        else:
            raise KeyError('unhandled case: {}, {}'.format(key, item))

    # pop binary output keys and any external file units that are now
    # internal
    for key in m.pop_key_list:
        try:
            m.remove_external(unit=key)
            ext_unit_dict.pop(key)
        except KeyError:
            if m.verbose:
                print('Warning: external file unit {} does not exist in '
                      'ext_unit_dict.'.format(key))

    # write message indicating packages that were successfully loaded
    if m.verbose:
        print('')
        print('   The following {0} packages were successfully loaded.'.format(
            len(files_successfully_loaded)))
        for fname in files_successfully_loaded:
            print('      ' + os.path.basename(fname))
        if len(files_not_loaded) > 0:
            print('   The following {0} packages were not loaded.'.format(
                len(files_not_loaded)))
            for fname in files_not_loaded:
                print('      ' + os.path.basename(fname))
    if check:
        m.check(f='{}.chk'.format(m.name), verbose=m.verbose, level=0)

    # return model object
    return m
Ejemplo n.º 5
0
    def load(f, version='mf2k', exe_name='mf2005.exe', verbose=False,
             model_ws='.', load_only=None):
        """
        Load an existing model.

        Parameters
        ----------
        f : MODFLOW name file
            File to load.
        
        model_ws : model workspace path

        load_only : (optional) filetype(s) to load (e.g. ["bas6", "lpf"])

        Returns
        -------
        ml : Modflow object

        Examples
        --------

        >>> import flopy
        >>> ml = flopy.modflow.Modflow.load(f)

        """
        modelname = os.path.basename(f).split('.')[0]

        #if model_ws is None:
        #    model_ws = os.path.dirname(f)
        if verbose:
            sys.stdout.write('\nCreating new model with name: {}\n{}\n\n'.
                             format(modelname, 50*'-'))
        ml = Modflow(modelname, version=version, exe_name=exe_name,
                     verbose=verbose, model_ws=model_ws)

        files_succesfully_loaded = []
        files_not_loaded = []

        # read name file
        try:
            namefile_path = os.path.join(ml.model_ws, ml.namefile)
            ext_unit_dict = mfreadnam.parsenamefile(namefile_path,
                                                    ml.mfnam_packages,
                                                    verbose=verbose)
        except Exception as e:
            print("error loading namfile entries from file")
            print(str(e))
            return None

        if ml.verbose:
            print('\n{}\nExternal unit dictionary:\n{}\n{}\n'.
                format(50*'-', ext_unit_dict, 50*'-'))

        # load dis
        dis = None
        dis_key = None
        for key, item in ext_unit_dict.items():
            if item.filetype.lower() == "dis":
                dis = item
                dis_key = key
                break
        try:
            pck = dis.package.load(dis.filename, ml,
                                   ext_unit_dict=ext_unit_dict)
            files_succesfully_loaded.append(dis.filename)
            if ml.verbose:
                sys.stdout.write('   {:4s} package load...success\n'
                                 .format(pck.name[0]))
            ext_unit_dict.pop(dis_key)
        except Exception as e:
            s = 'Could not read discretization package: {}. Stopping...'\
                .format(os.path.basename(dis.filename))
            raise Exception(s + " " + str(e))

        if load_only is None:
            load_only = []
            for key,item in ext_unit_dict.items():
                load_only.append(item.filetype)
        else:
            if not isinstance(load_only,list):
                load_only = [load_only]
            not_found = []
            for i,filetype in enumerate(load_only):
                filetype = filetype.upper()
                if filetype != 'DIS':
                    load_only[i] = filetype
                    found = False
                    for key,item in ext_unit_dict.items():
                        if item.filetype == filetype:
                            found = True
                            break
                    if not found:
                        not_found.append(filetype)
            if len(not_found) > 0:
                raise Exception("the following load_only entries were not found "
                                "in the ext_unit_dict: " +','.join(not_found))


        # zone, mult, pval
        ml.mfpar.set_pval(ml, ext_unit_dict)
        ml.mfpar.set_zone(ml, ext_unit_dict)
        ml.mfpar.set_mult(ml, ext_unit_dict)

        # try loading packages in ext_unit_dict
        for key, item in ext_unit_dict.items():
            if item.package is not None:
                if item.filetype in load_only:
                    try:
                        pck = item.package.load(item.filename, ml,
                                                ext_unit_dict=ext_unit_dict)
                        files_succesfully_loaded.append(item.filename)
                        if ml.verbose:
                            sys.stdout.write('   {:4s} package load...success\n'
                                             .format(pck.name[0]))
                    except BaseException as o:
                        if ml.verbose:
                            sys.stdout.write('   {:4s} package load...failed\n   {!s}\n'
                                             .format(item.filetype, o))
                        files_not_loaded.append(item.filename)
                else:
                    if ml.verbose:
                        sys.stdout.write('   {:4s} package load...skipped\n'
                                         .format(item.filetype))
                    files_not_loaded.append(item.filename)
            elif "data" not in item.filetype.lower():
                files_not_loaded.append(item.filename)
                if ml.verbose:
                    sys.stdout.write('   {:4s} package load...skipped\n'
                                     .format(item.filetype))
            elif "data" in item.filetype.lower():
                if ml.verbose:
                    sys.stdout.write('   {} file load...skipped\n      {}\n'
                                     .format(item.filetype,
                                         os.path.basename(item.filename)))
                if key not in ml.pop_key_list:
                    ml.external_fnames.append(item.filename)
                    ml.external_units.append(key)
                    ml.external_binflag.append("binary"
                                               in item.filetype.lower())

        # pop binary output keys and any external file units that are now
        # internal
        for key in ml.pop_key_list:
            try:
                ml.remove_external(unit=key)
                ext_unit_dict.pop(key)
            except:
                if ml.verbose:
                    sys.stdout.write('Warning: external file unit " +\
                        "{} does not exist in ext_unit_dict.\n'.format(key))

        # write message indicating packages that were successfully loaded
        if ml.verbose:
            print(1 * '\n')
            s = '   The following {0} packages were successfully loaded.'\
                .format(len(files_succesfully_loaded))
            print(s)
            for fname in files_succesfully_loaded:
                print('      ' + os.path.basename(fname))
            if len(files_not_loaded) > 0:
                s = '   The following {0} packages were not loaded.'.format(
                    len(files_not_loaded))
                print(s)
                for fname in files_not_loaded:
                    print('      ' + os.path.basename(fname))
                print('\n')

        # return model object
        return ml
Ejemplo n.º 6
0
    def load(f,
             version='mf2k',
             exe_name='mf2005.exe',
             verbose=False,
             model_ws='.'):
        """
        Load an existing model.

        Parameters
        ----------
        f : MODFLOW name file
            File to load.
        
        model_ws : model workspace path

        Returns
        -------
        ml : Modflow object

        Examples
        --------

        >>> import flopy
        >>> ml = flopy.modflow.Modflow.load(f)

        """
        modelname = os.path.basename(f).split('.')[0]

        #if model_ws is None:
        #    model_ws = os.path.dirname(f)
        sys.stdout.write('\nCreating new model with name: {}\n{}\n\n'.format(
            modelname, 50 * '-'))
        ml = Modflow(modelname,
                     version=version,
                     exe_name=exe_name,
                     verbose=verbose,
                     model_ws=model_ws)

        files_succesfully_loaded = []
        files_not_loaded = []

        # read name file
        try:
            namefile_path = os.path.join(ml.model_ws, ml.namefile)
            ext_unit_dict = mfreadnam.parsenamefile(namefile_path,
                                                    ml.mfnam_packages,
                                                    verbose=verbose)
        except Exception as e:
            print "error loading namfile entries from file"
            print str(e)
            return None

        if ml.verbose:
            print '\n{}\nExternal unit dictionary:\n{}\n{}\n'.\
                format(50*'-', ext_unit_dict, 50*'-')

        # load dis
        dis = None
        dis_key = None
        for key, item in ext_unit_dict.iteritems():
            if item.filetype.lower() == "dis":
                dis = item
                dis_key = key
        try:
            pck = dis.package.load(dis.filename,
                                   ml,
                                   ext_unit_dict=ext_unit_dict)
            files_succesfully_loaded.append(dis.filename)
            sys.stdout.write('   {:4s} package load...success\n'.format(
                pck.name[0]))
            ext_unit_dict.pop(dis_key)
        except:
            s = 'Could not read discretization package: {}. Stopping...'\
                .format(os.path.basename(dis.filename))
            raise Exception(s)

        # zone, mult, pval
        ml.mfpar.set_pval(ml, ext_unit_dict)
        ml.mfpar.set_zone(ml, ext_unit_dict)
        ml.mfpar.set_mult(ml, ext_unit_dict)

        # try loading packages in ext_unit_dict
        for key, item in ext_unit_dict.iteritems():
            if item.package is not None:
                try:
                    pck = item.package.load(item.filename,
                                            ml,
                                            ext_unit_dict=ext_unit_dict)
                    files_succesfully_loaded.append(item.filename)
                    sys.stdout.write(
                        '   {:4s} package load...success\n'.format(
                            pck.name[0]))
                except BaseException as o:
                    sys.stdout.write(
                        '   {:4s} package load...failed\n   {!s}\n'.format(
                            item.filetype, o))
                    files_not_loaded.append(item.filename)
            elif "data" not in item.filetype.lower():
                files_not_loaded.append(item.filename)
                sys.stdout.write('   {:4s} package load...skipped\n'.format(
                    item.filetype))
            elif "data" in item.filetype.lower():
                sys.stdout.write(
                    '   {} file load...skipped\n      {}\n'.format(
                        item.filetype, os.path.basename(item.filename)))
                if key not in ml.pop_key_list:
                    ml.external_fnames.append(item.filename)
                    ml.external_units.append(key)
                    ml.external_binflag.append(
                        "binary" in item.filetype.lower())

        #--pop binary output keys and any external file units that are now
        #--internal
        for key in ml.pop_key_list:
            try:
                ml.remove_external(unit=key)
                ext_unit_dict.pop(key)
            except:
                if ml.verbose:
                    sys.stdout.write('Warning: external file unit " +\
                        "{} does not exist in ext_unit_dict.\n'.format(key))

        #--write message indicating packages that were successfully loaded
        print 1 * '\n'
        s = '   The following {0} packages were successfully loaded.'.format(
            len(files_succesfully_loaded))
        print s
        for fname in files_succesfully_loaded:
            print '      ' + os.path.basename(fname)
        if len(files_not_loaded) > 0:
            s = '   The following {0} packages were not loaded.'.format(
                len(files_not_loaded))
            print s
            for fname in files_not_loaded:
                print '      ' + os.path.basename(fname)
            print '\n'

        #--return model object
        return ml
Ejemplo n.º 7
0
Archivo: mt.py Proyecto: visr/flopy
    def load(f, version='mt3dms', exe_name='mt3dms.exe', verbose=False,
             model_ws='.', load_only=None):
        """
        Load an existing model.

        Parameters
        ----------
        f : string
            Full path and name of MT3D name file.

        version : string
            The version of MT3D (mt3dms, or mt3d-usgs)
            (default is mt3dms)

        exe_name : string
            The name of the executable to use if this loaded model is run.
            (default is mt3dms.exe)

        verbose : bool
            Write information on the load process if True.
            (default is False)

        model_ws : string
            The path for the model workspace.
            (default is the current working directory '.')

        load_only : list of strings
            Filetype(s) to load (e.g. ['btn', 'adv'])
            (default is None, which means that all will be loaded)

        Returns
        -------
        mt : flopy.mt3d.mt.Mt3dms
            flopy Mt3d model object

        Examples
        --------

        >>> import flopy
        >>> mt = flopy.mt3d.mt.Mt3dms.load(f)

        """
        # test if name file is passed with extension (i.e., is a valid file)
        if os.path.isfile(os.path.join(model_ws, f)):
            modelname = f.rpartition('.')[0]
        else:
            modelname = f

        if verbose:
            sys.stdout.write('\nCreating new model with name: {}\n{}\n\n'.
                             format(modelname, 50 * '-'))
        mt = Mt3dms(modelname=modelname,
                     version=version, exe_name=exe_name,
                     verbose=verbose, model_ws=model_ws)

        files_succesfully_loaded = []
        files_not_loaded = []

        # read name file
        try:
            # namefile_path = os.path.join(mt.model_ws, mt.namefile)
            # namefile_path = f
            namefile_path = os.path.join(mt.model_ws, f)
            ext_unit_dict = mfreadnam.parsenamefile(namefile_path,
                                                    mt.mfnam_packages,
                                                    verbose=verbose)
        except Exception as e:
            # print("error loading name file entries from file")
            # print(str(e))
            # return None
            raise Exception(
                "error loading name file entries from file:\n" + str(e))

        if mt.verbose:
            print('\n{}\nExternal unit dictionary:\n{}\n{}\n'.
                  format(50 * '-', ext_unit_dict, 50 * '-'))

        # load btn
        btn = None
        btn_key = None
        for key, item in ext_unit_dict.items():
            if item.filetype.lower() == "btn":
                btn = item
                btn_key = key
                break
        try:
            pck = btn.package.load(btn.filename, mt,
                                   ext_unit_dict=ext_unit_dict)
            files_succesfully_loaded.append(btn.filename)
            if mt.verbose:
                sys.stdout.write('   {:4s} package load...success\n'
                                 .format(pck.name[0]))
            ext_unit_dict.pop(btn_key)
        except Exception as e:
            s = 'Could not read btn package: {}. Stopping...' \
                .format(os.path.basename(btn.filename))
            raise Exception(s + " " + str(e))

        if load_only is None:
            load_only = []
            for key, item in ext_unit_dict.items():
                load_only.append(item.filetype)
        else:
            if not isinstance(load_only, list):
                load_only = [load_only]
            not_found = []
            for i, filetype in enumerate(load_only):
                filetype = filetype.upper()
                if filetype != 'BTN':
                    load_only[i] = filetype
                    found = False
                    for key, item in ext_unit_dict.items():
                        if item.filetype == filetype:
                            found = True
                            break
                    if not found:
                        not_found.append(filetype)
            if len(not_found) > 0:
                raise Exception(
                    "the following load_only entries were not found "
                    "in the ext_unit_dict: " + ','.join(not_found))

        # try loading packages in ext_unit_dict
        for key, item in ext_unit_dict.items():
            if item.package is not None:
                if item.filetype in load_only:
                    try:
                        pck = item.package.load(item.filename, mt,
                                                ext_unit_dict=ext_unit_dict)
                        files_succesfully_loaded.append(item.filename)
                        if mt.verbose:
                            sys.stdout.write(
                                '   {:4s} package load...success\n'
                                    .format(pck.name[0]))
                    except BaseException as o:
                        if mt.verbose:
                            sys.stdout.write(
                                '   {:4s} package load...failed\n   {!s}\n'
                                    .format(item.filetype, o))
                        files_not_loaded.append(item.filename)
                else:
                    if mt.verbose:
                        sys.stdout.write('   {:4s} package load...skipped\n'
                                         .format(item.filetype))
                    files_not_loaded.append(item.filename)
            elif "data" not in item.filetype.lower():
                files_not_loaded.append(item.filename)
                if mt.verbose:
                    sys.stdout.write('   {:4s} package load...skipped\n'
                                     .format(item.filetype))
            elif "data" in item.filetype.lower():
                if mt.verbose:
                    sys.stdout.write('   {} file load...skipped\n      {}\n'
                                     .format(item.filetype,
                                             os.path.basename(item.filename)))
                if key not in mt.pop_key_list:
                    mt.external_fnames.append(item.filename)
                    mt.external_units.append(key)
                    mt.external_binflag.append("binary"
                                               in item.filetype.lower())

        # pop binary output keys and any external file units that are now
        # internal
        for key in mt.pop_key_list:
            try:
                mt.remove_external(unit=key)
                ext_unit_dict.pop(key)
            except:
                if mt.verbose:
                    sys.stdout.write('Warning: external file unit " +\
                        "{} does not exist in ext_unit_dict.\n'.format(key))

        # write message indicating packages that were successfully loaded
        if mt.verbose:
            print(1 * '\n')
            s = '   The following {0} packages were successfully loaded.' \
                .format(len(files_succesfully_loaded))
            print(s)
            for fname in files_succesfully_loaded:
                print('      ' + os.path.basename(fname))
            if len(files_not_loaded) > 0:
                s = '   The following {0} packages were not loaded.'.format(
                    len(files_not_loaded))
                print(s)
                for fname in files_not_loaded:
                    print('      ' + os.path.basename(fname))
                print('\n')

        # return model object
        return mt