source: experiments/frams/foraminifera/data/scripts/foraminifera.expdef @ 444

Last change on this file since 444 was 444, checked in by oriona, 8 years ago

Visualization of reticulopodia and nutrients added as an option in theater.

File size: 19.3 KB
Line 
1expdef:
2name:Reproduction of benthic foraminifera
3info:~
4Basic information about this simulation:
5www.framsticks.com/foraminifera
6
7Technical information:
8Genes and parameter values which control reproduction are stored in user1 and user2 fields.
9
10user1:
11genes which are not encoded in Ff genotype:
12min_repro_energy - Minimum energy necessary for reproduction
13hibernation - Defines foram behavior in the case of no nutrients
14
15user2:
16Physiological parameters of foraminifera:
17max_energy_level - maximum energy level reached so far
18gen - generation: 0 haploid, 1 diploid
19species - species: 0 not hibernating 1 hibernating
20hibernated - 0/1 foram is/isn't hibernated
21reproduce - 0/1 foram isn't/is ready for reproduction
22~
23code:~
24
25
26global nutrientenergywaiting;
27global reprocounter;
28global colors;
29global chambers;
30global o;
31global max_chamber_energ;
32global dir_change;
33
34@include "foraminifera.inc"
35
36// -------------------------------- experiment begin --------------------------------
37
38function onExpDefLoad()
39{
40        // define genotype and creature groups
41        GenePools.clear();
42        Populations.clear();
43        GenePools[0].name = "Unused";
44
45        var pop = Populations[0];
46        pop.name = "Forams";
47        pop.en_assim = 0;
48        pop.nnsim = 0;
49        pop.enableperf = 1;
50        pop.death = 1;
51        pop.energy = 1;
52        pop.selfmask = 0x10001;
53        pop.othermask = 0x20001;
54        //pop.selfmask = 0x20002; pop.othermask = 0x10002;
55        pop.perfperiod = 25;
56
57        pop = Populations.addGroup("Nutrients");
58        pop.nnsim = 0;
59        pop.enableperf = 0;
60        pop.death = 1;
61        pop.energy = 1;
62        pop.selfmask = 0x20002;
63        pop.othermask = 0x10000;
64        //pop.othermask = 0x10002;
65
66        pop = Populations.addGroup("ReticulopodiaNutrients");
67        pop.nnsim = 0;
68        pop.enableperf = 0;
69        pop.death = 0;
70        pop.energy = 0;
71        pop.selfmask = 0x20002;
72        pop.othermask = 0x10000;
73
74        //world
75        SignalView.mode = 1;
76        World.wrldwat = 200;
77        World.wrldsiz = scale(40000);
78        World.wrldbnd = 1;
79        ExpParams.stress = 1;
80        ExpParams.creath = -0.99; //just above the bottom
81        ExpParams.autorestart = 0;
82
83        //ExpParams.visualize = 1; //uncomment to visualize reticulopodia and indicate nutrients positions
84
85        //ExpParams.logging = 1; //uncomment to enable logging simulation parameters to log files
86
87        //reproduction
88        ExpParams.foramPop = 10;       
89        ExpParams.crossprob = 0.4;
90        ExpParams.mutationprob = 0.2;
91        ExpParams.repro_time = 20;
92        reprocounter = 0;
93
94        //morphology
95        dir_change = 500;
96        ExpParams.zone1_range = scale(3000);
97        ExpParams.zone2_range = scale(6000);
98        init_chambers();
99        ExpParams.chamber_proculus_haplo = scale(50);
100        ExpParams.chamber_difference_haplo = 0.0;
101        ExpParams.chamber_proculus_diplo = scale(20);
102        ExpParams.chamber_difference_diplo = 0.2;
103        max_chamber_energ = [Vector.new(), Vector.new()];
104        for (var j = 0; j < 2; j++)
105        {
106                for (var i = 0; i < chambers[0].size; i++)
107                {
108                        max_chamber_energ[j].add(((Math.pow(getProperty(j, "chamber_proculus"),3) + Math.pow(getProperty(j, "chamber_proculus") + (i) * getProperty(j, "chamber_difference"),3))*(i+1))/2);
109                }                                 
110        }
111
112        //energetics
113        ExpParams.min_repro_energ_haplo = 4;
114        ExpParams.min_repro_energ_diplo = 6;
115
116        ExpParams.e_meta = 0.0002;
117        ExpParams.energy_hib = 0.0001;
118        ExpParams.energy_move = 0.00025;
119
120        ExpParams.energies0_haplo = max_chamber_energ[0][0] - 0.001*max_chamber_energ[0][0];
121        ExpParams.energies0_diplo = max_chamber_energ[1][0] - 0.001*max_chamber_energ[1][0];
122        ExpParams.feedtrans = 0.5;
123        ExpParams.e_repro_cost_haplo = 0.7;
124        ExpParams.e_repro_cost_diplo = 0.3;
125
126        //nutrients
127        ExpParams.nutrientsize = scale(10);
128        ExpParams.energy_nut = 100 * Math.pow(ExpParams.nutrientsize, 3);
129        ExpParams.nutrientPop = 1;
130        ExpParams.feedrate = 0.1;
131        nutrientenergywaiting = ExpParams.energy_nut;
132        ExpState.totaltestedcr = 0;
133        ExpState.nutrient = "";
134}
135
136@include "standard_placement.inc"
137
138function scale(x)
139{
140        return x*0.025;
141}
142
143function getProperty(gen, prop_id)
144{
145        var ploid = "haplo";
146        if (gen == 1) ploid = "diplo";
147        return ExpParams.[prop_id + "_" + ploid];
148}
149
150function addInitialForam(species, i)
151{
152        var geno = createForamGenotype(0, species, 0);
153        var cr = Populations[0].add(geno);
154        cr.name = "Initial creature" + species + "_" + i;
155        placeCreatureRandomly(cr, 0, 0);
156        cr.energy0 = getProperty(0, "energies0");
157        cr.energy = cr.energy0;
158        setGenotype({"opt" : 0, "cr" : cr, "species" : species});
159}
160
161function onExpInit()
162{
163        Populations[0].clear();
164        Populations[1].clear();
165        Populations[2].clear(); //reticulopodia and nutrients
166
167        for (var i = 0; i < ExpParams.foramPop; i++)
168        {
169                addInitialForam(0, i); 
170                addInitialForam(1, i);
171        }
172        o = Populations[0][0].getMechPart(0).orient.clone();
173        ExpState.totaltestedcr = 0;
174        nutrientenergywaiting = ExpParams.energy_nut;
175}
176
177function onExpLoad()
178{
179        for (var pop in Populations)
180                pop.clear();
181
182        Loader.addClass(sim_params.*);
183        Loader.setBreakLabel(Loader.BeforeUnknown, "onExpLoad_Unknown");
184        Loader.run();
185
186        Simulator.print("Loaded " + Populations[0].size + " Forams and " + Populations[1].size + " nutrient objects");
187}
188
189function onExpLoad_Unknown()
190{
191        if (Loader.objectName == "org") // saved by the old expdef
192        {
193                var g = Genotype.newFromString("");
194                Loader.currentObject = g;
195                Interface.makeFrom(g).setAllDefault();
196                Loader.loadObject();
197                var cr = Populations[0].add(g);
198                if (cr != null)
199                {
200                        //cr.rotate(0,0,Math.rnd01*Math.twopi);
201                        if ((typeof(g.user1) == "Vector") && (g.user1.size >= 3))
202                        {
203                                // [x,y,energy]
204                                cr.move(g.user1[0] - cr.center_x, g.user1[1] - cr.center_y, 0);
205                                cr.energy = g.user1[2];
206                        }
207                        else
208                        {
209                                cr.move(Math.rnd01 * World.wrldsiz - cr.center_x, Math.rnd01 * World.wrldsiz - cr.center_y, 0);
210                        }
211                }
212        }
213        else if (Loader.objectName == "Creature")
214        {
215                Loader.currentObject = CreatureSnapshot.new();
216                Loader.loadObject();
217                Populations[0].add(Loader.currentObject);
218        }
219}
220
221function onExpSave()
222{
223        File.writeComment("saved by '%s.expdef'" % Simulator.expdef);
224
225        var tmpvec = [], i;
226
227        for(var cr in Populations[1])
228                tmpvec.add([cr.center_x, cr.center_y, cr.energy]);
229
230        ExpState.nutrient = tmpvec;
231        File.writeObject(sim_params.*);
232        ExpState.nutrient = null; //vectors are only created for saving and then discarded
233
234        for (var cr in Populations[0])
235                File.writeObject(cr);
236}
237
238// -------------------------------- experiment end --------------------------------
239
240// -------------------------------- foram begin -----------------------------------
241
242function setForamMeta(cr, gen)
243{
244        cr.idleen = ExpParams.e_meta * max_chamber_energ[gen][Math.min(lastChamberNum(cr), max_chamber_energ[gen].size-1)];
245}
246
247function lastChamberNum(cr)
248{
249        return cr.numparts-1;
250}
251
252function onForamsBorn(cr)
253{
254        setForamMeta(cr, 1);
255        if (ExpParams.visualize == 1)
256        {
257                var ret = Populations[2].add("//0\np:sh=3,sx=0.01,sy="+ExpParams.zone1_range+",sz="+ExpParams.zone1_range+",ry=1.57,vr=0.0,1.0,0.0");
258                cr.user3 = ret;
259        }
260}
261
262function placeRandomlyNotColliding(cr)
263{
264        var retry = 100; //try 100 times
265        while (retry--)
266        {
267                placeCreatureRandomly(cr, 0, 0);
268                if (!cr.boundingBoxCollisions(0))
269                        return cr;
270        }
271
272        Populations[0].delete(cr);
273}
274
275function visualization(cr)
276{
277        var has_ret = 0;
278
279        if (cr.user3 != null)
280        {
281                if (Populations[2].findUID(cr.user3.uid) != null)
282                {
283                        has_ret = 1;
284                }
285        }
286
287        return has_ret;
288}
289
290function foramGrow(cr, chamber_num)
291{
292        var geno = createForamGenotype(cr.user2["gen"], cr.user2["species"], chamber_num+1);
293        var cr2 = Populations[0].add(geno);
294
295        cr2.energy0 = cr.energy;
296        cr2.energy = cr2.energy0;
297
298        setGenotype({"cr" : cr2, "parent_user1" : cr.user1, "parent_user2" : cr.user2, "opt" : 2});
299        cr2.moveAbs(cr.center_x - cr2.size_x / 2, cr.center_y - cr2.size_y / 2, cr.pos_z);
300        setForamMeta(cr2, cr2.user2["gen"]);
301
302        if (visualization(cr))
303        {
304                Populations[2].delete(cr.user3);
305        }
306        Populations[0].delete(cr);
307}
308
309function stepToNearest(cr)
310{
311        var p = cr.getMechPart(0);
312        var n = cr.signals.receiveSet("nutrient", ExpParams.zone2_range);
313
314        //if signals are received find the source of the nearest
315        if (n.size > 0)
316        {
317                var i;
318                var mp;
319                var distvec = XYZ.new(0, 0, 0);
320                var dist;
321                var mindist = 100000000000;
322                var mindistvec = null;
323                var eating = 0;
324
325                for (i = 0; i < n.size; i++)
326                {
327                        mp = n[i].value.getMechPart(0);
328                        distvec.set(mp.pos);
329                        distvec.sub(p.pos);
330                        dist = distvec.length;
331                        if (dist < ExpParams.zone1_range)
332                        {
333                                if (n[i].value != null)
334                                {
335                                        energyTransfer(cr, n[i].value);
336                                        eating = 1;
337                                }
338                        }
339                        else if (eating == 0 && cr.user2["hibernated"] == 0 && dist < mindist)
340                        {
341                                mindist = dist;
342                                mindistvec = distvec.clone();
343                        }
344                }
345
346                if (!eating && cr.user2["hibernated"] == 0)
347                {
348                        mindistvec.normalize();
349                        mindistvec.scale(-0.08);
350                        cr.localDrive = mindistvec;
351                        moveEnergyDec(cr);
352                }
353
354                return 1;
355        }
356       
357        else
358                return 0;
359}
360
361function moveEnergyDec(cr)
362{
363        if (cr.user2["hibernated"] == 0)
364        {
365                cr.energy_m += ExpParams.energy_move * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)];
366        }
367}
368
369function foramMove(cr)
370{
371        //TODO moving inside sediment?
372
373        //adjustment in z axis
374        cr.moveAbs(cr.pos_x, cr.pos_y, 0);
375
376        //are there any nutrients in zone 1 or 2?
377        {
378                var moved = stepToNearest(cr); //TODO weighted sum of distance and energy
379                if (moved==1)
380                {
381                        return;
382                }
383        }
384
385        //no nutrients in zone 2
386        var hibernation = 0;
387        if (cr.user2["gen"] == 0) hibernation =  cr.user1["hibernation"];
388        else hibernation =  cr.user1[0]["hibernation"];
389        //hibernation
390        if (hibernation == 1)
391        {
392                reverseHib(cr);
393                cr.localDrive = XYZ.new(0,0,0);
394        }
395        //random move
396        else if (cr.lifespan%dir_change == 0)
397        {
398                var dir = (Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), Math.rndUni(-ExpParams.zone2_range, ExpParams.zone2_range), 0); 
399                dir.normalize();
400                dir.scale(-0.08);
401                cr.localDrive = dir;
402                moveEnergyDec(cr);
403        }
404}
405
406function energyTransfer(cr1, cr2)
407{
408        cr1.localDrive = XYZ.new(0,0,0);
409        var e = cr2.getPart(0).ing * ExpParams.feedtrans; //TODO efficiency dependent on age
410        e = Math.min(cr2.energy, e) + 0.0000001;
411        //Simulator.print("transferring "+e+" to "+cr1.name+" from "+cr2.name+" ("+cr2.energy+")");
412        cr2.energy_m = cr2.energy_m + e;
413        cr1.energy_p = cr1.energy_p + e;
414        if (cr1.user2["hibernated"] == 1)
415        {
416                reverseHib(cr1);
417        }
418}
419
420function reverseHib(cr)
421{
422        if (cr.user2["hibernated"] == 1)
423        {
424                setForamMeta(cr, cr.user2["gen"]); //unhibernate
425        }
426        else
427        {
428                cr.idleen = ExpParams.energy_hib * max_chamber_energ[cr.user2["gen"]][Math.min(lastChamberNum(cr), (max_chamber_energ[cr.user2["gen"]].size)-1)]; //hibernate
429        }
430        cr.user2["hibernated"] = 1 - cr.user2["hibernated"];
431}
432
433function onForamsStep(cr)
434{
435        cr.getMechPart(0).orient.set(o);
436        if (visualization(cr))
437        {
438                cr.user3.moveAbs(cr.center_x-ExpParams.zone1_range, cr.center_y-ExpParams.zone1_range, cr.center_z-ExpParams.zone1_range-getProperty(cr.user2["gen"], "chamber_proculus"));
439        }
440
441        if (deathConditions(cr) == 1)
442        {
443                Populations[0].kill(cr);
444                return;
445        }
446
447        foramMove(cr);
448
449        var repro = foramReproduce(cr);
450        if (repro == 1)
451        {
452                return;
453        }
454
455        cr.user2["max_energy_level"] = Math.max(cr.energy, cr.user2["max_energy_level"]);
456        if  (lastChamberNum(cr) <= chambers[0].size-1)
457        {
458                if ((cr.user2["max_energy_level"] >= max_chamber_energ[cr.user2["gen"]][lastChamberNum(cr)]))   
459                {
460                        foramGrow(cr, lastChamberNum(cr));
461                }       
462        }       
463}
464
465function deathConditions(cr)
466{
467        if ((cr.energy <= ExpParams.e_death_level) || (Math.rnd01 < ExpParams.hunted_prob))
468                return 1;
469        else
470                return 0;
471}
472
473function onForamsDied(cr)
474{
475        if (visualization(cr))
476        {
477                Populations[2].delete(cr.user3);
478        }
479        //fossilization
480        var geno = GenePools[0].add(cr.genotype);
481        geno.user1 = cr.user1;
482        geno.user2 = cr.user2;
483        if (ExpParams.logging == 1) Simulator.print("\"" + cr.name + "\" died...");
484        ExpState.totaltestedcr++;
485}
486
487// --------------------------------foram end -------------------------------------
488
489// -------------------------------- nutrient begin --------------------------------
490
491function createNutrientGenotype(nutrientsize, zone1_range)
492{
493        return "//0\np:sh=3,sx="+nutrientsize+",sy="+nutrientsize+",sz="+nutrientsize+",ry=1.5,vr=0.0,1.0,0.0";
494}
495
496function onNutrientsStep(cr)
497{
498        cr.moveAbs(cr.pos_x % World.wrldsiz, cr.pos_y % World.wrldsiz, 0.5);
499}
500
501function addNutrient()
502{
503        var cr = Populations[1].add(createNutrientGenotype(ExpParams.nutrientsize, ExpParams.zone1_range));
504
505        cr.name = "Nutrients";
506        cr.idleen = 0;
507        cr.energy0 = ExpParams.energy_nut;
508        cr.energy = cr.energy0;
509        cr.signals.add("nutrient");
510
511        cr.signals[0].value = cr;
512
513        placeCreatureRandomly(cr, 0, 0);
514        if (ExpParams.visualize == 1)
515        {
516                var nutsize = ExpParams.nutrientsize*10;
517                var nut = Populations[2].add("//0\np:sh=2,sx="+nutsize+",sy="+nutsize+",sz="+nutsize+",ry=1.5,vr=0.0,1.0,0.0");
518                cr.user3 = nut;
519                nut.moveAbs(cr.pos_x-1.5*nutsize, cr.pos_y-1.5*nutsize, 0.5);
520        }
521}
522
523function onNutrientsDied(cr)
524{
525        if (visualization(cr))
526        {
527                Populations[2].delete(cr.user3);
528        }
529}
530
531function nutrientGrowth()
532{
533        nutrientenergywaiting = nutrientenergywaiting + ExpParams.feedrate;
534        if (nutrientenergywaiting > ExpParams.energy_nut)
535        {
536                for (var i = 0; i < ExpParams.nutrientPop; i++)
537                {   
538                        addNutrient();
539                }
540
541                nutrientenergywaiting = 0.0;
542                Simulator.checkpoint();
543        }
544}
545
546// -------------------------------- nutrient end --------------------------------
547
548// -------------------------------- step begin --------------------------------
549
550function onStep()
551{
552
553        nutrientGrowth();
554        if (ExpParams.logging == 1)
555        {
556                createStatistics();
557        }
558
559        //reproduction --------------------------------------------
560        reprocounter += 1;
561        if (reprocounter > ExpParams.repro_time)
562        {
563                reprocounter = 0;
564                reproduce_parents(0);
565                reproduce_parents(1);
566        }
567
568        //check for extinction -----------------------------------------------
569        if (Populations[0].size == 0)
570        {
571                if (ExpParams.autorestart)
572                {
573                        Simulator.print("no more creatures, restarting...");
574                        onExpInit();
575                }
576                else
577                {
578                        Simulator.print("no more creatures, stopped.");
579                        Simulator.stop();
580                }
581        }
582        if (ExpParams.maxSteps > 0)
583        {
584                if (Simulator.stepNumber >= ExpParams.maxSteps)
585                        Simulator.stop();
586        }
587}
588
589function createStatistics()
590{       
591        var number = [[0, 0],[0,0]]; // [species][gen]
592        var e_inc = [[0, 0],[0,0]];
593        var e_nut = 0.0;
594
595        for (var i = 0; i < Populations[0].size; i++)
596        {
597                var cr = Populations[0].get(i);
598                var gen = cr.user2["gen"];
599                var species = cr.user2["species"];
600
601                number[species][gen] = number[species][gen] + 1;
602                e_inc[species][gen] = e_inc[species][gen] + cr.energy;
603        }
604
605        for (var i = 0; i < Populations[1].size; i++)
606        {
607                var cr = Populations[1].get(i);
608                e_nut += cr.energy;
609        }
610
611        var log_numbers = [number[1][0], number[1][1], number[0][0], number[0][1], Populations[1].size];
612        var log_energies = [e_inc[1][0], e_inc[1][1], e_inc[0][0], e_inc[0][1], e_nut];
613
614        log(log_numbers, "forams_log.txt");
615        log(log_energies,  "energies_log.txt");
616}
617
618function log(tolog, fname)
619{
620        var f = File.appendDirect(fname, "forams data");
621        f.writeString("" + Simulator.stepNumber);
622        for (var  i = 0; i < tolog.size; i++)
623        {
624                f.writeString(";" + tolog[i]);
625        }
626        f.writeString("\n");
627        f.close();
628}
629
630// -------------------------------- step end --------------------------------
631
632@include "standard_events.inc"
633
634~
635
636prop:
637id:visualize
638name:Show reticulopodia and nutrients
639type:d 0 1 0
640group:Foraminifera
641
642prop:
643id:maxSteps
644name:Stop after the given number of simulation steps
645type:d 0 1000000 0
646
647prop:
648id:e_repro_cost_haplo
649name:Cost of reproduction
650type:f 0.1 0.9 0.5
651group:Foraminifera
652
653prop:
654id:e_repro_cost_diplo
655name:Cost of reproduction
656type:f 0.1 0.9 0.3
657group:Foraminifera
658
659prop:
660id:chamber_proculus_haplo
661name:Size of proculus
662type:f
663group:Foraminifera
664
665prop:
666id:chamber_proculus_diplo
667name:Size of proculus
668type:f
669group:Foraminifera
670
671prop:
672id:chamber_difference_haplo
673name:Difference in size between subsequent chambers
674type:f
675group:Foraminifera
676
677prop:
678id:chamber_difference_diplo
679name:Difference in size between subsequent chambers
680type:f
681group:Foraminifera
682
683prop:
684id:hunted_prob
685name:Probability of being hunted
686type:f 0 1 0
687group:Forminifera
688
689prop:
690id:zone1_range
691name:Zone 1 range
692type:f 0 200
693group:Foraminifera
694
695prop:
696id:zone2_range
697name:Zone 2 range
698type:f 0 3000
699group:Foraminifera
700
701prop:
702id:colors
703name:Haploid and diploid colors
704type:x
705group:Foraminifera
706
707prop:
708id:min_repro_energ_haplo
709name:Min reproduction energy of forams
710type:f
711group:Foraminifera
712
713prop:
714id:min_repro_energ_diplo
715name:Min reproduction energy of forams
716type:f
717group:Foraminifera
718
719prop:
720id:repro_prob
721name:Probability of reproduction
722type:f 0 1 0.8
723group:Foraminifera
724
725prop:
726id:energies0_haplo
727name:Energy of offspring from diploid forams
728type:f
729group:Foraminifera
730
731prop:
732id:energies0_diplo
733name:Energy of offspring from diploid forams
734type:f
735group:Foraminifera
736
737prop:
738id:energy_hib
739name:Energy used for hibernation during one step
740type:f 0 1 0.001
741group:Foraminifera
742
743prop:
744id:energy_move
745name:Energy used for movement during one step
746type:f 0 20 0.001
747group:Foraminifera
748
749prop:
750id:min_vol
751name:Minimal volume for reproduction
752type:f 100 900 100
753group:Foraminifera
754
755prop:
756id:max_size
757name:Maximal size
758type:d 1 10 5
759group:Foraminifera
760
761prop:
762id:foramPop
763name:Initial forams population size
764type:d 1 1000 100
765group:Foraminifera
766
767prop:
768id:crossprob
769name:Crossover probability
770type:f 0 1 0
771group:Foraminifera
772
773prop:
774id:mutationprob
775name:Mutation probability
776type:f 0 1 0
777group:Foraminifera
778
779prop:
780id:e_death_level
781name:Minimal level of energy to sustain life
782type:f 0 20 0
783group:Foraminifera
784
785prop:
786id:e_meta
787name:Idle metabolism
788type:f 0 1
789group:Energy
790help:Each stick consumes this amount of energy in one time step
791
792prop:
793id:feedrate
794name:Feeding rate
795type:f 0 100
796group:Energy
797help:How fast energy is created in the world
798
799prop:
800id:energy_nut
801name:Nutrient energy
802type:f 0 1000
803group:Energy
804
805prop:
806id:feedtrans
807name:Ingestion multiplier
808type:f 0 100
809group:Energy
810
811prop:
812id:nutrientsize
813name:Nutrient size
814type:f 0.1 0.9 0.1
815group:Energy
816
817prop:
818id:nutrientPop
819name:Nutrient population size
820group:Energy
821type:d 1 1000 10
822
823prop:
824id:stress
825name:Environmental stress
826type:d 0 1 1
827group:World
828
829prop:
830id:repro_trigger
831name:Reproduction trigger
832type:d 0 1 1
833group:World
834
835prop:
836id:repro_time
837name:Time before reproduction
838type:d 0 1000
839
840prop:
841id:creath
842name:Creation height
843type:f -1 50
844help:~
845Vertical position (above the surface) where new Forams are revived.
846Negative values are only used in the water area:
847  0   = at the surface
848-0.5 = half depth
849-1   = just above the bottom~
850
851state:
852id:nutrient
853name:Nutrient locations
854help:vector of vectors [x,y,energy]
855type:x
856flags:32
857
858prop:
859id:autorestart
860name:Restart after extinction
861help:Restart automatically this experiment after the last creature has died?
862type:d 0 1
863
864state:
865id:notes
866name:Notes
867type:s 1
868help:~
869You can write anything here
870(it will be saved to the experiment file)~
871
872state:
873id:totaltestedcr
874name:Evaluated Forams
875help:Total number of the Forams evaluated in the experiment
876type:d
877flags:16
878
879prop:
880id:logging
881name:Log statistics to file
882type:d 0 1 0
Note: See TracBrowser for help on using the repository browser.