TITLE Example 12a.--Advective and diffusive transport of heat and solutes.
      Constant boundary condition at one end, closed at other.
      The problem is designed so that temperature should equal Na-conc 
      (in mmol/kgw) after diffusion. Compares with analytical solution
      for 20-cell and 60-cell models.
EXCHANGE_SPECIES
  Na+ + X- = NaX
    log_k       0.0
    -gamma      4.0     0.075
  H+ + X- = HX
    log_k       -99.
    -gamma      9.0     0.0
  K+ + X- = KX
    log_k       0.0
    -gamma       3.5     0.015
#
#   20-cell model, initial conditions
#
SOLUTION 0   Fixed temp 24C, and NaCl conc (first type boundary cond) at inlet
    units  mol/kgw
    temp 24
    pH  7.0
    pe  12.0   O2(g) -0.67
    Na  24.e-3
    Cl  24.e-3
SOLUTION 1-19   24.0 mM KNO3
    units mol/kgw
    temp  0                 # Incoming solution 0C
    pH    7.0
    pe   12.0   O2(g) -0.67
    K    24.e-3
    N(5) 24.e-3
EXCHANGE 1-19
    KX    0.048
SOLUTION 20  Same as soln 0 in cell 20 at closed column end (second type boundary cond)
    units  mol/kgw
    temp 24
    pH  7.0
    pe  12.0   O2(g) -0.67
    Na  24.e-3
    Cl  24.e-3
EXCHANGE 20
    NaX    0.048
PRINT
   -reset      false
   -echo_input true
   -status     false
COPY solution 20 58-60 # for 60-cell model   
COPY exchange 20 58-60 # for 60-cell model   
END
#
#   20-cell model, transport
#
TRANSPORT   # Diffuse 24C, NaCl solution from column ends
   -cells   20
   -shifts  1
   -flow_direction diffusion
   -boundary_conditions  constant  closed
   -lengths           20*1.0
   -thermal_diffusion 3.0        # Heat is retarded equal to Na
   -dispersivities    20*0.0        # No dispersion
   -diffusion_coefficient 0.3e-9 # m^2/s
   -time_step         1.0e+10    # 317 years, 19 substeps will be used
SELECTED_OUTPUT
   -file           ex12a.sel
   -high_precision true
   -reset          false
   -distance       true
   -temperature    true
USER_PUNCH
  -head Na_mmol K_mmol Cl_mmol error_Cl  error_Na
  10  PUNCH TOT("Na")*1000, TOT("K")*1000, TOT("Cl")*1000
#
#   Calculate deviation from analytical solution for Cl and Na
#
  20  x = DIST
  30  if (x > 8.5 OR SIM_TIME <= 0) THEN END
  40  IF (ABS(x MOD 0.5) > 1e-3) OR (TC <= 0) THEN END
  50  DATA 0.254829592, -0.284496736, 1.421413741, -1.453152027, 1.061405429, 0.3275911
  60  READ a1, a2, a3, a4, a5, a6
  70      REM  calculate error in Cl
  80  z = x / (2*SQRT(3e-10 * SIM_TIME / 1.0))
  90  GOSUB 2000 # erfc(z)...
  100 erfc_Cl = erfc
  110     REM  calculate error in Na, 3 times retarded
  120 z = z * SQRT(3.0)
  130 GOSUB 2000 # erfc(z)...
  140 erfc_Na = erfc
  150     REM punch results
  160 error_Cl = 0.024 * erfc_Cl - TOT("Cl")
  170 error_Na = 0.024 * erfc_Na - TOT("Na")
  180 PUNCH error_Cl, error_Na
  190     REM store results
  200 j = x - 0.5
  210 PUT(error_Cl, SIM_NO, j, 1) 
  220 PUT(error_Na, SIM_NO, j, 2) 
  500 END
  2000 REM calculate erfc...
  2050 b = 1 / (1 + a6 * z)
  2060 erfc = b * (a1 + b * (a2 + b * (a3 + b * (a4 + b * a5)))) * EXP(-(z * z))
  2080 RETURN

END
#
#   60-cell model, initial conditions, when not copied from 20-cell model
#
SELECTED_OUTPUT
   -active        false     # See also PRINT; selected_output false
SOLUTION 1-57   24.0 mM KNO3
    units mol/kgw
    temp  0                 # Incoming solution 0C
    pH    7.0
    pe   12.0   O2(g) -0.67
    K    24.e-3
    N(5) 24.e-3
EXCHANGE 1-57
    KX    0.048
END
#
#   60-cell model, transport
#
TRANSPORT  # no need to redefine parameters that don't change from 20 cell model
   -cells        60
   -lengths      60*0.33333333333333333
   -disp         60*0.0
   -punch_cells  1-60
SELECTED_OUTPUT
   -active        true      # See also PRINT; selected_output false
END
#
#   Print comparison with analytical solution for 
#   Cl and Na in 20-cell and 60-cell models
#
SOLUTION                    # Initial solution calculation for pure water
                            # A calculation is needed to invoke USER_PRINT
PRINT
   -reset      false        # Initial solution calculation not printed
   -echo_input true
   -user_print true
   -high_precision false    # formerly USER_PRINT precision controlled by SELECTED_OUTPUT
USER_PRINT
  10  PRINT "             Error in Cl concentration Error in Na concentration"
  20  PRINT "             ------------------------- -------------------------"    
  30  PRINT "    Distance      20-cell      60-cell      20-cell      60-cell"
  40  PRINT " "
  50  FOR j = 0 TO 8
  60    PRINT j + 0.5, GET(2, j, 1), GET(4, j, 1), GET(2, j, 2), GET(4, j, 2)
  70  NEXT j
END
