-
Notifications
You must be signed in to change notification settings - Fork 1
Automatic field creation
This tutorial regards to the automatic design of a north type heliostat field using the scripting editor of Tonatiuh++. The heliostat field regards to the PROTEAS heliostat facility of The Cyprus Institute that is sited on a coastal hilly terrain. Upon installation of Tonatiuh++, an examples folder will be also created in the installation directory. The video below shows a step-by-step video on how to use the script to automatically generate the field. The corresponding script is also given below.

Script var file = DataObject(); file.read("heliostats.csv");
function makeHeliostat(parent, name, position, aiming, focus) { var nm = parent.createNode(name); nm.setParameter("translation", position); nm.setParameter("rotation", "0 0 1 180");
var t = nm.createTracker(); t.setName("LF"); t.setPart("armature", hLF); var tt = t.getPart("target"); tt.setParameter("aimingPoint", aiming);
var n = nm.createNode("primary"); n = n.createNode("secondary"); n = n.createNode("facet"); n.setParameter("translation", "0 0.125 0"); n.setParameter("rotation", "1 0 0 -90");
var s = n.createShape();
var q = s.insertSurface("Parabolic"); q.setParameter("fX", focus); q.setParameter("fY", focus);
var p = s.insertProfile("Box"); p.setParameter("uSize", 2.25); p.setParameter("vSize", 2.25);
var m = s.insertMaterial("Specular"); m.setParameter("slope", "0.002");
var mG = s.getPart("material"); mG.setParameter("ambientColor", "0.65 0.72 0.79"); mG.setParameter("diffuseColor", "0.05 0.05 0.05"); mG.setParameter("specularColor", "0.3 0.25 0.2"); mG.setParameter("shininess", "0.5");
// pylon n = nm.createNode("pylon"); n.setParameter("scale", "0.05 0.05 1"); s = n.createShape(); m = s.insertMaterial("Transparent"); q = s.insertSurface("Cylinder"); p = s.insertProfile("Rectangular"); p.setParameter("vMin", 0.); p.setParameter("vMax", 1.5); var mG = s.getPart("material"); mG.setParameter("ambientColor", "0.5 0.5 0.5"); mG.setParameter("diffuseColor", "0.3 0.3 0.3"); mG.setParameter("specularColor", "0.2 0.2 0.2"); mG.setParameter("shininess", "0.1"); }
var node = NodeObject(); var t = node.createTracker(); var hLF = t.insertArmature("two-axes"); hLF.setParameter("primaryShift", "0 0.04 1.5"); hLF.setParameter("primaryAxis", "1 0 0"); hLF.setParameter("primaryAngles", "-90 90"); hLF.setParameter("secondaryShift", "0 0.175 0"); hLF.setParameter("secondaryAxis", "0 0 1"); hLF.setParameter("secondaryAngles", "-90 90"); hLF.setParameter("facetShift", "0 0.125 0"); hLF.setParameter("facetNormal", "0 1 0");
function makeTowerMaterial(shape) { var mG = shape.getPart("material"); mG.setParameter("ambientColor", "0.47 0.5 0.47"); mG.setParameter("diffuseColor", "0.45 0.45 0.45"); }
function makeTower(nT, xSize, ySize, zSize, zWindow) { var wall = 0.2;
n = nT.createNode("North"); n.setParameter("translation", "0 " + (-wall/2) + " " + (zSize - zWindow)/2); n.setParameter("scale", "" + xSize + " " + wall + " " + (zSize - zWindow)); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);
n = nT.createNode("South"); n.setParameter("translation", "0 " + (-ySize + wall/2) + " " + zSize/2); n.setParameter("scale", "" + xSize + " " + wall + " " + zSize); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);
n = nT.createNode("Top"); n.setParameter("translation", "0 " + (-ySize/2) + " " + (zSize - wall/2)); n.setParameter("scale", "" + xSize + " " + ySize + " " + wall); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);
n = nT.createNode("Floor"); n.setParameter("translation", "0 " + (-ySize/2) + " " + (zSize - zWindow - wall/2)); n.setParameter("scale", "" + xSize + " " + ySize + " " + wall); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);
n = nT.createNode("East"); n.setParameter("translation", "" + (xSize/2 - wall/2) + " " + (-ySize/2) + " " + zSize/2); n.setParameter("scale", "" + wall + " " + ySize + " " + zSize); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s);
n = nT.createNode("West"); n.setParameter("translation", "" - (xSize/2 - wall/2) + " " + (-ySize/2) + " " + zSize/2); n.setParameter("scale", "" + wall + " " + ySize + " " + zSize); s = n.createShape(); s.insertSurface("Cube"); makeTowerMaterial(s); }
function makeField() { var nodeRoot = NodeObject(); nodeRoot.setName("Script");
var nodeHeliostats = nodeRoot.createNode("Heliostats"); nodeHeliostats.setParameter("translation", "0 0 -1.5");
var nMax = file.rows(); for (var n = 1; n < nMax; n++) { var data = file.array(n); name = data[0]; position = data[1]; focus = data[2]; makeHeliostat(nodeHeliostats, name, position, vRec, focus); }
var nT = nodeRoot.createNode("Tower"); nT.setParameter("translation", "0 0 0"); nT.setParameter("rotation", "0 0 1 5"); makeTower(nT, 6, 6, zReceiver + 5, 10);
var nR = nodeRoot.createNode("Receiver"); nR.setParameter("translation", vRec); nR.setParameter("rotation", "-1 0 0 110"); var n = nR.createNode("Plate"); n.setParameter("rotation", "0 0 1 180"); s = n.createShape(); q = s.insertSurface("Planar"); p = s.insertProfile("Box"); p.setParameter("uSize", 5); p.setParameter("vSize", 5); var mG = s.getPart("material"); mG.setParameter("ambientColor", "0.3 0.3 0.3"); mG.setParameter("diffuseColor", "0.1 0.1 0.1"); mG.setParameter("specularColor", "0. 0. 0."); mG.setParameter("shininess", "0.1");
tn.InsertScene(nodeRoot); }
var zReceiver = 13.8347 + 1.5; var vRec = "0.0467 -2.0216 " + zReceiver;
tn.Clear(); makeField();
var scene = NodeObject().getScene();
var scene = NodeObject().getScene(); var sp = scene.getPart("world.sun.position"); sp.setParameter("azimuth", 180); sp.setParameter("elevation", 70);
var cm = scene.getPart("world.camera"); cm.setParameter("position", "-61.9296 -66.3768 75.5367"); cm.setParameter("rotation", "33.4011 -32.917");
var tg = scene.getPart("world.terrain.grid"); tg.setParameter("steps", "5 5 1"); tg.setParameter("file", "../examples/facilities/Proteas/terrain/terrain.obj");
Tonatiuh++ MCRT ray-tracer Wiki
Wiki
Getting started
Functionalities
- Tracking systems
- Scripting capabilities
- Field creation from external files
- Accurate component representation
- Design of complex surfaces through functions
- Procedural design of heliostat fields
- Flux analysis
- Materials
- Computer Aided Design (CAD) files import
- Atmospheric transmission
Relevant Papers