develop(Func inputs,Expr crystalGrowthConst,Expr activeLayerThickness,Expr developerConsumptionConst,Expr silverSaltConsumptionConst,Expr timestep)1 Func develop(Func inputs, Expr crystalGrowthConst,
2 Expr activeLayerThickness, Expr developerConsumptionConst,
3 Expr silverSaltConsumptionConst, Expr timestep) {
4
5 Expr cgc = crystalGrowthConst*timestep;
6 Expr dcc = 2.0f*developerConsumptionConst / ( activeLayerThickness*3.0f);
7 Expr sscc = silverSaltConsumptionConst * 2.0f;
8
9 Func dCrystalRad;
10 // Silver Salt Density
11 dCrystalRad(x,y,c) = inputs(x,y,DEVEL_CONC) * inputs(x,y,c+6) * cgc;
12
13 Func dCrystalVol;
14 // Crystal Radius Active Crystals
15 dCrystalVol(x,y,c) = dCrystalRad(x,y,c) * inputs(x,y,c) * inputs(x,y,c) * inputs(x,y,c+3);
16
17 Func outputs;
18 outputs(x,y,c) = select(
19 c == CRYSTAL_RAD_R , inputs(x,y,c) + dCrystalRad(x,y,0),
20 select(c == CRYSTAL_RAD_G , inputs(x,y,c) + dCrystalRad(x,y,1),
21 select(c == CRYSTAL_RAD_B , inputs(x,y,c) + dCrystalRad(x,y,2),
22
23 select(c == DEVEL_CONC , max(0,inputs(x,y,c) -
24 dcc*(dCrystalVol(x,y,0) + dCrystalVol(x,y,1) + dCrystalVol(x,y,2))),
25
26 select(c == SILVER_SALT_DEN_R, max(0,inputs(x,y,c) - sscc*dCrystalVol(x,y,0)),
27 select(c == SILVER_SALT_DEN_G, max(0,inputs(x,y,c) - sscc*dCrystalVol(x,y,1)),
28 select(c == SILVER_SALT_DEN_B, max(0,inputs(x,y,c) - sscc*dCrystalVol(x,y,2)),
29
30 //Otherwise (active crystals) output=input
31 inputs(x,y,c))))))));
32
33 Var x_outer, x_inner;
34 outputs.split(x,x_outer,x_inner,4).reorder(x_inner,c,x_outer,y)
35 .vectorize(x_inner).parallel(y);
36
37 dCrystalVol.split(x,x_outer,x_inner,4).store_at(outputs,x_outer)
38 .compute_at(outputs,x_outer).vectorize(x_inner);
39
40 dCrystalRad.split(x,x_outer,x_inner,4).store_at(outputs,x_outer)
41 .compute_at(outputs,x_outer).vectorize(x_inner);
42
43 return outputs;
44 }
45