···4343ux = zeros(nx+1,ny); % Matriz de velocidad de particula en x
4444uy = zeros(nx,ny+1); % Matriz de velocidad de particula en y
45454646-%% POSICIONES DE LA FUENTE
4747-%
4646+%% POSICION DE LA FUENTE
4847posNy = round((Origen(2))/dh) + nPML;
4948posNx = round(Origen(1)/dh) + nPML;
504951505251%% EXCITACI�N
5352lenT = ts*10^-3/dt; % Longitud del vector de tiempo
5454-a = 2000/(sqrt(pi)/2)*4;
5555-t=((1:lenT)/(1/dt)-4/a); % Vector de tiempos
5656-w=-(exp(-a^2*(t.^2)/2).*(a^2*(t.^2)-1)); % Ricker
5353+a = 2000/(sqrt(pi)/2)*4;
5454+t = ((1:lenT)/(1/dt)-4/a); % Vector de tiempos
5555+w = -(exp(-a^2*(t.^2)/2).*(a^2*(t.^2)-1)); % Ricker
57565857%% PML
5958% Gradiente de impedancias desde el valor del medio hasta un porcentaje de
+174
FDTD_QRD_Unidimensional_2D.m
···11+%% =========================================================================
22+%
33+% Modelo FDTD de difusor QRD en recinto 2D con excitaci�n Ricker o
44+% continua
55+%
66+%
77+% Jose Manuel Requena Plens (29/09/2019)
88+%
99+% =========================================================================
1010+clc, clear, close all;
1111+1212+%% GENERAL
1313+% Caracteristicas del medio
1414+rho = 1.21; % Densidad del medio [kg/m3]
1515+c = 341; % Velocidad de propagaci�n [m/s]
1616+k = (c^2)*rho; % Modulo de compresibilidad
1717+% Frecuencia de emision
1818+freq = 3000; % (Hz)
1919+% Tipo de excitaci�n ('pulse' o 'CW')
2020+excit = 'pulse';
2121+% Dise�o del difusor QRD
2222+N = 7;
2323+fd = 1000;
2424+fw = 5*fd;
2525+% �Difusor o Panel plano?
2626+tipo = 'difusor'; % 'difusor' o 'plano'
2727+% Dimensiones del mapa en metros
2828+lx = 1; % [m]
2929+ly = 1; % [m]
3030+% Posicion de la fuente
3131+Origen = [0.5,0.99]; % [m,m]
3232+% Tama�o/Ancho de la PML en metros
3333+lPML = 0.5; % m
3434+% Par�metros de calculo
3535+dh = .01; % Definici�n espacial [m]
3636+dt = dh/341/2; % Definici�n temporal [m]
3737+ts = 7; % Tiempo de simulaci�n [m]
3838+3939+%% MATRICES
4040+% Dimensiones de la matriz del mapa
4141+nPML = round(lPML/dh);
4242+nx = round(lx/dh)+nPML*2; % Por 2 ya que la PML esta arriba y abajo
4343+ny = round(ly/dh)+nPML*2; % Por 2 ya que la PML esta a izquierda y derecha
4444+% Crear matriz del mapa
4545+p = zeros(nx,ny); % Matrices de presion
4646+px = zeros(nx,ny);
4747+py = zeros(nx,ny);
4848+ux = zeros(nx+1,ny); % Matriz de velocidad de particula en x
4949+uy = zeros(nx,ny+1); % Matriz de velocidad de particula en y
5050+5151+%% POSICION DE LA FUENTE
5252+posNy = round((Origen(2))/dh) + nPML;
5353+posNx = round(Origen(1)/dh) + nPML;
5454+5555+%% EXCITACI�N
5656+lenT = ts*10^-3/dt; % Longitud del vector de tiempo
5757+a = freq/(sqrt(pi)/2)*4;
5858+t = ((1:lenT)/(1/dt)-4/a); % Vector de tiempos
5959+switch excit
6060+ case 'pulse'
6161+ w = -(exp(-a^2*(t.^2)/2).*(a^2*(t.^2)-1)); % Ricker
6262+ case 'CW'
6363+ w = cos(2*pi*freq*t);
6464+end
6565+6666+%% PML
6767+% Gradiente de impedancias desde el valor del medio hasta un porcentaje de
6868+% este
6969+gammamax = 0.5; % Maxima reducci�n de la impedancia / porcentaje
7070+% PML Izquierda y derecha
7171+gammaux = zeros(nx+1,ny);
7272+gammaux(1:nPML,:) = repmat(gammamax*((nPML:-1:1)'/nPML).^2,1,ny); % Izquierda
7373+gammaux(1+end-nPML:end,:) = repmat(gammamax*((1:1:nPML)'/nPML).^2,1,ny); % Derecha
7474+gammax = (gammaux(1:end-1,:)+gammaux(2:end,:))/2; % Conjunto
7575+% PML Superior e inferior
7676+gammauy = zeros(nx,ny+1);
7777+gammauy(:,1:nPML) = repmat(gammamax*((nPML:-1:1)/nPML).^2,nx,1); % Inferior
7878+gammauy(:,1+end-nPML:end) = repmat(gammamax*((1:1:nPML)/nPML).^2,nx,1); % Superior
7979+gammay = (gammauy(:,1:end-1)+gammauy(:,2:end))/2; % Conjunto
8080+8181+%% Condiciones de contorno
8282+ux(1,:) = -p(1,:)/rho/c;
8383+ux(end,:) = p(end,:)/rho/c;
8484+uy(:,1) = -p(:,1)/rho/c;
8585+uy(:,end) = p(:,end)/rho/c;
8686+8787+%% PAR�METROS DIFUSOR QRD
8888+% Dimensiones
8989+lambdad = c/fd; % Longitud de onda (profundidad) [m]
9090+lambdaw = c/fw; % Longitud de onda (ancho) [m]
9191+wide = lambdaw/2; % Ancho de cavidad [m]
9292+widedh = round(wide/dh);
9393+% Vector de profundidades
9494+n0 = ceil(N/2); % Offset para centrar las secuencias
9595+n = ceil((1:N))-(n0);
9696+sn = mod(n.^2,N);
9797+dn = (sn.*lambdad)/(N*2); % Profundidades [m]
9898+% Otros
9999+offsetdh = round(wide*(N/2)/dh); % Para centrar la posici�n del difusor
100100+maxdh = round(max(dn)/dh); % Maxima profundidad
101101+centdh = round(lx/2/dh); % Centro del mapa
102102+103103+%% MASCARA DEL DIFUSOR
104104+mascdifusor = zeros(nx,ny); % Inicializaci�n de la mascara
105105+for n = 1:N+1
106106+ % Lineas verticales
107107+ mascdifusor( (widedh*(n-1))+1+centdh-offsetdh+nPML,(1:maxdh)+nPML ) = 1;
108108+ % L�neas horizontales
109109+ if n<=N
110110+ switch tipo
111111+ case 'plano'
112112+ dnh = 0; % Profundidad de la cavidad n
113113+ case 'difusor'
114114+ dnh = round(dn(n)/dh); % Profundidad de la cavidad n
115115+ end
116116+ xhor = (((widedh*(n-1)):(widedh*(n)) )+1+centdh-offsetdh)+nPML;
117117+ yhor = maxdh-dnh+nPML;
118118+ mascdifusor( xhor,yhor ) = 1;
119119+ end
120120+end
121121+% L�nea horizontal en la parte inferior del difusor
122122+mascdifusor( ((0:(widedh*N) )+1+centdh-offsetdh)+nPML,nPML ) = 1;
123123+% Diferenciaci�n de la mascara
124124+mascarax=1-(diff(mascdifusor).'~=0).';
125125+mascaray=1-(diff(mascdifusor.')~=0).';
126126+% Inversi�n de la mascara
127127+mascdifusor = 1-mascdifusor;
128128+129129+%% REPRESENTACION MASCARAS Y PML
130130+f = figure('Color',[1,1,1]);
131131+subplot(1,3,1),pcolor(((1:nx)-nPML)*dh,((1:ny)-nPML)*dh,mascdifusor'), hold on
132132+plot([0,0,nx-2*nPML,nx-2*nPML,0]*dh,[0,ny-2*nPML,ny-2*nPML,0,0]*dh,'r--','linewidth',2)
133133+shading flat, axis equal,axis([-nPML,nx-nPML,-nPML,ny-nPML]*dh),title('M�scara')
134134+subplot(1,3,2),pcolor(((1:nx-1)-nPML)*dh,((1:ny)-nPML)*dh,mascarax'), hold on
135135+plot([0,0,nx-2*nPML,nx-2*nPML,0]*dh,[0,ny-2*nPML,ny-2*nPML,0,0]*dh,'r--','linewidth',2)
136136+shading flat, axis equal,axis([-nPML,nx-nPML,-nPML,ny-nPML]*dh),title('M�scara en x')
137137+subplot(1,3,3),pcolor(((1:nx)-nPML)*dh,((1:ny-1)-nPML)*dh,mascaray'), hold on
138138+plot([0,0,nx-2*nPML,nx-2*nPML,0]*dh,[0,ny-2*nPML,ny-2*nPML,0,0]*dh,'r--','linewidth',2)
139139+shading flat, axis equal,axis([-nPML,nx-nPML,-nPML,ny-nPML]*dh),title('M�scara en y')
140140+fprintf('pulsa cualquier tecla para continuar');
141141+pause
142142+close(f)
143143+144144+%% Calculo
145145+fig1 = figure('Color',[1,1,1]);
146146+axis equal;axis([0,nx-nPML*2,0,ny-nPML*2]*dh)
147147+xlabel('X [m]'),ylabel('Y [m]')
148148+box on
149149+colormap(flipud(bone(256)))
150150+for tt=1:lenT
151151+ % Presion
152152+ px = px.*(1-gammax)-k*dt/dh*diff(ux).*mascdifusor;
153153+ py = py.*(1-gammay)-k*dt/dh*diff(uy')'.*mascdifusor;
154154+155155+ % Excitaci�n
156156+ px(posNx,posNy) = w(tt);
157157+ py(posNx,posNy) = w(tt);
158158+ p = px+py;
159159+160160+ % Velocidad
161161+ ux(2:nx,:) = ux(2:nx,:).*(1-gammaux(2:nx,:))-dt/rho/dh*diff(p).*mascarax;
162162+ uy(:,2:ny) = uy(:,2:ny).*(1-gammauy(:,2:ny))-dt/rho/dh*diff(p')'.*mascaray;
163163+164164+ % Representaci�n gr�fica
165165+ if tt/10==round(tt/10)
166166+ map = abs(p);
167167+ surface(((1:nx)-nPML)*dh,((1:ny)-nPML)*dh,abs(mascdifusor-1)'*5)
168168+ hold on
169169+ pcolor(((1:nx)-nPML)*dh,((1:ny)-nPML)*dh,map'), hold off
170170+ set(gca,'Clim',[0 0.5]);shading interp
171171+ title(['Tiempo = ' num2str(round((tt)*1000*dt)) ' ms']);
172172+ drawnow
173173+ end
174174+end