Esempio n. 1
0
    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
Esempio n. 3
0

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.")
Esempio n. 5
0
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)