Mercurial > repos > public > sbplib
diff +scheme/Schrodinger1dCurve.m @ 429:dde5760863de feature/quantumTriangles
Added a scheme for the time deforming shrodinger equation in 1d
author | Ylva Rydin <ylva.rydin@telia.com> |
---|---|
date | Mon, 06 Feb 2017 09:54:18 +0100 |
parents | |
children | 25053554524b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/+scheme/Schrodinger1dCurve.m Mon Feb 06 09:54:18 2017 +0100 @@ -0,0 +1,162 @@ +classdef Schrodinger1dCurve < scheme.Scheme + properties + m % Number of points in each direction, possibly a vector + h % Grid spacing + xi % Grid + order % Order accuracy for the approximation + grid + + D % non-stabalized scheme operator + H % Discrete norm + M % Derivative norm + alpha + + V_mat + D1 + D2 + Hi + e_l + e_r + d1_l + d1_r + gamm + end + + methods + % Solving SE in the form u_t = i*u_xx +i*V on deforming 1D domain; + function obj = Schrodinger1dCurve(m,order,V,constJi) + default_arg('V',0); + default_arg('constJi',false) + xilim={0 1}; + if constJi + ops = sbp.D2Standard(m,xilim,order); + else + ops = sbp.D4Variable(m,xilim,order); + end + + obj.xi=ops.x; + obj.h=ops.h; + obj.D2 = ops.D2; + obj.D1 = ops.D1; + obj.H = ops.H; + obj.Hi = ops.HI; + obj.M = ops.M; + obj.e_l = ops.e_l; + obj.e_r = ops.e_r; + obj.d1_l = ops.d1_l; + obj.d1_r = ops.d1_r; + + + if isa(V,'function_handle') + V_vec = V(obj.x); + else + V_vec = obj.xi*0 + V; + end + + obj.V_mat = spdiags(V_vec,0,m,m); + + obj.D = @(a,a_xi,Ji) obj.d_fun(a, a_xi, Ji, constJi); + + obj.m = m; + obj.order = order; + end + + + % Closure functions return the opertors appliedo to the own doamin to close the boundary + % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin. + % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. + % type is a string specifying the type of boundary condition if there are several. + % data is a function returning the data that should be applied at the boundary. + % neighbour_scheme is an instance of Scheme that should be interfaced to. + % neighbour_boundary is a string specifying which boundary to interface to. + + function [D] = d_fun(obj,a, a_xi , Ji , constJi) + if constJi + D= -0.5*(obj.D1*a - a_xi + a*obj.D1) + 1i*Ji*obj.D2 + 1i*obj.V_mat; + % D= -a*obj.D1 + 1i*Ji*obj.D2 + 1i*obj.V_mat; + else + D= -0.5*(obj.D1*a - a_xi + a*obj.D1) + 1i*obj.D2(diag(Ji)) + 1i*obj.V_mat; + % D= - a*obj.D1 + 1i*obj.D2(diag(Ji)) + 1i*obj.V_mat; +% D=-obj.D1*a - a_xi + 1i*obj.D2(diag(Ji)) + 1i*obj.V_mat; + end + end + + function [closure, penalty] = boundary_condition(obj,boundary,type,data) + default_arg('type','dirichlet'); + default_arg('data',0); + + [e,d,s,p] = obj.get_boundary_ops(boundary); + + switch type + % Dirichlet boundary condition + case {'D','d','dirichlet'} + tau1 = s * 1i*d; + tau2 = @(a) (-1*s*a(p,p) - abs(a(p,p)))/4*e; + closure = @(a) obj.Hi*tau1*e' + obj.Hi*tau2(a)*e'; + + switch class(data) + case 'double' + penalty = @(a) -(obj.Hi*tau1*data+obj.Hi*tau2(a)*data); + % case 'function_handle' + % penalty = @(t)-obj.Hi*tau*data(t); + otherwise + error('Wierd data argument!') + end + + % Unknown, boundary condition + otherwise + error('No such boundary condition: type = %s',type); + end + end + + function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) + % u denotes the solution in the own domain + % v denotes the solution in the neighbour domain + % [e_u,d_u,s_u] = obj.get_boundary_ops(boundary); + % [e_v,d_v,s_v] = neighbour_scheme.get_boundary_ops(neighbour_boundary); + + % a = -s_u* 1/2 * 1i ; + % b = a'; + + % tau = b*d_u; + % sig = -a*e_u; + + % closure = obj.Hi * (tau*e_u' + sig*d_u'); + % penalty = obj.Hi * (-tau*e_v' - sig*d_v'); + end + + % Ruturns the boundary ops and sign for the boundary specified by the string boundary. + % The right boundary is considered the positive boundary + function [e,d,s,p] = get_boundary_ops(obj,boundary) + switch boundary + case 'l' + e = obj.e_l; + d = obj.d1_l; + s = -1; + p=1; + case 'r' + e = obj.e_r; + d = obj.d1_r; + s = 1; + p=obj.m; + otherwise + error('No such boundary: boundary = %s',boundary); + end + end + + function N = size(obj) + N = obj.m; + end + + end + + methods(Static) + % Calculates the matrcis need for the inteface coupling between boundary bound_u of scheme schm_u + % and bound_v of scheme schm_v. + % [uu, uv, vv, vu] = inteface_couplong(A,'r',B,'l') + function [uu, uv, vv, vu] = interface_coupling(schm_u,bound_u,schm_v,bound_v) + [uu,uv] = schm_u.interface(bound_u,schm_v,bound_v); + [vv,vu] = schm_v.interface(bound_v,schm_u,bound_u); + end + end +end \ No newline at end of file