Mercurial > repos > public > sbplib
annotate +scheme/Schrodinger2dCurve.m @ 708:acb58769610e feature/quantumTriangles
fixed error in diffOp
author | Ylva Rydin <ylva.rydin@telia.com> |
---|---|
date | Tue, 21 Nov 2017 16:51:51 +0100 |
parents | e89715fe6a6e |
children | f004b9e9d17a |
rev | line source |
---|---|
490 | 1 classdef Schrodinger2dCurve < scheme.Scheme |
2 properties | |
3 m % Number of points in each direction, possibly a vector | |
4 h % Grid spacing | |
5 | |
6 grid | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
7 xm, ym |
490 | 8 |
9 order % Order accuracy for the approximation | |
10 | |
11 D % non-stabalized scheme operator | |
12 M % Derivative norm | |
13 H % Discrete norm | |
14 Hi | |
15 H_u, H_v % Norms in the x and y directions | |
16 Hu,Hv % Kroneckerd norms. 1'*Hx*v corresponds to integration in the x dir. | |
17 Hi_u, Hi_v | |
18 Hiu, Hiv | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
19 D1_v, D1_u |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
20 D2_v, D2_u |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
21 Du, Dv |
492
6b95a894cbd7
fixed a bug in the metric coefficients but something is wrong at the boundaries
Ylva Rydin <ylva.rydin@telia.com>
parents:
491
diff
changeset
|
22 x,y |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
23 b1, b2 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
24 b1_u,b2_v |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
25 DU, DV, DUU, DUV, DVU, DVV |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
26 |
490 | 27 e_w, e_e, e_s, e_n |
28 du_w, dv_w | |
29 du_e, dv_e | |
30 du_s, dv_s | |
31 du_n, dv_n | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
32 g_1, g_2 |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
33 c |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
34 ind |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
35 t_up |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
36 |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
37 a11, a12, a22 |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
38 m_tot, m_u, m_v |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
39 p |
518 | 40 Ji, J |
698 | 41 Hamiltonian |
490 | 42 end |
43 | |
44 methods | |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
45 function obj = Schrodinger2dCurve(g ,order, opSet,p) |
490 | 46 default_arg('opSet',@sbp.D2Variable); |
47 default_arg('c', 1); | |
48 | |
49 obj.p=p; | |
50 obj.c=1; | |
51 | |
52 m = g.size(); | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
53 obj.m_u = m(1); |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
54 obj.m_v = m(2); |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
55 obj.m_tot = g.N(); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
56 obj.grid=g; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
57 |
490 | 58 h = g.scaling(); |
59 h_u = h(1); | |
60 h_v = h(2); | |
61 | |
62 % Operators | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
63 ops_u = opSet(obj.m_u, {0, 1}, order); |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
64 ops_v = opSet(obj.m_v, {0, 1}, order); |
490 | 65 |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
66 I_u = speye(obj.m_u); |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
67 I_v = speye(obj.m_v); |
490 | 68 |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
69 obj.D1_u = ops_u.D1; |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
70 obj.D2_u = ops_u.D2; |
698 | 71 |
490 | 72 H_u = ops_u.H; |
73 Hi_u = ops_u.HI; | |
74 e_l_u = ops_u.e_l; | |
75 e_r_u = ops_u.e_r; | |
76 d1_l_u = ops_u.d1_l; | |
77 d1_r_u = ops_u.d1_r; | |
78 | |
79 obj.D1_v = ops_v.D1; | |
80 obj.D2_v = ops_v.D2; | |
81 H_v = ops_v.H; | |
82 Hi_v = ops_v.HI; | |
83 e_l_v = ops_v.e_l; | |
84 e_r_v = ops_v.e_r; | |
85 d1_l_v = ops_v.d1_l; | |
86 d1_r_v = ops_v.d1_r; | |
87 | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
88 obj.Du = kr(obj.D1_u,I_v); |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
89 obj.Dv = kr(I_u,obj.D1_v); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
90 |
490 | 91 obj.H = kr(H_u,H_v); |
92 obj.Hi = kr(Hi_u,Hi_v); | |
93 obj.Hu = kr(H_u,I_v); | |
94 obj.Hv = kr(I_u,H_v); | |
95 obj.Hiu = kr(Hi_u,I_v); | |
96 obj.Hiv = kr(I_u,Hi_v); | |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
97 |
490 | 98 obj.e_w = kr(e_l_u,I_v); |
99 obj.e_e = kr(e_r_u,I_v); | |
100 obj.e_s = kr(I_u,e_l_v); | |
101 obj.e_n = kr(I_u,e_r_v); | |
102 obj.du_w = kr(d1_l_u,I_v); | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
103 obj.dv_w = (obj.e_w'*obj.Dv)'; |
694
1157375c678a
Add oposit jacobian to penalty term
Ylva Rydin <ylva.rydin@telia.com>
parents:
520
diff
changeset
|
104 obj.du_e = kr(d1_r_u,I_v); |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
105 obj.dv_e = (obj.e_e'*obj.Dv)'; |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
106 obj.du_s = (obj.e_s'*obj.Du)'; |
490 | 107 obj.dv_s = kr(I_u,d1_l_v); |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
108 obj.du_n = (obj.e_n'*obj.Du)'; |
490 | 109 obj.dv_n = kr(I_u,d1_r_v); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
110 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
111 obj.DUU = sparse(obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
112 obj.DVV = sparse(obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
113 obj.ind = grid.funcToMatrix(obj.grid, 1:obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
114 |
490 | 115 obj.m = m; |
116 obj.h = [h_u h_v]; | |
117 obj.order = order; | |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
118 obj.D = @(t)obj.d_fun(t); |
698 | 119 obj.Hamiltonian = @(t)obj.h_fun(t); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
120 obj.variable_update(0); |
490 | 121 end |
122 | |
698 | 123 function [D,n] = d_fun(obj,t) |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
124 % obj.update_vairables(t); In driscretization? |
515 | 125 % D = obj.Ji*(-1/2*(obj.b1*obj.Du-obj.b1_u+obj.Du*obj.b1) - |
126 % 1/2*(obj.b2*obj.Dv - obj.b2_v +obj.Dv*obj.b2) + | |
127 % 1i*obj.c^2*(obj.DUU + obj.DUV + obj.DVU + obj.DVV)); (ols | |
128 % not skew sym disc | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
129 |
520
f235284e2eb1
changed sign in penalty parameter
Ylva Rydin <ylva.rydin@telia.com>
parents:
519
diff
changeset
|
130 D = sqrt(obj.Ji)*(-1/2*(obj.b1*obj.Du + obj.Du*obj.b1) - 1/2*(obj.b2*obj.Dv + obj.Dv*obj.b2) + 1i*obj.c^2*(obj.DUU + obj.DUV + obj.DVU + obj.DVV))*sqrt(obj.Ji); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
131 end |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
132 |
701
e89715fe6a6e
add imaginary part to closure in hamiltonian
Ylva Rydin <ylva.rydin@telia.com>
parents:
700
diff
changeset
|
133 function [Hamiltonian] = h_fun(obj,t) |
e89715fe6a6e
add imaginary part to closure in hamiltonian
Ylva Rydin <ylva.rydin@telia.com>
parents:
700
diff
changeset
|
134 Hamiltonian = -sqrt(obj.Ji)*(obj.c^2*(obj.DUU + obj.DUV + obj.DVU + obj.DVV))*sqrt(obj.Ji); |
698 | 135 end |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
136 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
137 function [D ]= variable_update(obj,t) |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
138 % Metric derivatives |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
139 if(obj.t_up == t) |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
140 return |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
141 else |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
142 ti = parametrization.Ti.points(obj.p{1}(t),obj.p{2}(t),obj.p{3}(t),obj.p{4}(t)); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
143 ti_tau = parametrization.Ti.points(obj.p{5}(t),obj.p{6}(t),obj.p{7}(t),obj.p{8}(t)); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
144 lcoords=points(obj.grid); |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
145 [obj.xm,obj.ym]= ti.map(lcoords(1:obj.m_v:end,1),lcoords(1:obj.m_v,2)); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
146 [x_tau,y_tau]= ti_tau.map(lcoords(1:obj.m_v:end,1),lcoords(1:obj.m_v,2)); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
147 x = reshape(obj.xm,obj.m_tot,1); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
148 y = reshape(obj.ym,obj.m_tot,1); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
149 obj.x = x; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
150 obj.y = y; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
151 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
152 x_tau = reshape(x_tau,obj.m_tot,1); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
153 y_tau = reshape(y_tau,obj.m_tot,1); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
154 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
155 x_u = obj.Du*x; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
156 x_v = obj.Dv*x; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
157 y_u = obj.Du*y; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
158 y_v = obj.Dv*y; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
159 |
500 | 160 J = (x_u.*y_v - x_v.*y_u); |
518 | 161 obj.J = spdiags(J, 0, obj.m_tot, obj.m_tot); |
500 | 162 |
163 Ji = spdiags(1./J, 0, obj.m_tot, obj.m_tot); | |
164 obj.Ji = Ji; | |
165 | |
166 a11 = Ji* (x_v.^2 + y_v.^2); | |
167 a12 = -Ji* (x_u.*x_v + y_u.*y_v); | |
168 a22 = Ji* (x_u.^2 + y_u.^2); | |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
169 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
170 obj.a11 = a11; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
171 obj.a12 = a12; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
172 obj.a22 = a22; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
173 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
174 % Assemble full operators |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
175 L_12 = spdiags(a12, 0, obj.m_tot, obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
176 obj.DUV = obj.Du*L_12*obj.Dv; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
177 obj.DVU = obj.Dv*L_12*obj.Du; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
178 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
179 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
180 for i = 1:obj.m_v |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
181 D = obj.D2_u(a11(obj.ind(:,i))); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
182 p = obj.ind(:,i); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
183 obj.DUU(p,p) = D; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
184 end |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
185 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
186 for i = 1:obj.m_u |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
187 D = obj.D2_v(a22(obj.ind(i,:))); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
188 p = obj.ind(i,:); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
189 obj.DVV(p,p) = D; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
190 end |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
191 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
192 obj.g_1 = x_v.*y_tau-x_tau.*y_v; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
193 obj.g_2 = x_tau.*y_u - y_tau.*x_u; |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
194 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
195 obj.b1 = spdiags(obj.g_1, 0, obj.m_tot, obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
196 obj.b2 = spdiags(obj.g_2, 0, obj.m_tot, obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
197 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
198 obj.b1_u = spdiags(obj.Du*obj.g_1, 0, obj.m_tot, obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
199 obj.b2_v = spdiags(obj.Dv*obj.g_2, 0, obj.m_tot, obj.m_tot); |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
200 obj.t_up=t; |
490 | 201 end |
202 end | |
203 | |
204 % Closure functions return the opertors applied to the own doamin to close the boundary | |
516
afff85574ddb
Changed the penalty on the first derivative penalty terms, did not solve the problem
Ylva Rydin <ylva.rydin@telia.com>
parents:
515
diff
changeset
|
205 |
490 | 206 % Penalty functions return the opertors to force the solution. In the case of an interface it returns the operator applied to the other doamin. |
207 % boundary is a string specifying the boundary e.g. 'l','r' or 'e','w','n','s'. | |
208 % type is a string specifying the type of boundary condition if there are several. | |
209 % data is a function returning the data that should be applied at the boundary. | |
210 % neighbour_scheme is an instance of Scheme that should be interfaced to. | |
211 % neighbour_boundary is a string specifying which boundary to interface to. | |
700 | 212 function [closure, penalty,closureHamiltonian,penaltyHamiltonian] = boundary_condition(obj, boundary,~) |
499
f1465e6aeb26
Commit before changing branch
Ylva Rydin <ylva.rydin@telia.com>
parents:
498
diff
changeset
|
213 [e, d_n, d_t, coeff_t, coeff_n s, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t,g] = obj.get_boundary_ops(boundary); |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
214 a_t = @(t) spdiag(coeff_t(t)); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
215 a_n = @(t) spdiag(coeff_n(t)); |
708 | 216 boundary |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
217 |
499
f1465e6aeb26
Commit before changing branch
Ylva Rydin <ylva.rydin@telia.com>
parents:
498
diff
changeset
|
218 F = @(t)(s * a_n(t)*d_n' + s * a_t(t) *d_t')'; |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
219 tau1 = 1; |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
220 a = @(t)spdiag(g(t)); |
517 | 221 tau2 = @(t) (1*s*a(t))/2; |
490 | 222 |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
223 penalty_parameter_1 = @(t) 1*1i*halfnorm_inv_n*halfnorm_inv_t*F(t)*e'*halfnorm_t*e; |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
224 penalty_parameter_2 = @(t) halfnorm_inv_n*e*tau2(t); |
490 | 225 |
515 | 226 closure = @(t) sqrt(obj.Ji)*(obj.c^2 * penalty_parameter_1(t)*e' + penalty_parameter_2(t)*e')*sqrt(obj.Ji); |
520
f235284e2eb1
changed sign in penalty parameter
Ylva Rydin <ylva.rydin@telia.com>
parents:
519
diff
changeset
|
227 penalty = @(t) -sqrt(obj.Ji)*(obj.c^2 * penalty_parameter_1(t)*e' + penalty_parameter_2(t)*e')*sqrt(obj.Ji); |
700 | 228 |
701
e89715fe6a6e
add imaginary part to closure in hamiltonian
Ylva Rydin <ylva.rydin@telia.com>
parents:
700
diff
changeset
|
229 closureHamiltonian = @(t) 1i*sqrt(obj.Ji)*(obj.c^2 * penalty_parameter_1(t)*e')*sqrt(obj.Ji); |
e89715fe6a6e
add imaginary part to closure in hamiltonian
Ylva Rydin <ylva.rydin@telia.com>
parents:
700
diff
changeset
|
230 penaltyHamiltonian = @(t) -1i*sqrt(obj.Ji)*(obj.c^2 * penalty_parameter_1(t)*e')*sqrt(obj.Ji); |
490 | 231 |
232 end | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
233 |
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
234 function [closure, penalty] = interface(obj,boundary,neighbour_scheme,neighbour_boundary) |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
235 % u denotes the solution in the own domain |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
236 % v denotes the solution in the neighbour domain |
694
1157375c678a
Add oposit jacobian to penalty term
Ylva Rydin <ylva.rydin@telia.com>
parents:
520
diff
changeset
|
237 [e_u, d_n_u, d_t_u, coeff_t_u, coeff_n_u,s_u, halfnorm_inv_u_n, halfnorm_inv_u_t, halfnorm_u_t,gamm_u,Ji_u] = obj.get_boundary_ops(boundary); |
1157375c678a
Add oposit jacobian to penalty term
Ylva Rydin <ylva.rydin@telia.com>
parents:
520
diff
changeset
|
238 [e_v, d_n_v, d_t_v, coeff_t_v, coeff_n_v s_v, halfnorm_inv_v_n, halfnorm_inv_v_t, halfnorm_v_t,gamm_v,Ji_v] = neighbour_scheme.get_boundary_ops(neighbour_boundary); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
239 |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
240 a_n_u = @(t) spdiag(coeff_n_u(t)); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
241 a_t_u = @(t) spdiag(coeff_t_u(t)); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
242 a_n_v = @(t) spdiag(coeff_n_v(t)); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
243 a_t_v = @(t) spdiag(coeff_t_v(t)); |
499
f1465e6aeb26
Commit before changing branch
Ylva Rydin <ylva.rydin@telia.com>
parents:
498
diff
changeset
|
244 |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
245 |
499
f1465e6aeb26
Commit before changing branch
Ylva Rydin <ylva.rydin@telia.com>
parents:
498
diff
changeset
|
246 F_u = @(t)(a_n_u(t)*d_n_u' + a_t_u(t)*d_t_u')'; |
f1465e6aeb26
Commit before changing branch
Ylva Rydin <ylva.rydin@telia.com>
parents:
498
diff
changeset
|
247 F_v = @(t)(a_n_v(t)*d_n_v' + a_t_v(t)*d_t_v')'; |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
248 |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
249 a = @(t)spdiag(gamm_u(t)); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
250 |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
251 tau = s_u*1*1i/2; |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
252 sig = -s_u*1*1i/2; |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
253 gamm = @(t) (-s_u*a(t))/2; |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
254 |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
255 penalty_parameter_1 = @(t) halfnorm_inv_u_n*(tau*halfnorm_inv_u_t*F_u(t)*e_u'*halfnorm_u_t*e_u); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
256 penalty_parameter_2 = @(t) halfnorm_inv_u_n * e_u * (sig ); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
257 penalty_parameter_3 = @(t) halfnorm_inv_u_n * e_u * (gamm(t) ); |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
258 |
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
259 |
708 | 260 closure =@(t) sqrt(Ji_u)*obj.c^2 * ( penalty_parameter_1(t)*e_u'... |
261 + penalty_parameter_2(t)*F_u(t)' + penalty_parameter_3(t)*e_u')*sqrt(Ji_u); | |
262 penalty =@(t) sqrt(Ji_u)*obj.c^2 * ( -penalty_parameter_1(t)*e_v'... | |
263 - penalty_parameter_2(t)*F_v(t)' - penalty_parameter_3(t)*e_v')*sqrt(Ji_v); | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
264 end |
490 | 265 |
497
4905446f165e
Added 2D interface to shrodinger
Ylva Rydin <ylva.rydin@telia.com>
parents:
493
diff
changeset
|
266 |
695
ba0d31ce4121
Changed jacobian at right side of the penalty term in 2D, seems like it is working
Ylva Rydin <ylva.rydin@telia.com>
parents:
694
diff
changeset
|
267 function [e, d_n, d_t, coeff_t,coeff_n, s, halfnorm_inv_n, halfnorm_inv_t, halfnorm_t,g,Ji] = get_boundary_ops(obj, boundary) |
490 | 268 |
269 % gridMatrix = zeros(obj.m(2),obj.m(1)); | |
270 % gridMatrix(:) = 1:numel(gridMatrix); | |
271 | |
272 ind = grid.funcToMatrix(obj.grid, 1:prod(obj.m)); | |
273 | |
274 switch boundary | |
275 case 'w' | |
276 e = obj.e_w; | |
277 d_n = obj.du_w; | |
278 d_t = obj.dv_w; | |
279 s = -1; | |
280 | |
281 I = ind(1,:); | |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
282 coeff_t = @(t)obj.a12(I); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
283 coeff_n =@(t) obj.a11(I); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
284 g = @(t)obj.g_1(I); |
490 | 285 case 'e' |
286 e = obj.e_e; | |
287 d_n = obj.du_e; | |
288 d_t = obj.dv_e; | |
289 s = 1; | |
290 | |
291 I = ind(end,:); | |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
292 coeff_t = @(t)obj.a12(I); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
293 coeff_n = @(t)obj.a11(I); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
294 g = @(t)obj.g_1(I); |
490 | 295 case 's' |
296 e = obj.e_s; | |
297 d_n = obj.dv_s; | |
298 d_t = obj.du_s; | |
299 s = -1; | |
300 | |
301 I = ind(:,1)'; | |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
302 coeff_t = @(t)obj.a12(I); |
499
f1465e6aeb26
Commit before changing branch
Ylva Rydin <ylva.rydin@telia.com>
parents:
498
diff
changeset
|
303 coeff_n = @(t)obj.a22(I); |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
304 g = @(t)obj.g_2(I); |
490 | 305 case 'n' |
306 e = obj.e_n; | |
307 d_n = obj.dv_n; | |
308 d_t = obj.du_n; | |
309 s = 1; | |
310 | |
311 I = ind(:,end)'; | |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
312 coeff_t = @(t)obj.a12(I); |
499
f1465e6aeb26
Commit before changing branch
Ylva Rydin <ylva.rydin@telia.com>
parents:
498
diff
changeset
|
313 coeff_n = @(t)obj.a22(I); |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
314 g = @(t)obj.g_2(I); |
490 | 315 otherwise |
316 error('No such boundary: boundary = %s',boundary); | |
317 end | |
318 | |
319 switch boundary | |
320 case {'w','e'} | |
321 halfnorm_inv_n = obj.Hiu; | |
322 halfnorm_inv_t = obj.Hiv; | |
323 halfnorm_t = obj.Hv; | |
491
26125cfefe11
Schrodinger 2d runs without exploding with fixed coordinates
Ylva Rydin <ylva.rydin@telia.com>
parents:
490
diff
changeset
|
324 |
490 | 325 case {'s','n'} |
326 halfnorm_inv_n = obj.Hiv; | |
327 halfnorm_inv_t = obj.Hiu; | |
328 halfnorm_t = obj.Hu; | |
329 end | |
694
1157375c678a
Add oposit jacobian to penalty term
Ylva Rydin <ylva.rydin@telia.com>
parents:
520
diff
changeset
|
330 Ji = obj.Ji; |
490 | 331 end |
332 | |
333 function N = size(obj) | |
334 N = prod(obj.m); | |
335 end | |
336 end | |
498
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
337 methods(Static) |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
338 % Calculates the matrcis need for the inteface coupling between boundary bound_u of scheme schm_u |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
339 % and bound_v of scheme schm_v. |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
340 % [uu, uv, vv, vu] = inteface_couplong(A,'r',B,'l') |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
341 function [uu, uv, vv, vu] = interface_coupling(schm_u,bound_u,schm_v,bound_v) |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
342 [uu,uv] = schm_u.interface(bound_u,schm_v,bound_v); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
343 [vv,vu] = schm_v.interface(bound_v,schm_u,bound_u); |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
344 end |
324c927d8b1d
chnaged sbp interfacein 1d among many things
Ylva Rydin <ylva.rydin@telia.com>
parents:
497
diff
changeset
|
345 end |
490 | 346 end |