# "conditional" initial condition for pde

I'm trying to solve a set of coupled pde equations of functions C1[t,x], C2[t,x]. all works fine but I need to specify a conditional initial conditions of the form:

when (t=t.min)  {
C1 = if (x=x.min) 1 else 0
C2 = 0;


I've tried to set:

C1[0,x]==0, (C1[0, x] /. x -> 0) == 1


or use

WhenEvent


but in either case I got:

NDSolve::bcedge: Boundary condition C1[0,0]==0 is not specified on a single edge of the boundary of the computational domain.

Is there any way around it?

Many thanks,

This question is a part of the post at http://community.wolfram.com/groups/-/m/t/1313375

edited:

Thanks. The code is:

Fp = 0.016666667; Vp = 0.07; Wp = 0.94; Dp =
10^-18; PSg = 0.05; Visfp = 0.35; Disf = 10^-18; L = 0.1;

sol = NDSolve[{Derivative[1, 0][C1][t,
x] == -Fp*L/Vp*Derivative[0, 1][C1][t, x] -
PSg/Vp*(C1[t, x]/Wp - C2[t, x]) + Dp*Derivative[0, 2][C1][t, x],
Derivative[1, 0][C2][t, x] ==
PSg/Visfp*(C1[t, x]/Wp - C2[t, x]) +
Disf*Derivative[0, 2][C2][t, x], C1[t, 0] == Exp[-t],
C2[t, 0] == 0, C1[t, L] == 0, C2[t, L] == 0,
Derivative[0, 1][C1][t, 0] == 0, Derivative[0, 1][C2][t, 0] == 0,
Derivative[0, 1][C1][t, L] == 0, Derivative[0, 1][C2][t, L] == 0,
C1[0, x] == 1, C2[0, x] == 0}, {C1, C2}, {t, 0, 20}, {x, 0, L}]

Plot3D[Evaluate[C1[t, x] /. sol[]], {t, 0, 20}, {x, 0, L}]


I've tried:

\[Phi][x_] := Piecewise[{{1, x == 0.}, {0, x > 0}}];


but it freezes the kernel (calculations never stop).

The solution should look like: • Its hard to test without the exact set of equations you are solving, but you might try to put your condition in a Piecewise or UnitStep form. Apr 3, 2018 at 22:28

With a few changes we can get some answers.

Clear["Global*"]


Data

Fp = 0.016666667;
Vp = 0.07;
Wp = 0.94;
Dp = 10^-18;
PSg = 0.05;
Visfp = 0.35;
Disf = 10^-18;
L = 0.1;


PDE's

eq1 = Derivative[1, 0][C1][t, x] == -((Fp*L*Derivative[0, 1][C1][t, x])/Vp) -
(PSg*(C1[t, x]/Wp - C2[t, x]))/Vp + Dp*Derivative[0, 2][C1][t, x];

eq2 = Derivative[1, 0][C2][t, x] == (PSg*(C1[t, x]/Wp - C2[t, x]))/Visfp +
Disf*Derivative[0, 2][C2][t, x];


bc's and ic's

bc1 = C1[t, 0] == Exp[-t];
bc2 = C2[t, 0] == 0;
bc3 = C1[t, L] == 0;
bc4 = C2[t, L] == 0;
bc5 = Derivative[0, 1][C1][t, 0] == 0;
bc6 = Derivative[0, 1][C2][t, 0] == 0;
bc7 = Derivative[0, 1][C1][t, L] == 0;
bc8 = Derivative[0, 1][C2][t, L] == 0;
(*ic1=Piecewise[[{{1,x==0},{0,x>0}}];*)
ic1 = C1[0, x] == Exp[-10000*x];
ic2 = C2[0, x] == 0;


Note I have commented out the Piecewise condition. I got NDSolve to give answers with that ic, but the solution was fairly unstable and not satisfactory. I have replaced the ic with a steep exponential fn that closely approximates the ic you want. Numerical analysis by its very nature is approximate, and if you need to replace a sharply varying condition with a smoother function that is a reasonable approximation, that is a good idea. I do not use bc5 and bc6 because NDSolve can get those derivatives from the ic's making them redundant and with the exponential ic, bc5 is conflicting.

Continuing

sol = NDSolve[{eq1, eq2, bc1, bc2, bc3, bc4,(*bc5,bc6,*)bc7, bc8, ic1,
ic2}, {C1, C2}, {t, 0, 20}, {x, 0, L}];


Check our solution as to bc's and ic's

Plot[C1[0, x] /. sol[], {x, 0, L}, PlotRange -> All] Plot[C1[t, 0] /. sol[], {t, 0, 20}, PlotRange -> All] Plot[C2[0, x] /. sol[], {x, 0, L}] Plot[C2[t, 0] /. sol[], {t, 0, 20}] The bc's and ic's look numerically reasonable.

Plot3D[C1[t, x] /. sol[], {t, 0, 20}, {x, 0, L}, PlotRange -> All] Plot3D[C2[t, x] /. sol[], {t, 0, 20}, {x, 0, L}, PlotRange -> All]
` • thank you so much! this helps a lot. Apr 6, 2018 at 20:19