Skip to content
Snippets Groups Projects
Test2.m 12.6 KiB
Newer Older
mkolennikova's avatar
mkolennikova committed
% Очищаем командную строку (Command Window)
clc
% Очищаем Workspace (удаляем все переменные)
clear all

mkolennikova's avatar
mkolennikova committed
%% Скачиваем себе на компьютер данные реанализа, которые лежат на сервере (ничего не меняем!)
% Данные скачичаются в ту папку, которая открыта в окне слева (Current Folder)
% Проделать эту операцию нужно один раз, потом можно просто закомментировать этот блок
furl ='http://kibel.srcc.msu.ru:8080/share.cgi?ssid=5743fc3a82a14733a325cf8c68398db2&fid=5743fc3a82a14733a325cf8c68398db2&filename=surface_t2m_precip.nc&openfolder=forcedownload&ep='
fname = 'p-levels_t_u_v_geopotential.nc'
fpath= websave(fname, furl);

mkolennikova's avatar
mkolennikova committed
%% Открываем данные
% Прописываем путь к файлу
% Знак точка с запятой ";" в конце строки блокирует вывод полученного в ходе 
% выполнения команды результата в командной строке
filepath = "C:\";
% Прописываем название файла
filename = "p-levels_t_u_v_geopotential.nc";
% Просматриваем содержимое файла NetCDF командой ncdisp (переменные, их размерность и др.)
% Информация отображается в командной строке 
ncdisp (filepath + filename);

% Выбираем необходимые нам переменные
% Загружаем в Workspace u- и v- компоненты скорости ветра  командой ncread
% В скобках указываем название переменной - то, как она называется в файле
% В Workspace должны появиться переменные u_data и v_data в виде 4-х мерного массива
u_data = ncread(filepath + filename, 'u');
v_data = ncread(filepath + filename, 'v');

% Можно посмотреть размер массива командой size и вывести в переменную u_dimensions
% Размер массива u_data: 11440*721*3*3 (долготы*широты*барические уровни*время)
u_dimensions = size(u_data);

% Аналогичным образом загружаем векторы с долготами, широтами и временем
% А также барические уровни (700, 850 и 1000 гПа)
lonn = ncread(filepath + filename, 'longitude');
latt = ncread(filepath + filename, 'latitude');
time = ncread(filepath + filename, 'time');
p_level = ncread(filepath + filename, 'level');

%% Преобразовываем данные
% Вычисляем полный вектор скорости через u- и v- компоненты
wind = sqrt(u_data .^ 2 + v_data .^ 2);
% Находим среднее значение скорости ветра за три летних месяца командой
% mean. В скобках указывается, к какой размерности массива применяется
% операция. В нашем случае для времени - это 4. 
wind_ave_time = mean(wind, 4);

% Данные о времени даны в количестве часов с 00:00 1 января 1900 г. -> переводим их в понятные нам даты
% В Matlab'е есть команда datenum для работы с данными формата даты
% Она переводит заданную дату в количество дней с 00:00 1 января 0000 г.
% создадим переменную t0 - количество дней с 00:00 1 января 0000 г. по 00:00 1 января 1900 г.
t0 = datenum('1900-01-01 00:00:00', 'yyyy-mm-dd HH:MM:SS');
% переведем даты из нашего файла из формата "часы с 00:00 1 января 1900 г."
% в "дни с с 00:00 1 января 1900 г."
% time_days_since1900year - количество дней с 00:00 1 января 1900 г.по
% даты, указанные в файле. Точка перед знаком деления обозначает, что
% данная арифметическая операция применяется отдельно к каждому члену
% массива
time_days_since1900year = time ./ 24;
% сложим две переменные между собой, чтобы получить time_days_since0year - количество дней с 00:00 1 января 0000 г. 
% по даты, указанные в файле
time_days_since0year = time_days_since1900year + t0;
% конвертируем с помощью команды datetime из формата "дни с с 00:00 1 января 0000 г." в нормальный вид, 
% указав при этом, что стартуем именно с 0000 года флагом 'datenum'
% если нажать на переменную time_real, можно увидеть, за какие даты даны
% данные
time_I_understand = datetime(time_days_since0year, 'ConvertFrom', 'datenum');

%% Отрисовка данных на карте
% Переворачиваем командой flipud вектор широт, чтобы они начинались с -90
latt1 = flipud(latt);
% Строим координатную сетку с размерностью долгот и широт
[lon,lat] = meshgrid(lonn, latt1);

% Открываем окно для нашего рисунка во весь экран
figure('units','normalized','outerposition',[0 0 1 1])
% Указываем проекцию и координаты
m_proj ('Equidistant Cylindrical','lon',[0 360], 'lat', [-90 90]);
% Выбираем переменную на первом барическом уровне (700 гПа) 
wind_one_lev = wind_ave_time(:,:,1);
% Транспонируем (знак апострофа "'") -> меняем местами
% размерности), так как сетка имеет размерность широты*долготы
wind_transp = wind_one_lev';
% Отрисовываем переменную, заодно переворачивая её командой flipud, чтобы
% данные начинались с 90° ю.ш.
m_contourf(lon, lat, flipud(wind_transp),'LineColor','none', 'LevelStep', 1);
% Отрисовываем линию побережья
m_coast('Color', 'k','LineWidth', 1)
% Наносим линии сетки
m_grid
% Обозначаем цветовую шкалу
colormap(turbo)
% Выводим цветовую шкалу на рисунок
c = colorbar;
% Подписываем шкалу
c.Label.String = 'Wind, m/s';
% Поворачиваем её на -90 градусов
c.Label.Rotation = -90;
% Сдвигаем её, чтобы она не заезжала на шкалу после поворота
c.Label.Position = [3.5 -12.5 0];
% Определяем размер шрифта подписи
c.Label.FontSize = 12;
% Ограничиываем размах значений шкалы
clim([0 25])
% Добавляем название рисунка
% Команада datestr переводит значение переменной из формата даты в формат
% строки
% По умолчанию название будет написано жирным шрифтом -> команда 'FontWeight','Normal'
% делает подпись обычной
title("Mean Wind Speed" + " at " + int2str(p_level(1)) + "hPa; " + datestr(time_I_understand(1), 'mmmm') + " - " + datestr(time_I_understand(3), 'mmmm, yyyy') ,'FontWeight','Normal','FontSize',16)

%% Отрисовка данных на карте циклом для всех высот и сохранение рисунков
% Цикл от 1 до длины вектора с точками по времени, то есть от 1 до 3 с
% шагом 1
for i = 1:length(p_level)
    % Открываем окно для нашего рисунка во весь экран
    figure('units','normalized','outerposition',[0 0 1 1])
    % Указываем проекцию и координаты
    m_proj ('Equidistant Cylindrical','lon',[0 360], 'lat', [-90 90]);
    % Выбираем переменную на первом барическом уровне (700 гПа) 
    wind_one_lev = wind_ave_time(:,:,i);
    % Транспонируем (знак апострофа "'") -> меняем местами
    % размерности), так как сетка имеет размерность широты*долготы
    wind_transp = wind_one_lev';
    % Отрисовываем переменную, заодно переворачивая её командой flipud, чтобы
    % данные начинались с 90° ю.ш.
    m_contourf(lon, lat, flipud(wind_transp),'LineColor','none', 'LevelStep', 1);
    % Отрисовываем линию побережья
    m_coast('Color', 'k','LineWidth', 1)
    % Наносим линии сетки
    m_grid
    % Обозначаем цветовую шкалу
    colormap(turbo)
    % Выводим цветовую шкалу на рисунок
    c = colorbar;
    % Подписываем шкалу
    c.Label.String = 'Wind, m/s';
    % Поворачиваем её на -90 градусов
    c.Label.Rotation = -90;
    % Сдвигаем её, чтобы она не заезжала на шкалу после поворота
    c.Label.Position = [3.5 -12.5 0];
    % Определяем размер шрифта подписи
    c.Label.FontSize = 12;
    % Ограничиываем размах значений шкалы
    clim([0 25])
    % Добавляем название рисунка
    % Команада datestr переводит значение переменной из формата даты в формат
    % строки
    % По умолчанию название будет написано жирным шрифтом -> команда 'FontWeight','Normal'
    % делает подпись обычной
    title("Mean Wind Speed" + " at " + int2str(p_level(i)) + "hPa; " + datestr(time_I_understand(1), 'mmmm') + " - " + datestr(time_I_understand(3), 'mmmm, yyyy') ,'FontWeight','Normal','FontSize',16)
    
    % Сохраняем рисунок в формате png с разрешением 300 dpi
    print("Mean_Wind_Speed_at" + int2str(p_level(i)) + "hPa_" + datestr(time_I_understand(1), 'mmmm') + "-" + datestr(time_I_understand(3), 'mmmm_yyyy'), '-dpng', '-r300');
end


%% Строим вертикальный разрез скорости ветра, осредненной по всем широтам, долготам и за весь временной период
% По времени мы уже осредняли, необходимо повторить операцию осреднения применительно к долготам и широтам
% Осредняем по всем долготам. Теперь у нас не 1440 значений по долготе, а 1. Размер массива 1*721*3.
% Команда squeeze убирает размерность, которая равна 1 => массив становится размером 721*3 
wind_ave_lon = squeeze(mean(wind_ave_time, 1));
% Аналогично осредняем по всем широтам
wind_ave_lat = squeeze(mean(wind_ave_lon, 1));

%% Отрисовывем полученные значения на графике командой plot
% Указываем, что будет по оси X - скорость ветра, и что по оси Y -
% барические уровни
plot(wind_ave_lat, p_level, 'Color', [190/256 0 0], 'LineWidth', 2)
% Переворачиваем ось Y, чтобы значение барических уровней шли по убыванию
% (от 1000 к 700 гПа)
set(gca, 'YDir','reverse')
% Подписываем оси
xlabel('Wind speed, m/s')
ylabel('Pressure level, hPa')
% Накладываем сетку
grid on
% Ограничиваем размах значений по оси X
xlim([0 7])
% Добавляем название к графику
title("Mean Wind Speed for " + datestr(time_I_understand(1), 'mmmm') + " - " + datestr(time_I_understand(3), 'mmmm, yyyy') ,'FontWeight','Normal','FontSize',12)

% Сохраняем график
print("Vertical_plot_Mean_Wind_Speed_for_" + datestr(time_I_understand(1), 'mmmm') + "-" + datestr(time_I_understand(3), 'mmmm_yyyy'), '-dpng', '-r300');