====== Задачи ====== ===== Задача 1 ===== У данной задачи есть 2 варианта (1.1, 1.2). Ниже переставлен код выполняющий расчет скорости поперечных и продольных волн в породе состоящий из двух компонентов - минеральной (Кальцит) и пор наполненных водой. Расчет выполняется с использованием методов теории эффективных сред в зависимости от объемных долей компонентов, т.е. от пористости породы. В данном коде представлено два метода: метод Фойгта-Ройсса-Хилла - ''Voigt_Reuss_Hill_method'' и метод Хашина-Штрикмана для двух компонентов - ''Hashin_Shtrikman_method_2comp''. Оба метода основаны на усреднении некоторых граничных значений. В первом случае границы Фойгта - ''Voigt_bound'' и Ройсса - ''Reuss_bound'', во втором ''Hashin_Shtrikman_bound_2comp''. **Задача** * задача 1.1 для метода Фойгта-Ройсса-Хилла * задача 1.2 для метода Хашина-Штрикмана Построить на одном рисунке результаты работы **одного** из методов (два или четыре графика на одном figure): * Модуль упругости сжатия K, ГПа * Модуль упругости сдвига Mu, ГПа * Скорость продольных волн Vp, км/с * Скорость поперечных волн Vs, км/с в виде графиков и записать полученные результаты в CSV файл. На графиках должен быть заголовок, подписи по осям, координатная сетка. Код выполняющий задание свойств компонентов среды и выполняющий построение графиков и запись результатов должен быть размещен в **отдельном файле** от методов расчета. Код не относящийся к используемому методу должен быть **удален**. ** Базовый код ** import numpy as np import matplotlib.pyplot as plt #%% Расчет # Число компонентов N_components = 2 # Число шагов N_steps = 100 # Инициализируем массивы исходных данных и результатов var_c = ['Vp', 'Vs', 'Rho', 'K', 'Mu', 'Vol'] c = np.zeros([N_components,N_steps], dtype=[(x, np.float64) for x in var_c]) var_r = ['K_V', 'Mu_V', 'Vp_V', 'Vs_V', 'K_R', 'Mu_R', 'Vp_R', 'Vs_R', 'K_VRH', 'Mu_VRH', 'Vp_VRH', 'Vs_VRH', 'K_HS_UP', 'Mu_HS_UP', 'K_HS_LO', 'Mu_HS_LO', 'K_HS', 'Mu_HS','Vp_HS','Vs_HS'] r = np.zeros([N_steps], dtype=[(x, np.float64) for x in var_r]) # Задаем исходные данные # Calcite c[0]['Vp'] = 6.54 c[0]['Vs'] = 3.35 c[0]['Rho'] = 2.7 # Water c[1]['Vp'] = 1.6 c[1]['Vs'] = 1e-6 c[1]['Rho'] = 1.1 # Задаем пористость poros = np.linspace(0.0, 1.0, num=N_steps) # Определяем содержание компонентов c[0]['Vol'] = 1 - poros c[1]['Vol'] = poros # Расчет # Расчет K и Mu c['K'] = c['Rho']*(c['Vp']**2-4./3.*c['Vs']**2) c['Mu'] = c['Rho']*c['Vs']**2 # axis = 0 : Суммирование по компонентам N_components # результат - одномерный массив из N_steps элементов Rho_eff = np.sum(c['Vol']*c['Rho'], axis=0) # Метод Фойгта def Voigt_bound(c): K = np.sum(c['Vol']*c['K'], axis=0) Mu = np.sum(c['Vol']*c['Mu'], axis=0) return K, Mu r['K_V'], r['Mu_V'] = Voigt_bound(c) # Метод Ройсса def Reuss_bound(c): K = 1.0 / np.sum(c['Vol']/c['K'], axis=0) Mu = 1.0 / np.sum(c['Vol']/c['Mu'], axis=0) return K, Mu r['K_R'], r['Mu_R'] = Reuss_bound(c) # Метод Фойгта-Ройсса-Хилла def Voigt_Reuss_Hill_method(c): K_V, Mu_V = Voigt_bound(c) K_R, Mu_R = Reuss_bound(c) K = (K_V+K_R) / 2.0 Mu = (Mu_V+Mu_R) / 2.0 return K, Mu r['K_VRH'] , r['Mu_VRH'] = Voigt_Reuss_Hill_method(c) # Метод Хашина-Штрикмана для двух компонентов def Hashin_Shtrikman_bound_2comp(c0,c1): K1, Mu1, f1 = c0['K'], c0['Mu'], c0['Vol'] K2, Mu2, f2 = c1['K'], c1['Mu'], c1['Vol'] Z0 = K1+4./3.*Mu1 YK = 1./(K2-K1) YMu = 1./(Mu2-Mu1) K_HS = K1+f2/(YK+f1/Z0) Z1 = 2.*f1*(K1+2.*Mu1)/(5.*Mu1*Z0) Mu_HS = Mu1+f2/(YMu+Z1) return K_HS, Mu_HS r['K_HS_UP'], r['Mu_HS_UP'] = Hashin_Shtrikman_bound_2comp(c[0],c[1]) r['K_HS_LO'], r['Mu_HS_LO'] = Hashin_Shtrikman_bound_2comp(c[1],c[0]) def Hashin_Shtrikman_method_2comp(c0,c1): K_HS_UP, Mu_HS_UP = Hashin_Shtrikman_bound_2comp(c0,c1) K_HS_LO, Mu_HS_LO = Hashin_Shtrikman_bound_2comp(c1,c0) K = (K_HS_UP+K_HS_LO) / 2.0 Mu = (Mu_HS_UP+Mu_HS_LO) / 2.0 return K, Mu r['K_HS'], r['Mu_HS'] = Hashin_Shtrikman_method_2comp(c[0],c[1]) # Для каждого метода рассчитываем Vp и Vs for m in ['V', 'R', 'VRH', 'HS']: r[f'Vp_{m}'] = np.sqrt((r[f'K_{m}']+4.0/3.0*r[f'Mu_{m}'])/Rho_eff) r[f'Vs_{m}'] = np.sqrt(r[f'Mu_{m}']/Rho_eff) ===== Задача 2 ===== У данной задачи есть 4 варианта (2.1, 2.2, 2.3, 2.4). ==== 2.1 Сейсмические события на удалении от станции ==== **Задача** Зададимся координатами любого города. Предположим, что в этом городе находится сейсмостанция. Отметить на карте сам город и выбрать из каталога сейсмических событий события, отстоящие от него по координатам на не менее чем 15 градусов и не более чем на 60 градусов. Карту следует построить в стереографической проекции с центром в выбранном городе. **Данные** {{ :7pluseventsusgs.csv | Каталог сейсмических событий с магнитудой больше 7 USGS}} ** Базовый код ** import numpy as np import matplotlib.pyplot as plt from cartopy import crs as ccrs fig = plt.figure(figsize=(10,10)) central_point = [60,160] # сейсмостанция ax = fig.add_subplot(projection=ccrs.Stereographic( central_point[0],central_point[1],scale_factor=3)) ax.set_global() ax.coastlines(resolution='110m') ==== 2.2 Количество сейсмических событий на сетке ==== Построить на карте мира теплокарту числа сейсмических событий из каталога с шагом 3 на 3 градуса. Использовать проекцию Робинсона с центром по линии перемены дат. **Данные** {{ :7pluseventsusgs.csv | Каталог сейсмических событий с магнитудой больше 7 USGS}} ** Базовый код ** import numpy as np import matplotlib.pyplot as plt from cartopy import crs as ccrs import matplotlib.ticker as mticker fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(projection=ccrs.Robinson(central_longitude=180)) ax.set_global() ax.coastlines(resolution='110m') ==== 2.3 Карта напряженности магнитного поля ==== Построить глобальную карту напряженности магнитного поля за 1980, 1990 и 2000 годы. Использовать проекцию Робинсона. Пример карты [[https://ngdc.noaa.gov/geomag/magfield-wist/]] (Total Intensity: Main field) Использовать контуры с подписями. **Данные** Данные NGDC NOAA {{ ::f_map_mf_1980.zip | 1980 год }} {{ :f_map_mf_1990.zip | 1980 год }} {{ :f_map_mf_2000.zip | 1980 год }} ** Базовый код ** import numpy as np import matplotlib.pyplot as plt from cartopy import crs as ccrs import matplotlib.ticker as mticker fig = plt.figure(figsize=(10,10)) ax = fig.add_subplot(projection=ccrs.Robinson(central_longitude=0)) ax.set_global() ax.coastlines(resolution='110m') ==== 2.4 Построение смещений на карте ==== В данном Shape-файле описаны точки трех разных видов (kind): base: опорные точки, profile1 и profile2 - результаты измерений смещений вдоль профилей. Построить карту используя подложку tile сервера OpenStreetMap на которую нанести: опорные точки, точки профилей 1 и 2 соединенные линиями различных цветов. Для каждой из точек профиля указать направление (az в градусах) и величину смещения (value) в виде стрелки. **Данные** {{ ::tdata.zip | Синтетические данные}} ** Базовый код ** import numpy as np import matplotlib.pyplot as plt from cartopy import crs as ccrs import shapefile from cartopy.io.img_tiles import OSM shpfile = shapefile.Reader("/home/f0ma/tdata/tdata") fields = [x[0] for x in shpfile.fields[1:] ] for item in shpfile.iterShapeRecords(): print("Position:", item.shape.points[0]) print("Data:", dict(zip(fields, item.record))) tiles_provider = OSM() plt.figure(figsize=(16, 16)) ax = plt.axes(projection=tiles_provider.crs) ax.set_extent([shpfile.bbox[0]-0.1, shpfile.bbox[2]+0.1, shpfile.bbox[1]-0.1, shpfile.bbox[3]+0.1], ccrs.PlateCarree()) ax.add_image(tiles_provider, 11)