Skip to content

Commit

Permalink
Changing things...
Browse files Browse the repository at this point in the history
  • Loading branch information
sap8b committed Jul 30, 2021
1 parent dd6b00e commit 2956200
Showing 1 changed file with 114 additions and 112 deletions.
226 changes: 114 additions & 112 deletions DiffusionSimulators_2D_MatrixD.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,117 @@ public DiffusionSimulators_2D_MatrixD(
cf_2D.DValues[j, i] = D[j, i];
}
}

// ====================================
// Set-up the initial condition function and start establishing the initial composition field
// ===================================
this.I0 = I0;
C_Initial = I0(cf_2D.XPositionValues, cf_2D.YPositionValues);
// ====================================
// Set the boundary conditions and apply them to the initial composition field, if needed
// ====================================
int num_bounds = Boundary_Conditions.Length;
border_with_function = new BoundaryWithFunction[num_bounds];
RVector C0;
for (int i = 0; i < num_bounds; i++)
{
border_with_function[i] = new BoundaryWithFunction
{
BoundaryLocation = i switch
{
0 => BoundingBox.top,
1 => BoundingBox.right,
2 => BoundingBox.left,
3 => BoundingBox.bottom,
_ => BoundingBox.bottom,
},
TypeBC = Boundary_Conditions[i],
BoundaryFunction = bc_s[i]
};
switch (border_with_function[i].BoundaryLocation)
{
case BoundingBox.top:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[X.GetnRows - 1, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(ny - 2) + C0;
C_Initial.ReplaceRow(Ctab, ny - 1);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[X.GetnRows - 1, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(ny - 2) + C0;
C_Initial.ReplaceRow(Ctab, ny - 1);
}
break;
case BoundingBox.right:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, Y.GetnCols - 1];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(nx - 2) + C0;
C_Initial.ReplaceCol(Ctab, nx - 1);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, Y.GetnCols - 1];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(nx - 2) + C0;
C_Initial.ReplaceCol(Ctab, nx - 1);
}
break;
case BoundingBox.left:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(1) + C0;
C_Initial.ReplaceCol(Ctab, 0);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(1) + C0;
C_Initial.ReplaceCol(C0, 0);
}
break;
case BoundingBox.bottom:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(1) + C0;
C_Initial.ReplaceRow(Ctab, 0);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(1) + C0;
C_Initial.ReplaceRow(Ctab, 0);
}
break;
}
}
// ====================================
// Create the solver method matrices
// ====================================
Expand All @@ -98,6 +209,7 @@ public DiffusionSimulators_2D_MatrixD(
A_explicit = new TridiagonalMatrix[nx];
B_row = new TridiagonalMatrix[nx];
B_col = new TridiagonalMatrix[nx];

NeumannBCs_L_A = new double[nx];
NeumannBCs_R_A = new double[nx];

Expand Down Expand Up @@ -127,7 +239,7 @@ public DiffusionSimulators_2D_MatrixD(
//================================================
// A Matrix first
//================================================
#region A
#region A_explicit
D_plus = 0.5 * (D1 + D0);
main0[start_idx1] = 1.0 - 2.0 * D_plus * nu0;
NeumannBCs_L_A[i] = 1.0 - D_plus * nu0;
Expand Down Expand Up @@ -227,117 +339,6 @@ public DiffusionSimulators_2D_MatrixD(
#endregion
}

// ====================================
// Set-up the initial condition function and start establishing the initial composition field
// ===================================
this.I0 = I0;
C_Initial = I0(cf_2D.XPositionValues, cf_2D.YPositionValues);
// ====================================
// Set the boundary conditions and apply them to the initial composition field, if needed
// ====================================
int num_bounds = Boundary_Conditions.Length;
border_with_function = new BoundaryWithFunction[num_bounds];
RVector C0;
for (int i = 0; i < num_bounds; i++)
{
border_with_function[i] = new BoundaryWithFunction
{
BoundaryLocation = i switch
{
0 => BoundingBox.top,
1 => BoundingBox.right,
2 => BoundingBox.left,
3 => BoundingBox.bottom,
_ => BoundingBox.bottom,
},
TypeBC = Boundary_Conditions[i],
BoundaryFunction = bc_s[i]
};
switch (border_with_function[i].BoundaryLocation)
{
case BoundingBox.top:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[X.GetnRows - 1, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(ny - 2) + C0;
C_Initial.ReplaceRow(Ctab, ny - 1);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[X.GetnRows - 1, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(ny - 2) + C0;
C_Initial.ReplaceRow(Ctab, ny - 1);
}
break;
case BoundingBox.right:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, Y.GetnCols - 1];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(nx - 2) + C0;
C_Initial.ReplaceCol(Ctab, nx - 1);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, Y.GetnCols - 1];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(nx - 2) + C0;
C_Initial.ReplaceCol(Ctab, nx - 1);
}
break;
case BoundingBox.left:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(1) + C0;
C_Initial.ReplaceCol(Ctab, 0);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = Y.GetColVector(0);
border_with_function[i].PositionFixed = X[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetColVector(1) + C0;
C_Initial.ReplaceCol(C0, 0);
}
break;
case BoundingBox.bottom:
if (border_with_function[i].TypeBC == ABoundaryCondition.dirichlet)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(1) + C0;
C_Initial.ReplaceRow(Ctab, 0);
}
else if (border_with_function[i].TypeBC == ABoundaryCondition.neumann)
{
border_with_function[i].PositionVaries = X.GetRowVector(X.GetnRows - 1);
border_with_function[i].PositionFixed = Y[0, 0];
C0 = border_with_function[i].BoundaryFunction(0.0, border_with_function[i].PositionVaries, border_with_function[i].PositionFixed);

RVector Ctab = C_Initial.GetRowVector(1) + C0;
C_Initial.ReplaceRow(Ctab, 0);
}
break;
}
}

gxt_function = g;
Chat_mode = Tmode;
b_filename = base_filename;
Expand Down Expand Up @@ -407,6 +408,7 @@ public void Solve(int n_time_steps, int output_interval)
RVector xold;
if (t == 0) { xold = C_Initial.GetRowVector(i, start_idx2, nx_less1); }
else { xold = C_Im2.GetRowVector(i, start_idx2, nx_less1); }

if (BCs_Functions[2].TypeBC == ABoundaryCondition.neumann) { holdA0 = A_explicit[i][start_idx1, start_idx1]; A_explicit[i][start_idx1, start_idx1] = NeumannBCs_L_A[i]; }
if (BCs_Functions[1].TypeBC == ABoundaryCondition.neumann) { holdA1 = A_explicit[i][end_idx1, end_idx1]; A_explicit[i][end_idx1, end_idx1] = NeumannBCs_R_A[i]; }

Expand Down

0 comments on commit 2956200

Please sign in to comment.