def test_get_period_list(self): array1 = np.array([ 1.77827941e-02, 3.16227766e-02, 5.62341325e-02, 1.00000000e-01, 1.77827941e-01, 3.16227766e-01, 5.62341325e-01, 1.00000000e+00, 1.77827941e+00, 3.16227766e+00, 5.62341325e+00, 1.00000000e+01, 1.77827941e+01, 3.16227766e+01, 5.62341325e+01, 1.00000000e+02, 1.77827941e+02, 3.16227766e+02, 5.62341325e+02 ]) array2 = np.array([ 3.16227766e-02, 5.62341325e-02, 1.00000000e-01, 1.77827941e-01, 3.16227766e-01, 5.62341325e-01, 1.00000000e+00, 1.77827941e+00, 3.16227766e+00, 5.62341325e+00, 1.00000000e+01, 1.77827941e+01, 3.16227766e+01, 5.62341325e+01, 1.00000000e+02, 1.77827941e+02, 3.16227766e+02 ]) array1test = get_period_list(0.02, 400, 4, include_outside_range=True) array2test = get_period_list(0.02, 400, 4, include_outside_range=False) self.assertTrue(all(np.abs(array1test - array1) / array1 < 1e-8)) self.assertTrue(all(np.abs(array2test - array2) / array2 < 1e-8)) # test with ends of input range on an exact decade array1 = np.array([ 0.1, 0.21544347, 0.46415888, 1., 2.15443469, 4.64158883, 10., 21.5443469, 46.41588834, 100. ]) array1test = get_period_list(0.1, 100, 3, include_outside_range=True) array2test = get_period_list(0.1, 100, 3, include_outside_range=False) self.assertTrue(all(np.abs(array1test - array1) / array1 < 1e-8)) self.assertTrue(all(np.abs(array2test - array1) / array1 < 1e-8))
############################################################################### ## example to specify start, stop and total number of periods #start_period = 0.001 #stop_period = 1000 #n_periods = 25 #period_list = np.logspace(np.log10(start_period), # np.log10(stop_period), # n_periods) # example to specify a number of periods per decade start_period = 0.002 stop_period = 2000 periods_per_decade = 4 period_list = get_period_list(start_period, stop_period, periods_per_decade, include_outside_range=True) ## an example to use the periods from a particular edi file #edifile_periods = op.join(edipath,'Synth00.edi') #eobj = Edi(edifile_periods) #period_list = 1./eobj.freq ############################################################################### # list of edi files, search for all files ending with '.edi' edi_list = [ op.join(edipath, ff) for ff in os.listdir(edipath) if (ff.endswith('.edi')) ] # make the save path if it doesn't exist
from mtpy.core.mt import MT from mtpy.utils.calculator import get_period_list # directory format for windows users edi_path = r'C:\mtpywin\mtpy\examples\data\edi_files_2' savepath = r'C:\tmp' edi_file = os.path.join(edi_path,'Synth00.edi') mtObj = MT(edi_file) #new_freq_list = mtObj.Z.freq # takes every second frequency new_freq_list = 1./get_period_list(1e-4,1e3,5) # 5 periods per decade from 0.0001 to 100000 s # create new Z and Tipper objects containing interpolated data new_Z_obj, new_Tipper_obj = mtObj.interpolate(new_freq_list) # write a new edi file using the new data mtObj.write_mt_file(save_dir=savepath, fn_basename='Synth00_new', file_type='edi', # edi or xml format new_Z_obj=new_Z_obj, # provide a z object to update the data new_Tipper_obj=new_Tipper_obj, # provide a tipper object to update the data longitude_format='LONG', # write longitudes as 'LON' or 'LONG' latlon_format='dd' # write as decimal degrees (any other input # will write as degrees minutes seconds )
def test_fun_rotate(self): # set the dir to the output from the previously correct run self._expected_output_dir = os.path.join(SAMPLE_DIR, 'ModEM_rotate40') edipath = EDI_DATA_DIR2 # example to specify a number of periods per decade start_period = 0.002 stop_period = 2000 periods_per_decade = 4 period_list = get_period_list(start_period, stop_period, periods_per_decade, include_outside_range=True) # list of edi files, search for all files ending with '.edi' edi_list = [ os.path.join(edipath, ff) for ff in os.listdir(edipath) if (ff.endswith('.edi')) ] do = Data( edi_list=edi_list, inv_mode='1', save_path=self._output_dir, period_list=period_list, period_buffer= 2, # factor to stretch interpolation by. For example: if period_buffer=2 # then interpolated data points will only be included if they are # within a factor of 2 of a true data point error_type_z= 'floor_egbert', # error type (egbert is % of sqrt(zxy*zyx)) # floor means apply it as an error floor error_value_z=5, # error floor (or value) in percent error_type_tipper='floor_abs', # type of error to set in tipper, # floor_abs is an absolute value set as a floor error_value_tipper=.03, rotation_angle=40, model_epsg=28354 # model epsg, currently set to utm zone 54. # See http://spatialreference.org/ to find the epsg code for your projection ) do.write_data_file() do.data_array['elev'] = 0. do.write_data_file(fill=False) # mesh rotation angle is the opposite direction to the rotation of the stations if do.rotation_angle == 0: mesh_rotation_angle = 0 else: mesh_rotation_angle = -do.rotation_angle # create model file mo = Model( stations_object=do.station_locations, cell_size_east=8000, cell_size_north=8000, pad_north= 7, # number of padding cells in each of the north and south directions pad_east=7, # number of east and west padding cells pad_z=6, # number of vertical padding cells pad_stretch_v= 1.6, # factor to increase by in padding cells (vertical) pad_stretch_h= 1.4, # factor to increase by in padding cells (horizontal) n_air_layers=10, #number of air layers res_model=100, # halfspace resistivity value for reference model n_layers=100, # total number of z layers, including air z1_layer=10, # first layer thickness pad_method='stretch', # method for calculating padding z_mesh_method='new', z_target_depth= 120000, # depth to bottom of core model (padding after this depth) mesh_rotation_angle=mesh_rotation_angle) mo.make_mesh() mo.write_model_file(save_path=self._output_dir) # add topography to res model mo.add_topography_to_model2(AUS_TOPO_FILE) mo.write_model_file(save_path=self._output_dir) co = Covariance() co.smoothing_east = 0.4 co.smoothing_north = 0.4 co.smoothing_z = 0.4 co.write_covariance_file(model_fn=mo.model_fn) for afile in ("ModEM_Data.dat", "covariance.cov", "ModEM_Model_File.rho"): output_data_file = os.path.normpath( os.path.join(self._output_dir, afile)) self.assertTrue(os.path.isfile(output_data_file), "output data file not found") expected_data_file = os.path.normpath( os.path.join(self._expected_output_dir, afile)) self.assertTrue( os.path.isfile(expected_data_file), "Ref output data file does not exist, nothing to compare with") # print ("Comparing", output_data_file, "and", expected_data_file) is_identical, msg = diff_files(output_data_file, expected_data_file) print(msg) self.assertTrue( is_identical, "The output file is not the same with the baseline file.")
def build_modem_inputfiles(edi_path, output_path): """ For a given se to edi files in edi_path, build the ModEM input files into output_path :param edi_path: # path where edi files are located r'C:\mtpywin\mtpy\examples\data\edi_files_2' :param output_path: # path to save to r'C:\test\ModEM' :return: """ # not nece os.chdir(r'C:\mtpywin\mtpy') # change this path to the path where mtpy is installed ## period list (won't include periods outside of the range of the edi file) ### ## comment/uncomment your desired method ###################################### ############################################################################### ## example to specify start, stop and total number of periods # start_period = 0.001 # stop_period = 1000 # n_periods = 25 # period_list = np.logspace(np.log10(start_period), # np.log10(stop_period), # n_periods) # example to specify a number of periods per decade start_period = 0.002 stop_period = 2000 periods_per_decade = 4 period_list = get_period_list(start_period, stop_period, periods_per_decade, include_outside_range=True) ## an example to use the periods from a particular edi file # edifile_periods = op.join(edipath,'Synth00.edi') # eobj = Edi(edifile_periods) # period_list = 1./eobj.freq ############################################################################### workdir = output_path edipath = edi_path # list of edi files, search for all files ending with '.edi' edi_list = [ op.join(edipath, ff) for ff in os.listdir(edipath) if (ff.endswith('.edi')) ] # make the save path if it doesn't exist if not op.exists(workdir): os.mkdir(workdir) do = Data( edi_list=edi_list, inv_mode='1', save_path=workdir, period_list=period_list, period_buffer= 2, # factor to stretch interpolation by. For example: if period_buffer=2 # then interpolated data points will only be included if they are # within a factor of 2 of a true data point error_type_z=np.array([ ['floor_percent', 'floor_egbert'], # error type, options are 'egbert', 'percent', 'mean_od', 'eigen', 'median', 'off_diagonals' ['floor_egbert', 'percent'] ]), # add floor to apply it as an error floor # can supply a 2 x 2 array for each component or a single value error_value_z=np.array([ [20., 5.], # error floor value in percent [5., 20.] ]), # can supply a 2 x 2 array for each component or a single value error_type_tipper='floor_abs', # type of error to set in tipper, # floor_abs is an absolute value set as a floor error_value_tipper=.03, model_epsg=28354 # model epsg, currently set to utm zone 54. # See http://spatialreference.org/ to find the epsg code for your projection ) do.write_data_file() # set elevations to zero as we need to ensure the stations are on the topography do.data_array['elev'] = 0. do.write_data_file(fill=False) # create model file mo = Model( station_locations=do.station_locations, cell_size_east=8000, cell_size_north=8000, pad_north= 7, # number of padding cells in each of the north and south directions pad_east=7, # number of east and west padding cells pad_z=6, # number of vertical padding cells pad_stretch_v=1.6, # factor to increase by in padding cells (vertical) pad_stretch_h=1.4, # factor to increase by in padding cells (horizontal) pad_num= 3, # number of constant-width cells to add to outside of model before padding cells start # this number is currently multiplied by 1.5 internally n_air_layers= 10, # number of air layers, set to 0 to incorporate bathymetry only res_model=100, # halfspace resistivity value for reference model n_layers=100, # total number of z layers, including air z1_layer=10, # first layer thickness pad_method='stretch', # method for calculating padding z_mesh_method='new', z_target_depth= 120000 # depth to bottom of core model (padding after this depth) ) mo.make_mesh() mo.write_model_file(save_path=workdir) # add topography to res model # if the number of air layers is zero - bathymetry only will be added. # if the number of air layers is nonzero - topography will be added, discretised into that number of cells # mo.add_topography_to_model2(r'C:\mtpywin\mtpy\examples\data\AussieContinent_etopo1.asc') mo.add_topography_to_model2( r'C:\Githubz\mtpy\examples\data\AussieContinent_etopo1.asc') mo.write_model_file(save_path=workdir) # update data elevations do.project_stations_on_topography(mo) # show the mesh mo.plot_sealevel_resistivity() co = Covariance() co.smoothing_east = 0.4 co.smoothing_north = 0.4 co.smoothing_z = 0.4 co.write_covariance_file(model_fn=mo.model_fn)