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