changeset 908:ecfccf236af0 feature/utux2D

Add helper function nonConformingInterfaceOptions that creates an InterfaceOptions object that specifies which interpolation operators are used where.
author Martin Almquist <malmquist@stanford.edu>
date Fri, 23 Nov 2018 20:14:16 -0800
parents c0652621bd69
children ab1759166a8c
files +multiblock/nonConformingInterfaceOptions.m
diffstat 1 files changed, 93 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
diff -r c0652621bd69 -r ecfccf236af0 +multiblock/nonConformingInterfaceOptions.m
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+multiblock/nonConformingInterfaceOptions.m	Fri Nov 23 20:14:16 2018 -0800
@@ -0,0 +1,93 @@
+% g: 			multiblock grid
+% order:		cell array of the orders of accuracy used in the different blocks,
+%				or a scalar for the same order everywhere.
+% interpOpSet:  string, e.g 'MC' or 'AWW' The same interpOpSet is used everywhere.
+%
+% Returns an InterfaceOptions object that can be used as the 'interfaceOptions' argument to multiblock.DiffOp
+function options = nonConformingInterfaceOptions(g, orders, interpOpSet)
+default_arg(interpOpSet, 'AWW');
+nBlocks = g.nBlocks;
+conn = g.connections;
+
+% If order is a scalar, the same order is used in all blocks
+if ~iscell(orders)
+	o = orders;
+	orders = cell(1,nBlocks);
+	for i = 1:nBlocks
+		orders{i} = o;
+	end
+end
+
+interpOpts = cell(nBlocks, nBlocks);
+for i = 1:nBlocks
+	for j = 1:nBlocks
+		intf = conn{i,j};
+        if isempty(intf)
+            continue
+        end
+
+        mi = length( g.getBoundary({i, intf{1}}) ) - 1;
+    	mj = length( g.getBoundary({j, intf{2}}) ) - 1;
+
+		if mi == mj
+			% Matching grids, no interpolation required (presumably)
+			continue;
+		elseif mi/mj == 2
+			% Block i is finer
+
+			switch interpOpSet
+			case 'MC'
+				interpOpSet = sbp.InterpMC(mi, mj, orders{i}, orders{j});
+				I_i2j_good = interpOpSet.IF2C;
+                I_i2j_bad = interpOpSet.IF2C;
+                I_j2i_good = interpOpSet.IC2F;
+                I_j2i_bad = interpOpSet.IC2F;
+
+            case 'AWW'
+            	interpOpSetF2C = sbp.InterpAWW(mi+1, mj+1, orders{i}, orders{j}, 'F2C');
+            	interpOpSetC2F = sbp.InterpAWW(mi+1, mj+1, orders{i}, orders{j}, 'C2F');
+				I_i2j_good = interpOpSetF2C.IF2C;
+                I_i2j_bad = interpOpSetC2F.IF2C;
+                I_j2i_good = interpOpSetC2F.IC2F;
+                I_j2i_bad = interpOpSetF2C.IC2F;
+            end
+
+		elseif mj/mi == 2
+			% Block j is finer
+
+			switch interpOpSet
+			case 'MC'
+				interpOpSet = sbp.InterpMC(mi+1, mj+1, orders{i}, orders{j});
+				I_i2j_good = interpOpSet.IC2F;
+                I_i2j_bad = interpOpSet.IC2F;
+                I_j2i_good = interpOpSet.IF2C;
+                I_j2i_bad = interpOpSet.IF2C;
+
+            case 'AWW'
+            	interpOpSetF2C = sbp.InterpAWW(mi+1, mj+1, orders{i}, orders{j}, 'F2C');
+            	interpOpSetC2F = sbp.InterpAWW(mi+1, mj+1, orders{i}, orders{j}, 'C2F');
+				I_i2j_good = interpOpSetC2F.IC2F;
+                I_i2j_bad = interpOpSetF2C.IC2F;
+                I_j2i_good = interpOpSetF2C.IF2C;
+                I_j2i_bad = interpOpSetC2F.IF2C;
+            end
+		else
+			error(sprintf('Interpolation operators for grid ratio %f have not yet been constructed', mi/mj));
+		end
+
+		interpOpts{i,j} = cell(2,1);
+		interpOpts{i,j}{1}.I_local2neighbor.good = I_i2j_good;
+		interpOpts{i,j}{1}.I_local2neighbor.bad = I_i2j_bad;
+		interpOpts{i,j}{1}.I_neighbor2local.good = I_j2i_good;
+		interpOpts{i,j}{1}.I_neighbor2local.bad = I_j2i_bad;
+
+		interpOpts{i,j}{2}.I_local2neighbor.good = I_j2i_good;
+		interpOpts{i,j}{2}.I_local2neighbor.bad = I_j2i_bad;
+		interpOpts{i,j}{2}.I_neighbor2local.good = I_i2j_good;
+		interpOpts{i,j}{2}.I_neighbor2local.bad = I_i2j_bad;
+
+		options = multiblock.InterfaceOptions(g, interpOpts);
+
+	end
+end
+