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

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

Parameters for time scaling added.

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