Ejemplo n.º 1
0
def update_run_model(varlist,
                     it,
                     m=m,
                     homogenous=2,
                     runyn=True,
                     plotyn=False,
                     silent=True,
                     start_basecase=True,
                     f_basecase=None,
                     pooling=True,
                     output=None,
                     results=[]):
    # Make timestamp
    ts = utils.make_timestamp()
    print('Running it {} at time {}'.format(it, ts))

    if start_basecase:
        strt, sconc = get_base_hds_conc(basecase_ws)

    if pooling:
        model_ws_orig = Path(m.model_ws).as_posix() + ''
        tmp = Path(model_ws).joinpath('tmp{}'.format(it))
        if not tmp.exists():
            tmp.mkdir()
        m.model_ws = tmp.as_posix()
        print('temp ws', m.model_ws)

    # unpack values from varlist
    vka = varlist['vka'][it]
    al = varlist['al'][it]
    dmcoef = varlist['dmcoef'][it]
    ss = varlist['ss'][it]
    sy = varlist['sy'][it]

    riv_stg = varlist['riv_stg'][it]
    riv_cond = varlist['riv_cond'][it]
    head_inland_sum = varlist['head_inland_sum'][it]
    head_inland_wint = varlist['head_inland_wint'][it]
    wel = varlist['wel'][:, it]
    rech_farm_pct = varlist['rech_farm'][0]
    farm_size = (200, 200)
    rech_farm = [rech_farm_pct * flx / np.prod(farm_size) for flx in wel]
    rech_precip = varlist['rech'][it]

    CF_glob = varlist['CF_glob'][it]
    CF_var = varlist['CF_var'][it]
    seed = varlist['seed'][it]
    hk_mean = varlist['hk_mean'][it]
    hk_var = varlist['hk_var'][it]
    por_mean = varlist['por_mean'][it]
    por_var = varlist['por_var'][it]
    corr_len = varlist['corr_len'][it]
    corr_len_yx = varlist['corr_len_yx'][it]
    corr_len_zx = varlist['corr_len_zx'][it]
    clay_lyr_yn = varlist['clay_lyr_yn'][it]
    vario_type = varlist['vario_type'][it]

    #set ghb data and create dicts
    chd_data, ssm_data_base, ghb_data, wel_data_base = make_bc_dicts(
        (head_inland_sum, head_inland_wint))
    utils.save_obj(m.MC_file.parent, wel_data_base, 'wel_data_base')
    utils.save_obj(m.MC_file.parent, ssm_data_base, 'ssm_data_base')

    ssm_data = {}
    # write recharge data

    rech_farm_mat = np.zeros((nrow, ncol), dtype=np.float32)
    for i in range(len(rech_farm)):
        rech_farm_mat[farm_loc_list[i]] = rech_farm[i]

    rech_data = {}
    for i in range(len(perlen)):
        if i in kper_even:
            rech_data[i] = rech_precip
        elif i in kper_odd:
            rech_data[i] = rech_farm_mat

    # write wel data
    # ssm_data_base = load_obj(m.MC_file.parent, 'ssm_data_base')
    # wel_data_base = load_obj(m.MC_file.parent, 'wel_data_base')
    wel_data, ssm_data, wel_cells = add_pumping_wells(wel_data_base,
                                                      ssm_data_base,
                                                      n_wells,
                                                      flx=wel,
                                                      rowcol=farm_orig,
                                                      kper=kper_odd)
    if homogenous == 1:
        CF_grid = 1
        hk_grid = 10**hk_mean
        por_grid = .4
    elif homogenous == 2:
        #Create Gaussian Simulation
        lcol = int(corr_len / delr)
        llay = int(corr_len * corr_len_zx / np.mean(delv))
        lrow = int(corr_len * corr_len_yx / delc)
        #     fft_grid = np.exp(simulationFFT.simulFFT(nrow, nlay, ncol, mu, sill, vario_type, lrow , llay, lcol))
        CF_grid = simulationFFT.simulFFT(nrow,
                                         nlay,
                                         ncol,
                                         CF_glob,
                                         CF_var,
                                         vario_type,
                                         lrow,
                                         llay,
                                         lcol,
                                         seed=seed)
        hk_grid = 10**normal_transform(CF_grid, CF_glob, hk_mean,
                                       np.sqrt(CF_var), np.sqrt(hk_var))
        por_grid = normal_transform(CF_grid, CF_glob, por_mean,
                                    np.sqrt(CF_var), np.sqrt(por_var))
        CF_grid[CF_grid > 1.] = 1.
        CF_grid[CF_grid < 0.] = 0.
        por_grid[por_grid > 1.] = .99
        por_grid[por_grid < 0.] = 0.01
        hk_grid[wel_cells] = np.max((hk_grid.max(), 200))
        # np.save(m.MC_file.parent.joinpath('{}_hk.npy'.format(ts)),hk_grid)
    else:
        pass

    # # Write river data--take SSM data from WEL!!
    # riv_grad = .0005
    # riv_data, ssm_data = write_river_data(
    #     riv_loc, riv_stg, riv_cond, riv_grad, kper_even, ssm_data)
    ipakcb = 53
    icbund = np.ones((nlay, nrow, ncol), dtype=np.int)
    icbund[np.where(m.bas6.ibound.array == -1)] = -1
    timprs = np.round(np.linspace(1, np.sum(perlen), 20), decimals=0)
    oc_data = {}
    for kper in range(nper):
        if kper % 5 == 0:
            oc_data[(kper, 0)] = ['save head', 'save budget']

    flopy.modflow.ModflowBas(m, m.bas6.ibound.array, strt=strt)
    flopy.modflow.ModflowDis(m,
                             nlay,
                             nrow,
                             ncol,
                             nper=nper,
                             delr=delr,
                             delc=delc,
                             laycbd=0,
                             top=henry_top,
                             botm=henry_botm,
                             perlen=perlen,
                             nstp=nstp,
                             steady=steady,
                             itmuni=itmuni,
                             lenuni=lenuni,
                             tsmult=tsmult)

    flopy.modflow.ModflowGhb(m, stress_period_data=ghb_data)
    flopy.modflow.ModflowWel(m, stress_period_data=wel_data, ipakcb=ipakcb)

    ## REMOVED FOR CONFINED SIMULATION ##
    # flopy.modflow.ModflowRch(m, rech=rech_data)
    # flopy.modflow.ModflowRiv(m, stress_period_data=riv_data)

    # Add LPF package to the MODFLOW model
    flopy.modflow.ModflowLpf(m,
                             hk=hk_grid,
                             vka=vka,
                             ipakcb=ipakcb,
                             laytyp=0,
                             laywet=1,
                             ss=ss,
                             sy=sy)
    # Add PCG Package to the MODFLOW model
    flopy.modflow.ModflowPcg(m, hclose=1.e-8)
    # Add OC package to the MODFLOW model
    flopy.modflow.ModflowOc(m, stress_period_data=oc_data, compact=True)
    # Create the basic MT3DMS model structure
    flopy.mt3d.Mt3dBtn(m,
                       laycon=m.lpf.laytyp,
                       htop=henry_top,
                       dz=m.dis.thickness.get_value(),
                       prsity=por_grid,
                       icbund=icbund,
                       sconc=sconc,
                       nprs=1,
                       timprs=timprs)
    flopy.mt3d.Mt3dAdv(m, mixelm=-1)
    flopy.mt3d.Mt3dDsp(m, al=al, dmcoef=dmcoef)
    flopy.mt3d.Mt3dGcg(m, iter1=50, mxiter=1, isolve=1, cclose=1e-5)
    flopy.mt3d.Mt3dSsm(m, stress_period_data=ssm_data)

    #vdf = flopy.seawat.SeawatVdf(m, iwtable=0, densemin=0, densemax=0,denseref=1000., denseslp=0.7143, firstdt=1e-3)
    flopy.seawat.SeawatVdf(m,
                           mtdnconc=1,
                           mfnadvfd=1,
                           nswtcpl=0,
                           iwtable=1,
                           densemin=0.,
                           densemax=0.,
                           denseslp=denseslp,
                           denseref=densefresh)

    # Write input
    m.write_input()

    # Try to delete the output files, to prevent accidental use of older files
    flist = [
        os.path.join(model_ws, 'MT3D.CNF'),
        os.path.join(model_ws, 'MT3D001.MAS'),
        os.path.join(model_ws, modelname + '.hds'),
        os.path.join(model_ws, 'MT3D001.UCN'),
        os.path.join(model_ws, 'MT3D001.UCN'),
        os.path.join(model_ws, modelname + '.cbc')
    ]
    for f in flist:
        try:
            os.remove(f)
        except:
            pass

    # Plot model?
    if plotyn:
        m.plot_hk_ibound(rowslice=farm_orig[0][0], gridon=True)

    # Run model
    if runyn:
        v = m.run_model(silent=silent, report=True)
        for idx in range(-3, 0):  # Report
            print(v[1][idx])

        # Record success/failure and store data
        varlist['success'][it] = v[0]

        if v[0] is False:
            pass
        else:
            # Record final salinity as .npy, also move full CBC and UCN files
            # to expt folder
            fname = os.path.join(m.model_ws, 'MT3D001.UCN')
            totim = flopy.utils.binaryfile.UcnFile(fname).get_times()[-1]
            conc_fname = 'conc{}_{}_totim{}.UCN'.format(
                it, ts, str(int(totim)))
            _ = record_salinity(
                m,
                ts_hms=ts,
                fname_write=m.MC_file.parent.joinpath(conc_fname))
            utils.copy_rename(os.path.join(m.model_ws, 'MT3D001.UCN'),
                              m.MC_file.parent.joinpath(conc_fname).as_posix())
    if pooling:
        try:
            # [print(p) for p in tmp.iterdir() if (p.suffix is not '.UCN')]
            [
                p.unlink() for p in tmp.iterdir()
                if (p.suffix not in ('.UCN', '.list'))
            ]
            # shutil.rmtree(tmp.as_posix())
            # tmp.rmdir()
        except:
            print('didnt work!')
            pass
        m.model_ws = model_ws_orig
        print('resetting ws:', m.model_ws)

        if output is None:
            return (it, varlist['success'][it])
        else:
            output.put((it, varlist['success'][it]))
            # results.append((it,varlist['success'][it]))
            return
    else:
        utils.save_obj(m.MC_file.parent, (it, varlist['success'][it]),
                       'success{}'.format(it))
        [
            p.unlink() for p in model_ws.iterdir()
            if (p.suffix not in ('.UCN', '.list'))
        ]
        return m, varlist
Ejemplo n.º 2
0
def run_MC(tot_it,plotyn=False):
    #### MAKE NEW/ADD TO OLD EXPT ####
    check_MC_inputParams()

    #### VARY PARAMS ####
    it = 0
    while it < tot_it:
        ssm_data = {}
        it += 1


        ''' HOMOGENOUS ONLY
        #hk
        low,high= (-3,0)
        parname='hk'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        hk = 10**val
        '''

        #########HETEROGENOUS ONLY ##############
        #hk1
        low= -2
        high = 0
        parname='hk1'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        hk1 = 10**val

        #hk2
        low= 0
        high = 2
        parname='hk2'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        hk2 = 10**val

        #lith_prop
        low= 0
        high = 0.3
        parname='lith_prop'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        lith_prop = val

        #vario_type
        parname='vario_type'
        val = int(round(np.random.rand()))
        add_to_paramdict(m.inputParams,parname,val)
        if val==1:
            vario_type = 'Gaussian'
        elif val==0:
            vario_type = 'Exponential'
        else:
            pass

        #corr_len
        low= 250
        high = 1000
        parname='corr_len'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        corr_len = val

        #corr_len_zx
        # equal to lz/lx
        low= .01
        high = .1
        parname='corr_len_zx'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        corr_len_zx = val

        #corr_len_yx
        # equal to ly/lx
        low= 0.1
        high = 1
        parname='corr_len_yx'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        corr_len_yx = val


        #Create hk grid
        mu = np.log(hkSand)
        sill = 1
        lcol = int(corr_len/delr)
        llay = int(corr_len*corr_len_zx/np.mean(delv))
        lrow = int(corr_len*corr_len_yx/delc)
        fft_grid = np.exp(simulationFFT.simulFFT(nrow, nlay, ncol, mu, sill, vario_type, lrow , llay, lcol))
        grid = np.log10(fft_grid)
        lith_props = [lith_prop,1-lith_prop]
        hk_vals = [hk1,hk2]
        hk = truncate_grf(grid,lith_props,hk_vals,log10trans=False,plotyn=plotyn)
        hk[wel_cells] = hk.max()
        ######## END OF HETEROGENOUS BLOCK ############

        ##vka: ratio of vk/hk
        #      Uniform (1/20,1)
        low= 1/20
        high = 1
        parname='vka'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        vka = val

        ##al: #longitudinal dispersivity (m)
        #      Uniform [0.1,20] #10 from Walther et al
        low= 0.1
        high = 20
        parname='al'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        al = val

        ##dmcoef: #dispersion coefficient (m2/day)
        #      log-uniform [1e-10,1e-5] #2e-9 from Walther et al
        low,high = np.log10([1e-10,1e-5])
        parname='dmcoef'
        val = sample_dist(sts.uniform,1,*(low,high-low))
        add_to_paramdict(m.inputParams,parname,val)
        dmcoef = 10**val

        ##wel
        low,high = np.log10((1e1,1e3))
        parname='wel'
        val = sample_dist(sts.uniform,n_wells,*(low,high-low))
        wel_flux = val
        for i in range(n_wells):
            parname_temp = parname+str(i)
            add_to_paramdict(m.inputParams,parname_temp,wel_flux[i])

        #write wel data
        ssm_data_base = load_obj(m.MC_file.parent,'ssm_data_base')
        wel_data_base = load_obj(m.MC_file.parent,'wel_data_base')
        wel_data,ssm_data,_ = add_pumping_wells(wel_data_base,ssm_data_base,n_wells,wel_flux,farm_orig,kper_odd)

        ##rech_precip
        low,high = np.log10([1e-6,1e-1])
        val = sample_dist(sts.uniform,1,*(low,high-low))
        parname='rech_precip'
        add_to_paramdict(m.inputParams,parname,val)
        rech_precip = 10**val/(nrow*ncol)

        #rech_farm
        low,high = [0.05,0.2] #percentage of the well extraction
        val = sample_dist(sts.uniform,1,*(low,high-low))
        parname='rech_farm'
        add_to_paramdict(m.inputParams,parname,val)
        rech_farm = [val*flux/np.prod(farm_size) for flux in wel_flux]

        #Assign recharge data
        rech_farm_mat = np.zeros((nrow,ncol),dtype=np.float32)
        for i in range(nfarms):
            rech_farm_mat[farm_loc_list[i]] = rech_farm[i]

        rech_data = {}
        for i in range(len(perlen)):
            if i in kper_even:
                rech_data[i] = rech_precip
            elif i in kper_odd:
                rech_data[i] = rech_farm_mat

        ##riv_stg
        low,high = (.5,1.5)
        val = sample_dist(sts.uniform,1,*(low,high-low))
        parname='riv_stg'
        add_to_paramdict(m.inputParams,parname,val)
        riv_stg = val

        ##riv_cond
        low,high = np.log10((.1,100))
        val = sample_dist(sts.uniform,1,*(low,high-low))
        parname='riv_cond'
        add_to_paramdict(m.inputParams,parname,val)
        riv_cond = val

        #Write river data--take SSM data from WEL!!
        riv_grad = .0005
        riv_data,ssm_data = write_river_data(riv_loc,stage,cond,riv_grad,kper_even,ssm_data)

        #Create instances in flopy
        bas = flopy.modflow.ModflowBas(m, ibound, strt=strt)
        if bc_ocean=='CHD' or bc_inland=='CHD' :
            chd = flopy.modflow.ModflowChd(m, stress_period_data=chd_data)
        if bc_ocean=='GHB' or bc_inland=='GHB'or bc_right_edge=='GHB':
            ghb = flopy.modflow.ModflowGhb(m, stress_period_data=ghb_data)

        rch = flopy.modflow.ModflowRch(m, rech=rech_data)
        wel = flopy.modflow.ModflowWel(m, stress_period_data=wel_data, ipakcb=ipakcb)
        riv = flopy.modflow.ModflowRiv(m, stress_period_data=riv_data)
        # Add LPF package to the MODFLOW model
        lpf = flopy.modflow.ModflowLpf(m, hk=hk, vka=vka, ipakcb=ipakcb,laytyp=1,laywet=1,
                                      ss=ss,sy=sy)

        # Add PCG Package to the MODFLOW model
        pcg = flopy.modflow.ModflowPcg(m, hclose=1.0e-8)

        # Add OC package to the MODFLOW model
        oc = flopy.modflow.ModflowOc(m,
                                     stress_period_data=oc_data,
                                     compact=True)

        #Create the basic MT3DMS model structure
        btn = flopy.mt3d.Mt3dBtn(m,
                                 laycon=lpf.laytyp, htop=henry_top,
                                 dz=dis.thickness.get_value(), prsity=por, icbund=icbund,
                                 sconc=sconc, nprs=1,timprs=timprs)
        adv = flopy.mt3d.Mt3dAdv(m, mixelm=-1)
        dsp = flopy.mt3d.Mt3dDsp(m, al=al, dmcoef=dmcoef)
        gcg = flopy.mt3d.Mt3dGcg(m, iter1=50, mxiter=1, isolve=1, cclose=1e-5)
        ssm = flopy.mt3d.Mt3dSsm(m, stress_period_data=ssm_data)

        #vdf = flopy.seawat.SeawatVdf(m, iwtable=0, densemin=0, densemax=0,denseref=1000., denseslp=0.7143, firstdt=1e-3)
        vdf = flopy.seawat.SeawatVdf(m, mtdnconc=1, mfnadvfd=1, nswtcpl=0, iwtable=1,
                                     densemin=0., densemax=0., denseslp=denseslp, denseref=densefresh)

        #Write input
        '''DEBUG SIMPLIFYING
        m.remove_package('RIV')
        m.remove_package('RCH')
        m.remove_package('WEL')
        ssm_data = load_obj(m.MC_file.parent,'ssm_data_base')
        wel_data = load_obj(m.MC_file.parent,'wel_data_base')
        DEBUG SIMPLIFYING'''
        m.write_input()

        # Try to delete the output files, to prevent accidental use of older files
        flist = [os.path.join(model_ws,'MT3D.CNF'),
                  os.path.join(model_ws,'MT3D001.MAS'),
                  os.path.join(model_ws, modelname + '.hds'),
                  os.path.join(model_ws, 'MT3D001.UCN'),
                  os.path.join(model_ws, 'MT3D001.UCN'),
                  os.path.join(model_ws, modelname + '.cbc')]
        for f in flist:
            try:
                os.remove(f)
            except:
                print('did not find file to remove: {}'.format(f))

        #Make timestamp
        import datetime
        sep = '-'
        ts = datetime.datetime.now().strftime('%m'+sep+'%d'+sep+'%H'+sep+'%M'+sep+'%S')
        ts_hms = ts.split(sep)[2:]
        ts_hms = sep.join(ts_hms)

        if plotyn:
            m.plot_hk_ibound(rowslice=rowslice,gridon=gridon)
        #Run model
        print('Running iteration {} of {}...'.format(it,tot_it))
        v = m.run_model(silent=False, report=True)
        for idx in range(-3, 0):
            print(v[1][idx])

        if v[0]:
            #Record final salinity as .npy, also move full CBC and UCN files to expt folder
            _ = record_salinity(m,ts_hms=ts_hms);
            copy_rename(os.path.join(m.model_ws,'MT3D001.UCN'),m.MC_file.parent.joinpath('conc_'+ts_hms+'.UCN').as_posix())
            #copy_rename(os.path.join(m.model_ws,m.name+'.cbc'),m.MC_file.parent.joinpath('cbc_'+ts_hms+'.cbc').as_posix())
            print('Finished iteration {} of {} successfully'.format(it,tot_it))
        else:
            print('Unsuccessful iteration {} of {}'.format(it,tot_it))
            m.inputParams = rem_last_ind_from_dict(m.inputParams)
    #Save inputParams immediately to prevent accidental destruction of them
    savemat(m.MC_file.parent.joinpath('inputParams.mat').as_posix(),m.inputParams)
    np.save(m.MC_file.parent.joinpath('inputParams.npy'),m.inputParams)
    save_obj(m.MC_file.parent,m.inputParams,'inputParams')
    save_obj(m.MC_file.parent,m.dis.get_node_coordinates(),'yxz')
    return m.inputParams,ssm_data
Ejemplo n.º 3
0
def create_CF_from_dir(dirname,
                       ucn_dict=None,
                       modsize=(26, 20, 100),
                       varlist=None,
                       ftype='mat',
                       saveyn=True):

    import simulationFFT

    nlay, nrow, ncol = modsize
    delv, delc, delr = (3, 30, 30)

    if varlist is None:
        varlist = load_obj(dirname, 'varlist_final')
    if ucn_dict is None:
        try:
            ucn_dict = load_obj(dirname, 'ucn_dict')
        except:
            ucn_dict = create_ucn_from_dir(dirname,
                                           totims=(1, 180, 360),
                                           saveyn=False)

    CF_mat = {}
    for it in ucn_dict.keys():
        CF_glob = varlist['CF_glob'][it]
        CF_var = varlist['CF_var'][it]
        seed = varlist['seed'][it]
        corr_len = varlist['corr_len'][it]
        corr_len_yx = varlist['corr_len_yx'][it]
        corr_len_zx = varlist['corr_len_zx'][it]
        vario_type = varlist['vario_type'][it]

        #Create Gaussian Simulation
        lcol = int(corr_len / delr)
        llay = int(corr_len * corr_len_zx / delv)
        lrow = int(corr_len * corr_len_yx / delc)
        CF_mat['CF{}'.format(it)] = simulationFFT.simulFFT(nrow,
                                                           nlay,
                                                           ncol,
                                                           CF_glob,
                                                           CF_var,
                                                           vario_type,
                                                           lrow,
                                                           llay,
                                                           lcol,
                                                           seed=seed)
    if saveyn:
        if ftype == 'mat':
            from scipy.io import savemat
            savemat(dirname.joinpath('CF_mat.mat'),
                    CF_mat,
                    do_compression=True)
            print('saved {}'.format(dirname.joinpath('CF_mat.mat')))
        elif ftype == 'npy':
            from numpy import save
            for k, v in CF_mat.items():
                save(dirname.joinpath('CF_mat{}.npy'.format(k)), v)
                print('saved {}'.format(
                    dirname.joinpath('conc_mat{}.npy'.format(k))))
        else:
            raise (Exception('allowed ftypes: "mat", "npy"'))
    return CF_mat
Ejemplo n.º 4
0
#Hydraulic conductivity field
hkSand = 10.  #horizontal hydraulic conductivity m/day
hkClay = hkSand*.01

heterogenous = True
mu = np.log(hkSand)
sill = .1
modeltype = 'Exponential'
llay = int(20/np.mean(delv))
lrow = int(2000/delc)
lcol = int(2000/delr)


if heterogenous:
    import simulationFFT
    fft_grid = np.exp(simulationFFT.simulFFT(nrow, nlay, ncol, mu, sill, modeltype, lrow , llay, lcol))
    #hk[0:int(np.where(henry_botm==find_nearest(henry_botm,ocean_elev))[0])+1,:,:] = hkSand
else:
    hk = hkSand*np.ones((nlay,nrow,ncol), dtype=np.int32)

grid = np.log10(fft_grid)
#lith_props = [0.2,0.5,0.3]
#hk_vals = [-1,0,2]
lith_props = [0.2,0.8]
hk_vals = [0,2]

log10trans = True
plotyn= True
hk = truncate_grf(grid,lith_props,hk_vals,log10trans=True,plotyn=plotyn)