Commit 02754096 authored by Dany Dumont's avatar Dany Dumont
Browse files

README.md + formattage des scripts

parent f1cc58c8
SDM stands for Surface Drift Models that have been developped to improve the accuracy of floating object surface drift trajectory forecasts given wind and ocean currents. The package contains the code for four different drift models labelled A, B, C and D and that are described below.
#### 1. Control model
Model A is the most commonly used drift model where the surface drift is equal to the ocean current velocity to which is added a fraction of the 10-m wind velocity.
#### 2. Extrapolating surface currents
#### 5. References
Tamtare, T., D. Dumont, C. Chavanne (2019) Extrapolating eulerian currents for improving surface drift forecast, J. Oper. Oceanogr., submitted 28 September 2018, re-submitted 7 March 2019.
% MAIN_RK - Programme principal qui transporte des particules
% Inputs: Wind, current
function [data] = main_RKmA(dat1,dat2,lat1,lon1)
% MAIN_RKMA - Programme principal qui transporte des particules ...
%
% Outputs: particule position in lon and lat
% Other m-files required: RK.m, rotate_vector.m
% Author: michel tamtare
% ISMER-UQAR/polr
% Syntax: [data] = main_RKmA(dat1,dat2,lat1,lon1)
%
% Inputs:
% dat1 - date de debut de derive du spot
% dat2 - date de fin de derive du spot
% lat1 -
% lon1 -
%
% Outputs:
% data - particule position in lon and lat
%
% Example:
% [data] = main_RKmA(dat1,dat2,lat1,lon1)
%
% Other m-files required: RK.m, rotate_vector.m, ll2xpyp.m
% Subfunctions: none
% MAT-files required:
%
% See also: MAIN_RKMB, MAIN_RKMC, MAIN_RKMD
% Author: Michel Tamtare
% ISMER-UQAR
% email: tamkpanka.tamtare@uqar.ca
% juin 2018; Last revision:
% Last revision: June 2018
%------------- BEGIN CODE ------------------------------------------------------------------------------------------------------------------------------------
......@@ -37,7 +49,6 @@
% k............................Indice de latitude dans la grille du modèle
% iii..........................Indice de longitude dans la grille du modèle
%*************************************************************************************************************************************************************
function [data] = main_RKmA(dat1,dat2,lat1,lon1)
close all
%clear mex
......@@ -52,33 +63,31 @@ reduit = 0; % Pour n'utiliser qu'une portion de la grille (plus rapide)
sens = 1; % -1 = backward
theta = -49; % Angle de rotation de la grille du golfe
dx = 5000; % Resolution de la grille (m)
if reduit ==1 % Modele reduit
%*********************** Cellules moullées *******************************************************************************************************************
if reduit == 1 % Modele reduit
%*********************** Cellules mouillées ******************************************************************************************************************
i1 = 80;
i2 = 150;
k1 = 80;
k2 = 236;
else % Ensemble des cellules
i1 = 2;
i2 = 150;
k1 = 2;
k2 = 236;
i1 = 2;
i2 = 150;
k1 = 2;
k2 = 236;
end
[iii,k,status] = ll2xpyp(lon1,lat1,'gsl5km')
% trouver les indices des cellules mouill??es dans le domaine choisi
% trouver les indices des cellules mouillees dans le domaine choisi
t = 1;
for ii = i1:i2
for kk = k1:k2
%if ( ~isnan(test(ii,kk)) )
kcomp(t) = kk;
icomp(t) = ii;
t = t+1;
%end
......@@ -86,119 +95,90 @@ for ii = i1:i2
end
%******************************************************************Fin de la configuration*********************************************************************
% ******************* Fin de la configuration *****************************
%****************************************************************Chargement des fichiers **********************************************************************
% ******************* Chargement des fichiers *****************************
%addpath('/share/archives/partage_lasso/ww3/gsl038_2012-2015_stokes/2013/gridded_dat')
%addpath('/home/tamt0001/these/data/drifter/2014/gridded_dat') ;
%% ************ Chargement des fichiers ***********************************************************************************************************************
addpath('/home/tamt0001/these/data/drifter/BAS/mat/GSL/datagsl') ;
% addpath('/home/tamt0001/these/data/2015/G2L') ;
% load 'G2L/G2Locean_2015.mat';
%addpath('/home/tamt0001/these/data/2015/G2L') ;
%load 'G2L/G2Locean_2015.mat';
load 'juin12014.mat';
dat= datO;
uc=u;
vc=v;
dat = datO;
uc = u;
vc = v;
%% vent du model GEM (test avec le spot 73)
load 'GEM2014.mat';
uw=Uw;
vw=Vw;
datw=datg;
uw = Uw;
vw = Vw;
datw = datg;
uw = permute(uw,[3 1 2]);
vw = permute(vw,[3 1 2]);
T1 = find(dat <= dat1 + 0.101); % date1 est la date de debut de derive du spot
T2 = find(dat <= dat2 + 0.001); % date2 est la date de fin de derive du spot (voir tr_compare)
T1 = find(dat<=dat1+0.101); % % date1 est la date de d??but de d??rive du spot
T2 = find(dat<=dat2+0.001); % %date2 est la date de fin de d??rive du spot (voir tr_compare)
T1=T1(end);
T1 = T1(end);
T2 = T2(end);
T2=T2(end);
T3 = find(datw <= dat1 + 0.001); % date1 est la date de debut de derive du spot
T4 = find(datw < dat2 + 0.001); % date2 est la date de fin de derive du spot (voir tr_compare)
T3 = find(datw<=dat1+0.001); % % date1 est la date de d??but de d??rive du spot
T4 = find(datw<dat2+0.001); % %date2 est la date de fin de d??rive du spot (voir tr_compare)
T3=T3(end);
T4=T4(end);
T3 = T3(end);
T4 = T4(end);
% keyboard
%**********************************************************************************************************************************************************
% 2. Transporter les particules avec Runge-Kutta 4
%**********************************************************************************************************************************************************
tsteps1 = T1:T2-1;
tsteps11=tsteps1+1;
tsteps11 = tsteps1+1;
tsteps2 = T3:T4-1;
tsteps22=tsteps2+1;
tsteps22 = tsteps2+1;
% keyboard
% tic
for tsteps = 1:length(tsteps1);
tsteps
% toc
% disp([ num2str(tsteps1-T1+1) '/' num2str(T2-T1) ])
uc1 = squeeze(uc(tsteps1(tsteps),:,:));
vc1 = squeeze(vc(tsteps1(tsteps),:,:));
% toc
% disp([ num2str(tsteps1-T1+1) '/' num2str(T2-T1) ])
uc1 = squeeze(uc(tsteps1 (tsteps),:,:));
vc1 = squeeze(vc(tsteps1 (tsteps),:,:));
uc2 = squeeze(uc(tsteps11(tsteps),:,:));
vc2 = squeeze(vc(tsteps11(tsteps),:,:));
uw1 = squeeze(uw(tsteps2((tsteps)),:,:));
vw1 = squeeze(vw(tsteps2(tsteps),:,:));
uw1 = squeeze(uw(tsteps2 (tsteps),:,:));
vw1 = squeeze(vw(tsteps2 (tsteps),:,:));
uw2 = squeeze(uw(tsteps22(tsteps),:,:));
vw2 = squeeze(vw(tsteps22(tsteps),:,:));
% keyboard
% ici la valeur de la fraction du vent en nombre complexe (modèleB)
mA= 0.0234 + sqrt(-1).*0.0015;
U1=uc1+sqrt(-1).*vc1;
Uw1=uw1+sqrt(-1).*vw1;
U2=uc2+sqrt(-1).*vc2;
% keyboard
Uw2=uw2+ sqrt(-1).*vw2;
% ici la valeur de la fraction du vent en nombre complexe (modèleB)
Uc1=U1+mA.*Uw1;
mA = 0.0234 + sqrt(-1).*0.0015;
Uc2=U2+mA.*Uw2;
U1 = uc1+sqrt(-1).*vc1;
Uw1 = uw1+sqrt(-1).*vw1;
U2 = uc2+sqrt(-1).*vc2;
Uw2 = uw2+ sqrt(-1).*vw2;
% % keyboard
Uc1 = U1+mA.*Uw1;
Uc2 = U2+mA.*Uw2;
uc1=real(Uc1);
vc1=imag(Uc1);
uc2=real(Uc2);
vc2=imag(Uc2);
% % keyboard
uc1 = real(Uc1);
vc1 = imag(Uc1);
uc2 = real(Uc2);
vc2 = imag(Uc2);
clear uw1 vw1 uw2 vw2
......@@ -212,26 +192,24 @@ vc2=imag(Uc2);
%keyboard
clear u1 v1 u2 v2
[u1,v1]=rotate_vector(u1l,v1l,theta);
[u2,v2]=rotate_vector(u2l,v2l,theta);
% keyboard
[u1,v1] = rotate_vector(u1l,v1l,theta);
[u2,v2] = rotate_vector(u2l,v2l,theta);
% keyboard
clear u1l v1l u2l v2l
% u1(isnan(u1)) = 0;
% v1(isnan(v1)) = 0;
% u2(isnan(u2)) = 0;
% v2(isnan(v2)) = 0;
% u1(isnan(u1)) = 0;
% v1(isnan(v1)) = 0;
% u2(isnan(u2)) = 0;
% v2(isnan(v2)) = 0;
%*******************************************************************************************************************************************************
% Fonction RK.m pour le transport
%*******************************************************************************************************************************************************
% Fonction RK.m pour le transport
%******************************************************************************************************************************************************
umid = ( u1 + u2 )/2;
vmid = ( v1 + v2 )/2;
[k,iii] = RK(u1,u2,-v1,-v2,umid,-vmid,k,iii,h,dx,kcomp,icomp);
end
%time = (dat1:1/24:dat2);
......
% MAIN_RK - Programme principal qui transporte des particules
% Inputs: Wind, current
function [data] = main_RKmB(dat1,dat2,lat1,lon1)
% MAIN_RKMB - Programme principal qui transporte des particules ...
%
% Outputs: particule position in lon and lat
% Other m-files required: RK.m, rotate_vector.m
% Author: michel tamtare
% ISMER-UQAR/polr
% Syntax: [data] = main_RKmB(dat1,dat2,lat1,lon1)
%
% Inputs:
% dat1 - date de debut de derive du spot
% dat2 - date de fin de derive du spot
% lat1 -
% lon1 -
%
% Outputs:
% data - particule position in lon and lat
%
% Example:
% [data] = main_RKmB(dat1,dat2,lat1,lon1)
%
% Other m-files required: RK.m, rotate_vector.m, ll2xpyp.m
% Subfunctions: none
% MAT-files required:
%
% See also: MAIN_RKMA, MAIN_RKMC, MAIN_RKMD
% Author: Michel Tamtare
% ISMER-UQAR
% email: tamkpanka.tamtare@uqar.ca
% juin 2018; Last revision:
% Last revision: June 2018
%------------- BEGIN CODE ------------------------------------------------------------------------------------------------------------------------------------
......@@ -37,7 +49,7 @@
% k............................Indice de latitude dans la grille du modèle
% iii..........................Indice de longitude dans la grille du modèle
%*************************************************************************************************************************************************************
function [data] = main_RKmB(dat1,dat2,lat1,lon1)
close all
%clear mex
......@@ -52,18 +64,18 @@ reduit = 0; % Pour n'utiliser qu'une portion de la grille (plus rapide)
sens = 1; % -1 = backward
theta = -49; % Angle de rotation de la grille du golfe
dx = 5000; % Resolution de la grille (m)
if reduit ==1 % Modele reduit
%*********************** Cellules moullées *******************************************************************************************************************
if reduit == 1 % Modele reduit
%*********************** Cellules moullées *******************************************************************************************************************
i1 = 80;
i2 = 150;
k1 = 80;
k2 = 236;
else % Ensemble des cellules
i1 = 2;
i2 = 150;
k1 = 2;
k2 = 236;
i1 = 2;
i2 = 150;
k1 = 2;
k2 = 236;
end
......@@ -124,13 +136,13 @@ vc=1./2*(vca+vcb)-1./2*((vcb-vca)./(z2-z1))*(z1+z2);
T1 = find(dat<=dat1+0.101); % % date1 est la date de d??but de d??rive du spot
T2 = find(dat<=dat2+0.001); % %date2 est la date de fin de d??rive du spot (voir tr_compare)
T1=T1(end);
T2=T2(end);
T1=T1(end);
T2=T2(end);
T3 = find(datw<=dat1+0.001); % % date1 est la date de d??but de d??rive du spot
T4 = find(datw<dat2+0.001); % %date2 est la date de fin de d??rive du spot (voir tr_compare)
T3=T3(end);
T4=T4(end);
T3 = find(datw<=dat1+0.001); % % date1 est la date de d??but de d??rive du spot
T4 = find(datw<dat2+0.001); % %date2 est la date de fin de d??rive du spot (voir tr_compare)
T3=T3(end);
T4=T4(end);
% keyboard
%****************************************************************************************************************************************************
......@@ -148,49 +160,40 @@ tsteps22=tsteps2+1;
% tic
for tsteps = 1:length(tsteps1);
tsteps
% toc
% disp([ num2str(tsteps1-T1+1) '/' num2str(T2-T1) ])
uc1 = squeeze(uc(tsteps1(tsteps),:,:));
vc1 = squeeze(vc(tsteps1(tsteps),:,:));
% toc
% disp([ num2str(tsteps1-T1+1) '/' num2str(T2-T1) ])
uc1 = squeeze(uc(tsteps1 (tsteps),:,:));
vc1 = squeeze(vc(tsteps1 (tsteps),:,:));
uc2 = squeeze(uc(tsteps11(tsteps),:,:));
vc2 = squeeze(vc(tsteps11(tsteps),:,:));
uw1 = squeeze(uw(tsteps2((tsteps)),:,:));
vw1 = squeeze(vw(tsteps2(tsteps),:,:));
uw1 = squeeze(uw(tsteps2 (tsteps),:,:));
vw1 = squeeze(vw(tsteps2 (tsteps),:,:));
uw2 = squeeze(uw(tsteps22(tsteps),:,:));
vw2 = squeeze(vw(tsteps22(tsteps),:,:));
% keyboard
% ici la valeur de la fraction du vent en nombre complexe (modèleB)
mB= 0.0150 + sqrt(-1).*0.0005;
U1=uc1+sqrt(-1).*vc1;
% keyboard
Uw1=uw1+sqrt(-1).*vw1;
% ici la valeur de la fraction du vent en nombre complexe (modèleB)
U2=uc2+sqrt(-1).*vc2;
mB = 0.0150 + sqrt(-1).*0.0005;
Uw2=uw2+ sqrt(-1).*vw2;
U1 = uc1 + sqrt(-1).*vc1;
Uw1 = uw1 + sqrt(-1).*vw1;
U2 = uc2 + sqrt(-1).*vc2;
Uw2 = uw2 + sqrt(-1).*vw2;
Uc1=U1+mB.*Uw1;
Uc1 = U1 + mB.*Uw1;
Uc2 = U2 + mB.*Uw2;
Uc2=U2+mB.*Uw2;
% % keyboard
% % keyboard
uc1 = real(Uc1);
vc1 = imag(Uc1);
uc2 = real(Uc2);
vc2 = imag(Uc2);
uc1=real(Uc1);
vc1=imag(Uc1);
uc2=real(Uc2);
vc2=imag(Uc2);
% % save(sprintf('drifter_mat2/U.mat'),'datO','uc12','vc12','uc22','vc22')
% % keyboard
% % save(sprintf('drifter_mat2/U.mat'),'datO','uc12','vc12','uc22','vc22')
% % keyboard
clear uw1 vw1 uw2 vw2
for t = 1:length(kcomp)
......@@ -203,23 +206,21 @@ vc2=imag(Uc2);
%keyboard
clear u1 v1 u2 v2
[u1,v1]=rotate_vector(u1l,v1l,theta);
[u2,v2]=rotate_vector(u2l,v2l,theta);
% keyboard
[u1,v1] = rotate_vector(u1l,v1l,theta);
[u2,v2] = rotate_vector(u2l,v2l,theta);
% keyboard
clear u1l v1l u2l v2l
% u1(isnan(u1)) = 0;
% v1(isnan(v1)) = 0;
% u2(isnan(u2)) = 0;
% v2(isnan(v2)) = 0;
% u1(isnan(u1)) = 0;
% v1(isnan(v1)) = 0;
% u2(isnan(u2)) = 0;
% v2(isnan(v2)) = 0;
umid = ( u1 + u2 )/2;
vmid = ( v1 + v2 )/2;
[k,iii] = RK(u1,u2,-v1,-v2,umid,-vmid,k,iii,h,dx,kcomp,icomp);
end
%time = (dat1:1/24:dat2);
......
% MAIN_RK - Programme principal qui transporte des particules
% Inputs: Wind, current
function [data] = main_RKmC(dat1,dat2,lat1,lon1)
% MAIN_RKMC - Programme principal qui transporte des particules ...
%
% Outputs: particule position in lon and lat
% Other m-files required: RK.m, rotate_vector.m
% Author: michel tamtare
% ISMER-UQAR/polr
% Syntax: [data] = main_RKmC(dat1,dat2,lat1,lon1)
%
% Inputs:
% dat1 - date de debut de derive du spot
% dat2 - date de fin de derive du spot
% lat1 -
% lon1 -
%
% Outputs:
% data - particule position in lon and lat
%
% Example:
% [data] = main_RKmC(dat1,dat2,lat1,lon1)
%
% Other m-files required: RK.m, rotate_vector.m, ll2xpyp.m, t_tide
% Subfunctions: none
% MAT-files required: GEM2014.mat, LEV.mat
%
% See also: MAIN_RKMA, MAIN_RKMB, MAIN_RKMD
% Author: Michel Tamtare
% ISMER-UQAR
% email: tamkpanka.tamtare@uqar.ca
% Last revision: June 2018
% juin 2018; Last revision:
%------------- BEGIN CODE ------------------------------------------------------------------------------------------------------------------------------------
%*************************************************************************************************************************************************************
% Definition des constantes:
%*************************************************************************************************************************************************************
% *************************************************************************
% Definition des constantes
% *************************************************************************
% h............................Pas de temps pour le transport de particules (1 = 1 tstep
% h ........ Pas de temps pour le transport de particules (1 = 1 tstep
% donc une heure pcq les sorties du modele sont horaires).
% i1...........................Valeur initiale de i pour le positionnement des particu-
% les initiales.
% i2...........................Valeur finale de i pour le positionnement des particules
% i1 ........ Valeur initiale de i pour le positionnement des particules
% initiales.
% i2 ........ Valeur finale de i pour le positionnement des particules
% initiales.
% k1 ........ Valeur initiale de k pour le positionnement des particules
% initiales.
% k1...........................Valeur initiale de k pour le positionnement des particu-
% les initiales.
% k2...........................Valeur finale de k pour le positionnement des particules
% k2 ........ Valeur finale de k pour le positionnement des particules
% initiales.
%*************************************************************************************************************************************************************
% Definition des variables:
%*************************************************************************************************************************************************************
% k............................Indice de latitude dans la grille du modèle
% iii..........................Indice de longitude dans la grille du modèle
%*************************************************************************************************************************************************************
function [data] = main_RKmC(dat1,dat2,lat1,lon1)
% *************************************************************************
% Definition des variables
% *************************************************************************
% k ........ Indice de latitude dans la grille du modele
% iii........ Indice de longitude dans la grille du modele
% *************************************************************************
close all
%clear mex
%*************************************************************************************************************************************************************
% *************************************************************************
% Configuration
%*************************************************************************************************************************************************************
% *************************************************************************
h = 3600; % Pas de temps (sec)
k = [];
......@@ -52,18 +64,17 @@ reduit = 0; % Pour n'utiliser qu'une portion de la grille (plus rapide)
sens = 1; % -1 = backward
theta = -49; % Angle de rotation de la grille du golfe
dx = 5000; % Resolution de la grille (m)
if reduit ==1 % Modele reduit
%*********************** Cellules moullées *******************************************************************************************************************
if reduit == 1 % Modele reduit
%*********************** Cellules moullées *******************************************************************************************************************
i1 = 80;
i2 = 150;
k1 = 80;
k2 = 236;
else % Ensemble des cellules
i1 = 2;
i2 = 150;
k1 = 2;
k2 = 236;
i1 = 2;
i2 = 150;
k1 = 2;
k2 = 236;
end
......@@ -76,10 +87,8 @@ for ii = i1:i2
%if ( ~isnan(test(ii,kk)) )
kcomp(t) = kk;
icomp(t) = ii;
t = t+1;
t = t + 1;
%end
end
......@@ -98,52 +107,48 @@ addpath('/home/tamt0001/these/data/drifter/BAS/mat/GSL/datagsl') ;
addpath('/home/tamt0001/matlab/program/simu_lag') ;
% addpath('/home/tamt0001/these/data/2015/G2L') ;
% load 'G2L/G2Locean_2015.mat';
load 'GEM2014.mat';
uw=Uw;
vw=Vw;
datw=datg;
uw = Uw;
vw = Vw;
datw = datg;
uw = permute(uw,[3 1 2]);
vw = permute(vw,[3 1 2]);