Listing 1. Sample of a Complete SISAL Application

% heatflow-compute the temperature evolution in a rod
define heatflow type onec = array[character]; type onei = array[integer]; type oner = array[real]; global cdfcreate(filename: onec; seq: integer; comment: onec; returns integer) global cdfputdim(fh: integer; dimname: onec; dsize: integer; returns integer, integer) global cdfputrvar(fh: integer; varname: onec; dimlist: onei; data: oner; returns integer) global cdfclose(fh: integer; returns integer) function heatflow(nx, nt: integer; returns integer) let % do loop over time temp := for initial it := 0; % initialize the temperature distribution temp0 := array_fill(0 ,nx, 0.); temp1 := temp0[nx/2: 1.]; while (it < nt) repeat % time step the temperature otemp1 := old temp1; it := old it + 1; temp1 := for ix in 0,nx temp2 := if (ix = 0 | ix = nx) then 0. % keep the rod at temp = 0 on ends else 0.5*otemp1[ix] + 0.25*(otemp1[ix-1] + otemp1[ix + 1]) end if; returns array of temp2 end for; returns value of catenate temp1 end for; % define x and time dimensions x := for ix in 0,nx returns array of real(ix) end for; time := for it in 0,nt returns array of real(it) end for; % write the NetCDF file--x iterates most rapidly since % it is the inner loop, so x dimension should be last fh1 := cdfcreate("temp.nc", -1, "Temperature distribution in rod\n"); dhtime, fh2 := cdfputdim(fh1, "time", nt + 1); dhx, fh3 := cdfputdim(fh2, "x", nx + 1); fh4 := cdfputrvar(fh3, "time", array[0: dhtime], time); fh5 := cdfputrvar(fh4, "x", array[0: dhx], x); fh6 := cdfputrvar(fh5, "temperature", array[0: dhtime, dhx], temp); result := cdfclose(fh6); in result % return the dummy result so the NetCDF routines will be run end let end function