def setUp(self): super().setUp() grid_str = '''120 5.00 10.00 -nx, xmn, xsiz 110 1205.00 10.00 -ny, ymn, ysiz 1 0.5 1.0 -nz, zmn, zsiz''' griddef = gs.GridDef(grid_str=grid_str) self.data = gs.ExampleData("grid2d_surf", griddef=griddef)
def setUp(self): ''' Method called to prepare the test fixture. This is called immediately before calling the test method; other than AssertionError or SkipTest, any exception raised by this method will be considered an error rather than a test failure. The default implementation does nothing. ''' griddef_str = '''120 5.0 10.0 110 1205.0 10.0 1 0.5 1.0''' self.griddef = gs.GridDef(griddef_str)
def setUp(self): super().setUp() self.griddef = gs.GridDef([10, 1, 0.5, 10, 1, 0.5, 1, 1, 0.5]) size = self.griddef.count() mean = 2.5 scale = 3 self.nreal = 100 self.ref_data = pd.DataFrame( {'value': np.random.normal(mean, scale, size=size)}) for i, offset in enumerate(np.random.rand(self.nreal) * 0.04 - 0.02): data = pd.DataFrame( {'value': np.random.normal(mean + offset, scale, size=size)}) gs.write_gslib( data, os.path.join(self.out_dir, 'real{}.out'.format(i + 1)))
def _validate_griddef_or_None(s): """ A validation method to convert input s to pygeostat grid def and raise an error if not convertable. """ import pygeostat as gs if s is None: return None elif isinstance(s, str): try: return gs.GridDef(s) except AssertionError: raise ValueError( '{} should be a pygeostat.GridDef object or griddef string!'. format(s)) elif isinstance(s, gs.GridDef): return s else: raise ValueError( '{} should be a pygeostat.GridDef object or griddef string!'. format(s))
def setUp(self): super().setUp() self.griddef = gs.GridDef([40, 0.5, 1, 40, 0.5, 1, 40, 0.5, 1]) self.data = gs.ExampleData('3d_grid', griddef=self.griddef)
def setUp(self): warnings.simplefilter('ignore', category=ImportWarning) self.grid = gs.GridDef([40, 0.5, 1, 40, 0.5, 1, 40, 0.5, 1]) self.testfl = gs.ExampleData('3d_grid', griddef=self.grid)
def test_infergriddef(self): df2d = gs.ExampleData("point2d_ind") df3d = gs.ExampleData("point3d_ind_mv") #where xsiz = ysiz = zsiz, a float can also be provided. self.compare(df3d.infergriddef(blksize=75), df3d.infergriddef(blksize=[75, 75, 75])) #where nx = ny = nz, an int can also be provided. self.compare(df3d.infergriddef(nblk=60), df3d.infergriddef(nblk=[60, 60, 60])) #for 3D data, infergriddef() must return a 3D grid definition even if zsiz is given as None or 0 or 1. self.compare( df3d.infergriddef(blksize=[50, 60, 1]), gs.GridDef('''20 135.0 50.0 19 1230.0 60.0 82 310.5 1.0''')) self.compare(df3d.infergriddef(blksize=[50, 60, 1]), df3d.infergriddef(blksize=[50, 60, None])) self.compare(df3d.infergriddef(blksize=[50, 60, 1]), df3d.infergriddef(blksize=[50, 60, 0])) # nz given as None or 0 or 1 returns a 2D grid that covers the vertical extent of a 3D dataset. self.compare( df3d.infergriddef(nblk=[50, 60, 1]), gs.GridDef('''50 119.8 19.6 60 1209.1 18.2 1 350.85 81.7''')) self.compare(df3d.infergriddef(nblk=[50, 60, 1]), df3d.infergriddef(nblk=[50, 60, None])) self.compare(df3d.infergriddef(nblk=[50, 60, 1]), df3d.infergriddef(nblk=[50, 60, 0])) #if nblk is not integer,infergriddef(), must convert it to int and provide correct grid definition _nblk = [12.3, 5.7, 10.11] self.compare(df3d.infergriddef(nblk=_nblk), df3d.infergriddef(nblk=[int(i) for i in _nblk])) # If data is 2-D, zsiz must be provided as None. Otherwise it must raise exception. with self.assertRaises(ValueError): df2d.infergriddef(blksize=[50, 60, 4]) with self.assertRaises(ValueError): df2d.infergriddef(blksize=75) self.compare( df2d.infergriddef(blksize=[50, 60, None]), gs.GridDef('''24 25.0 50.0 19 1230.0 60.0 1 0.5 1.0''')) #If data is 2-D, nz must be provided as None. Otherwise it must raise exception. with self.assertRaises(ValueError): df2d.infergriddef(nblk=[50, 60, 1]) with self.assertRaises(ValueError): df2d.infergriddef(nblk=60) self.compare( df2d.infergriddef(nblk=[50, 60, None]), gs.GridDef('''50 11.9 23.8 60 1209.1 18.2 1 0.5 1.0'''))
import pygeostat as gs # load some data data = gs.ExampleData('3d_grid', griddef=gs.GridDef([40, 1, 2, 40, 1, 2, 40, 0.5, 1])) # plot the grid slices _ = gs.grid_slice_plot(data, orient='xz', n_slice=5)
def gen_job_list(nreals_true, nreals, nphase, nstope, seed, dirlist, fval_pars, min_width, max_width, rot, clip_bounds, vert_bounds, true_data, de_pars, len_comp, grid1, grid2, grid3, varg1, varg2): '''Generate job list for parallel processing of VOI workflow''' # generate directories gen_directories(dirlist, nreals_true, nphase) refdir, dhdir, simdir1, chksim, gsdir, simdir2, stopedir, postdir, outdir, plotdir, pardir, tmp = dirlist # generate seed lists rseed_lst0 = gs.rseed_list(nreals_true, seed+1000) rseed_lst1 = gs.rseed_list(nreals_true*nreals*nphase, seed+2000) rseed_lst2 = gs.rseed_list(nreals_true*nreals*nphase, seed+3000) rseed_lst3 = gs.rseed_list(nreals_true*nphase, seed+4000) # grid definitons with open(grid1, 'r') as f: grid = f.read() griddef1 = gs.GridDef(grid) with open(grid2, 'r') as f: grid = f.read() griddef2 = gs.GridDef(grid) with open(grid3, 'r') as f: grid = f.read() griddef3 = gs.GridDef(grid) # variogram models with open(varg1, 'r') as f: varlg = f.read() with open(varg2, 'r') as f: varhg = f.read() jobs_ref_sim = [] jobs_ref_post = [] jobs = [] for t in range(nreals_true): # reference model params # usgsim (1) with open(pardir + 'usgsim1.par', 'r') as f: parstr_ref = f.read() parstr_ref = parstr_ref.format(rseed=rseed_lst0[t], griddef=griddef1, true_data=true_data, outfl=refdir+f'real{t+1}.gsb', varhg=varhg) parpath = pardir + f't{t+1}/usgsim_ref{t+1}.par' with open(parpath, 'w', newline='', encoding='utf8') as pf: pf.write(parstr_ref) jobs_ref_sim.append((dict(parstr=parstr_ref, parfile=parpath))) # reference model block avg params with open(pardir + 'ublkavg.par', 'r') as f: parstr_avg = f.read() parstr_avg = parstr_avg.format(simfl=refdir + f'real{t+1}.gsb', griddef=griddef1, griddef_block=griddef3, outfl=refdir + f'realblk{t+1}.gsb') parpath = pardir + f't{t+1}/blkavg_ref{t+1}.par' with open(parpath, 'w', newline='', encoding='utf8') as pf: pf.write(parstr_avg) jobs_ref_post.append((dict(parstr=parstr_avg, parfile=parpath))) for j in range(nphase): # resample params grid = [griddef1.nx, griddef1.xmn, griddef1.xsiz, griddef1.ny, griddef1.ymn, griddef1.ysiz, griddef1.nz, griddef1.zmn, griddef1.zsiz] sample_args = gen_sample_args( t+1, j+1, grid, len_comp, refdir, dhdir) # decluster params with open(pardir + 'declus_nn2.par', 'r') as f: parstr_nn = f.read() parstr_nn = parstr_nn.format(datafl=dhdir+f't{t+1}/ddh_au_p{j+1}_all.out', griddef=griddef1, outfl=dhdir+f't{t+1}/ddh_au_p{j+1}_declus.out') # simulate au # usgsim (2) params usgsim_pars2 = [] with open(pardir + 'usgsim2.par', 'r') as f: parstr_usg = f.read() for i in range(nreals): parstr_usg_fmt = parstr_usg.format(rseed=rseed_lst1[i+j*nreals+t*nphase*nreals], griddef=griddef2, outfl=simdir1 + f't{t+1}/phase{j+1}/real{i+1}.gsb', varhg=varhg, data=dhdir + f't{t+1}/ddh_au_p{j+1}_declus.out') usgsim_pars2.append(parstr_usg_fmt) # add coords params grid = [griddef2.nx, griddef2.xmn, griddef2.xsiz, griddef2.ny, griddef2.ymn, griddef2.ysiz, griddef2.nz, griddef2.zmn, griddef2.zsiz] coord_args = gen_addcoord_args(t+1, j+1, nreals, grid, simdir1) # mwa params mwa_pars = [] with open(pardir + 'maketrend.par', 'r') as f: parstr_mwa = f.read() for i in range(nreals): parstr_mwa_fmt = parstr_mwa.format(simfl=simdir1+f't{t+1}/phase{j+1}/real{i+1}_xyz.gsb', outfl=gsdir + f't{t+1}/phase{j+1}/real{i+1}_mwa.gsb', griddef=griddef2) mwa_pars.append(parstr_mwa_fmt) # threshold params thresh_args = gen_threshold_args(t+1, j+1, gsdir, nreals, 1.2, 3.3) # tag ddh params grid = [griddef2.nx, griddef2.xmn, griddef2.xsiz, griddef2.ny, griddef2.ymn, griddef2.ysiz, griddef2.nz, griddef2.zmn, griddef2.zsiz] tag_args = gen_tag_args(t+1, j+1, nreals, grid, dhdir, gsdir) # simulate au # usgsim (3) params usgsim_pars3 = [] with open(pardir + 'usgsim3.par', 'r') as f: parstr_usg = f.read() for i in range(nreals): parstr_usg_fmt = parstr_usg.format(rseed=rseed_lst2[i+j*nreals+t*nphase*nreals], griddef=griddef2, outfl=simdir2 + f't{t+1}/phase{j+1}/real{i+1}.gsb', varlg=varlg, varhg=varhg, data=dhdir + f't{t+1}/phase{j+1}/ddh_au_real{i+1}_tag.out', rockfl=gsdir + f't{t+1}/phase{j+1}/real{i+1}_mwa.gsb') usgsim_pars3.append(parstr_usg_fmt) # block average params blkavg_pars = [] with open(pardir + 'ublkavg.par', 'r') as f: parstr_avg = f.read() for i in range(nreals): parstr_avg_fmt = parstr_avg.format(simfl=simdir2 + f't{t+1}/phase{j+1}/real{i+1}.gsb', griddef=griddef2, griddef_block=griddef3, outfl=simdir2 + f't{t+1}/phase{j+1}/realblk{i+1}.gsb') blkavg_pars.append(parstr_avg_fmt) # merge reals params with open(pardir + 'merge_reals_gsb.par', 'r') as f: parstr_mrg = f.read() parstr_mrg = parstr_mrg.format(simfl=simdir2 + f't{t+1}/phase{j+1}/realblk', nreals=nreals, outfl=postdir + f't{t+1}/phase{j+1}/real_merge.gsb') # postsim params with open(pardir + 'upostsim.par', 'r') as f: parstr_post = f.read() parstr_post = parstr_post.format(simfl=postdir + f't{t+1}/phase{j+1}/real_merge.gsb', nreals=nreals, outfl=postdir + f't{t+1}/phase{j+1}/postsim.gsb') # clipping args grid = [griddef3.nx, griddef3.xmn, griddef3.xsiz, griddef3.ny, griddef3.ymn, griddef3.ysiz, griddef3.nz, griddef3.zmn, griddef3.zsiz] clip_args = gen_clip_args( t+1, j+1, nreals, simdir2, simdir2, grid, clip_bounds) # optimization args de_args = gen_de_args(t+1, j+1, nreals, vert_bounds, 'verts.out', -3, [645, 670, 700], 20, nstope, 8, rseed_lst3[j + t*nphase], simdir2, stopedir, fval_pars, de_pars, min_width, max_width) jobs.append((sample_args, parstr_nn, usgsim_pars2, coord_args, mwa_pars, thresh_args, tag_args, usgsim_pars3, blkavg_pars, parstr_mrg, parstr_post, clip_args, de_args, t+1, j+1, simdir1, simdir2, dhdir, gsdir)) return [jobs_ref_sim, jobs_ref_post, jobs]
import pygeostat as gs import pandas as pd # Global setting using Parameters gs.Parameters['data.griddef'] = gs.GridDef([10, 1, 0.5, 10, 1, 0.5, 2, 1, 0.5]) gs.Parameters['data.nreal'] = nreal = 100 size = gs.Parameters['data.griddef'].count() reference_data = pd.DataFrame({'value': np.random.normal(0, 1, size=size)}) # Create example simulated data simulated_data = pd.DataFrame(columns=['value']) for i, offset in enumerate(np.random.rand(nreal) * 0.04 - 0.02): simulated_data = simulated_data.append( pd.DataFrame({'value': np.random.normal(offset, 1, size=size)})) gs.histogram_plot_simulation(simulated_data, reference_data, reference_variable='value', title='Histogram Reproduction', grid=True)
import pygeostat as gs grid_str = '''120 5.00 10.00 -nx, xmn, xsiz 110 1205.00 10.00 -ny, ymn, ysiz 1 0.5 1.0 -nz, zmn, zsiz''' griddef = gs.GridDef(grid_str=grid_str) data_fl = gs.ExampleData("grid2d_surf", griddef=griddef) ax = gs.slice_plot(data_fl, var="Thickness") _ = gs.contour_plot(data_fl, var="Thickness", ax=ax, clabel=True)
import pygeostat as gs # load some data data = gs.ExampleData('3d_grid',griddef = gs.GridDef([40,1,2,40,1,2,40,0.5,1])) # plot the grid slices _ = gs.grid_slice_plot(data, nrow=2, ncol=5, start_slice=10, end_slice=25, n_slice=10, cmap='hot', vlim=(-3,3))