- Timestamp:
- 01/31/19 03:43:35 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
experiments/frams/foraminifera/data/scripts/foraminifera.expdef
r638 r847 60 60 pop.othermask = 0; 61 61 //pop.selfmask = 0x20002; pop.othermask = 0x10002; 62 pop.perfperiod = 25; 62 pop.perfperiod = 25; 63 63 pop.bodysim = 0; 64 64 … … 86 86 World.wrldwat = 200; 87 87 World.wrldsiz = micronsToFrams(100000); 88 wrldsizSquareMeters = Math.pow(framsToMicrons(World.wrldsiz) *0.000001,2);88 wrldsizSquareMeters = Math.pow(framsToMicrons(World.wrldsiz) * 0.000001, 2); 89 89 World.wrldbnd = 1; 90 90 91 91 //ExpProperties.visualize = 1; //uncomment to visualize reticulopodia and indicate nutrients positions 92 92 93 //ExpProperties.logging = 1; //uncomment to enable logging simulation parameters to log files 93 //ExpProperties.logging = 1; //uncomment to enable logging simulation parameters to log files 94 94 ExpProperties.logPref = ""; 95 95 … … 99 99 ExpProperties.chamber_proculus_haplo = micronsToFrams(20); 100 100 ExpProperties.chamber_proculus_diplo = micronsToFrams(10); 101 colors = ["1.0,1.0,0.3", "1.0,0.7,0.0"]; //yellow and orange101 colors = ["1.0,1.0,0.3", "1.0,0.7,0.0"]; //yellow and orange 102 102 curColor = colors[0]; 103 103 curRadius = ExpProperties.zone1_range; … … 105 105 //nutrients 106 106 ExpProperties.nutrientradius = micronsToFrams(10); 107 ExpProperties.energy_nut = 200 * energyFromVolume(ExpProperties.nutrientradius, 1);107 ExpProperties.energy_nut = 200 * energyFromVolume(ExpProperties.nutrientradius, 1); 108 108 nutrientSqrCm = 10; 109 ExpProperties.nutrient_pop = Math.pow(framsToMicrons(World.wrldsiz) *0.0001,2)/nutrientSqrCm;109 ExpProperties.nutrient_pop = Math.pow(framsToMicrons(World.wrldsiz) * 0.0001, 2) / nutrientSqrCm; 110 110 111 111 ExpState.totaltestedcr = 0; … … 116 116 //addSpecies({"min_repro_energies" : [4,6]}); 117 117 //addSpecies({"min_repro_energies" : [4,8]}); 118 118 119 119 //Simulator.print(create_genotype(0.2, 30, "1.0,1.0,0.0", 0.6)); //sample call 120 120 //Simulator.print(create_genotype(0.1, 40, "1.0,0.5,0.0", 0.1)); //sample call … … 135 135 if (ExpProperties.max_chamber_num_haplo == max_chambers_def && ExpProperties.max_chamber_num_diplo == max_chambers_def) 136 136 { 137 max_chamber_volume = [[30403.5869594578, 52812.2546633948,79578.5148482541,113588.815134453,154620.677376218,205094.322220826,262572.712174265,326078.453295303,402342.518962956,498133.985678766,615066.864740109,759500.497626816,937064.025544282,1155915.25563075,1429139.14079748,1762487.92940157,2176286.62046069,2685795.63187845,3316190.12127043,4096436.04462706,5051343.25226193,6231980.1061213,7687880.79524734,9485307.02904958,11716968.9852569,14459866.4934433,17836388.9853663,22004935.7247348,27138607.2546045,33482425.1582986,41336775.1280297,50997910.7842793,62888631.7871037,77563060.9243464,95659468.591964]138 , [3430.07716920763,6159.93090353532,9322.94192815286,13462.9896597283,18399.8550832969,24558.9218126892,31468.8148639192,39189.4977865513,48404.4292075836,60185.8639086061,74490.6048472854,92117.8178412275,113852.779747083,140714.366929552,174450.937643841,215250.242147183,266323.295274072,328858.042352538,406552.379957238,503526.321155323,621060.781025019,767240.824049468,947210.683224091,1169506.19906112,1447211.61255879,1787155.29073739,2205627.64766244,2723413.2837305,3360233.53738709,4147771.02835393,5126445.06973928,6328060.3331703,7805693.278958,9631924.72156452,11884287.1596814]];137 max_chamber_volume = [[30403.5869594578, 52812.2546633948, 79578.5148482541, 113588.815134453, 154620.677376218, 205094.322220826, 262572.712174265, 326078.453295303, 402342.518962956, 498133.985678766, 615066.864740109, 759500.497626816, 937064.025544282, 1155915.25563075, 1429139.14079748, 1762487.92940157, 2176286.62046069, 2685795.63187845, 3316190.12127043, 4096436.04462706, 5051343.25226193, 6231980.1061213, 7687880.79524734, 9485307.02904958, 11716968.9852569, 14459866.4934433, 17836388.9853663, 22004935.7247348, 27138607.2546045, 33482425.1582986, 41336775.1280297, 50997910.7842793, 62888631.7871037, 77563060.9243464, 95659468.591964] 138 , [3430.07716920763, 6159.93090353532, 9322.94192815286, 13462.9896597283, 18399.8550832969, 24558.9218126892, 31468.8148639192, 39189.4977865513, 48404.4292075836, 60185.8639086061, 74490.6048472854, 92117.8178412275, 113852.779747083, 140714.366929552, 174450.937643841, 215250.242147183, 266323.295274072, 328858.042352538, 406552.379957238, 503526.321155323, 621060.781025019, 767240.824049468, 947210.683224091, 1169506.19906112, 1447211.61255879, 1787155.29073739, 2205627.64766244, 2723413.2837305, 3360233.53738709, 4147771.02835393, 5126445.06973928, 6328060.3331703, 7805693.278958, 9631924.72156452, 11884287.1596814]]; 139 139 } 140 140 … … 143 143 max_chamber_volume = [Vector.new(), Vector.new()]; 144 144 var density = 100; 145 for (var ploid = 0; ploid < 2; ploid++) 145 for (var ploid = 0; ploid < 2; ploid++) 146 146 { 147 147 var rad = getPloidRadius(ploid); 148 for (var cham_num = 0; cham_num < getProperty(ploid, "max_chamber_num"); cham_num++)148 for (var cham_num = 0; cham_num < getProperty(ploid, "max_chamber_num"); cham_num++) 149 149 { 150 max_chamber_volume[ploid].add(volumeFromGeno(ploid, rad, cham_num +1, density));151 } 150 max_chamber_volume[ploid].add(volumeFromGeno(ploid, rad, cham_num + 1, density)); 151 } 152 152 } 153 153 } … … 162 162 for (var i = 0; i < ExpProperties.foramPop; i++) 163 163 { 164 addInitialForam(spec, i); 164 addInitialForam(spec, i); 165 165 } 166 166 } … … 239 239 { 240 240 var geno = create_genotype(rad, chamber_num, colors[morphotype], 1); 241 var m =Model.newFromString(geno);242 var mg =ModelGeometry.forModel(m);243 mg.geom_density =density;241 var m = Model.newFromString(geno); 242 var mg = ModelGeometry.forModel(m); 243 mg.geom_density = density; 244 244 var volumeInFrams = mg.volume(); 245 245 246 return volumeInFrams/Math.pow(ExpProperties.scalingFactor,3); 247 } 248 249 function secToSimSteps(value_in_sec){ 250 return value_in_sec/ExpProperties.secPerStep; 246 return volumeInFrams / Math.pow(ExpProperties.scalingFactor, 3); 247 } 248 249 function secToSimSteps(value_in_sec) 250 { 251 return value_in_sec / ExpProperties.secPerStep; 251 252 } 252 253 253 254 function volumeInMicrons(radiusInFrams) 254 255 { 255 return 4.0 /3.0*Math.pi*Math.pow(framsToMicrons(radiusInFrams),3);256 return 4.0 / 3.0 * Math.pi * Math.pow(framsToMicrons(radiusInFrams), 3); 256 257 } 257 258 … … 260 261 if (isRadiusInFrams == 1) //radius in frams 261 262 { 262 return ExpProperties.picoCarbonPerMikro *volumeInMicrons(base);263 return ExpProperties.picoCarbonPerMikro * volumeInMicrons(base); 263 264 } 264 265 else //volume in microns … … 270 271 function getMovePerStep() 271 272 { 272 return micronsToFrams((ExpProperties.foramSpeedMmPerMin /60)*1000)*ExpProperties.secPerStep;273 return micronsToFrams((ExpProperties.foramSpeedMmPerMin / 60) * 1000) * ExpProperties.secPerStep; 273 274 } 274 275 275 276 function micronsToFrams(micrometers) 276 277 { 277 return micrometers *ExpProperties.scalingFactor;278 return micrometers * ExpProperties.scalingFactor; 278 279 } 279 280 280 281 function framsToMicrons(framsworldunits) 281 282 { 282 return framsworldunits /ExpProperties.scalingFactor;283 return framsworldunits / ExpProperties.scalingFactor; 283 284 } 284 285 … … 292 293 function getGene(cr, gen_id, gen_set) 293 294 { 294 if (cr.data->lifeparams->gen == 0) 295 if (cr.data->lifeparams->gen == 0) 295 296 return cr.data->genes[gen_id]; 296 else 297 else 297 298 return cr.data->genes[gen_set][gen_id]; 298 299 } … … 301 302 { 302 303 var radius = ExpProperties.chamber_proculus_haplo; 303 304 305 306 304 if (ploid == 1) 305 { 306 radius = ExpProperties.chamber_proculus_diplo; 307 } 307 308 return radius; 308 309 } … … 313 314 for (var i = 0; i < chamber_num; i++) 314 315 { 315 if (energy < energyFromVolume(max_chamber_volume[ploid][i], 0))316 { 317 chamber_num = i +1;316 if (energy < energyFromVolume(max_chamber_volume[ploid][i], 0)) 317 { 318 chamber_num = i + 1; 318 319 break; 319 } 320 } 321 320 } 321 } 322 322 323 return chamber_num; 323 324 } … … 326 327 { 327 328 var cr = Populations[pop_num].add(geno); 328 cr.rotate(0, 0,Math.rndUni(rotate_min, rotate_max));329 return cr; 329 cr.rotate(0, 0, Math.rndUni(rotate_min, rotate_max)); 330 return cr; 330 331 } 331 332 … … 337 338 var geno = create_genotype(radius, chambernum, colors[ploid], 1); 338 339 curColor = colors[ploid]; 339 var cr = createAndRotate(geno, 0, 2 *Math.pi, 0);340 var cr = createAndRotate(geno, 0, 2 * Math.pi, 0); 340 341 cr.name = "Initial creature" + species + "_" + iter; 341 342 placeRandomlyNotColliding(cr); … … 355 356 { 356 357 ploid = 1; 357 } 358 } 358 359 //add new foram with random energy bewtween starting energy and reproduction threshold 359 360 var repro_thr = species_genes[species]->min_repro_energies[ploid]; 360 var start_energy = Math.rndUni(energyFromVolume(getPloidRadius(ploid), 1),repro_thr-0.25*repro_thr);361 addForam(species, iter, start_energy, ploid);361 var start_energy = Math.rndUni(energyFromVolume(getPloidRadius(ploid), 1), repro_thr - 0.25 * repro_thr); 362 addForam(species, iter, start_energy, ploid); 362 363 } 363 364 … … 365 366 function addSpecies(new_genes) 366 367 { 367 species_genes.add({"min_repro_energies" : [ExpProperties.min_repro_energ_haplo, ExpProperties.min_repro_energ_diplo], "energies0" : [ExpProperties.energies0_haplo, ExpProperties.energies0_diplo], "hibernation" : 0, "morphotype" : 0});368 species_genes.add({"min_repro_energies" : [ExpProperties.min_repro_energ_haplo, ExpProperties.min_repro_energ_diplo], "energies0" : [ExpProperties.energies0_haplo, ExpProperties.energies0_diplo], "hibernation" : 0, "morphotype" : 0}); 368 369 for (var i = 0; i < new_genes.size; i++) 369 370 { 370 371 var key = new_genes.getKey(i); 371 species_genes[species_genes.size -1][key] = new_genes[key];372 } 372 species_genes[species_genes.size - 1][key] = new_genes[key]; 373 } 373 374 } 374 375 … … 378 379 { 379 380 //percent of current energy 380 cr.idleen = (ExpProperties.e_meta * cr.energy) *ExpProperties.secPerStep;381 cr.idleen = (ExpProperties.e_meta * cr.energy) * ExpProperties.secPerStep; 381 382 } 382 383 … … 388 389 function getZoneRange(cr, zone_num) 389 390 { 390 return ExpProperties.["zone" +zone_num+"_range"];391 return ExpProperties.["zone" + zone_num + "_range"]; 391 392 } 392 393 393 394 function addReticulopodia(cr, radius) 394 395 { 395 396 397 398 399 var ret = Populations[2].add("//0\nm:Vstyle=reticulopodia\np:sh=1,sx=0.001,sy=0.001,sz=0.001\np:sh=3,sx=0.01,sy="+radius+",sz="+radius+",ry=1.57079633,vr="+curColor+"\nj:0, 1, sh=1");400 401 402 ret.locationSetBboxLow(cr.bboxCenter.x-radius, cr.bboxCenter.y-radius, cr.bboxCenter.z-radius);396 if (reticulopodiaExists(cr)) 397 { 398 Populations[2].delete(cr.data->reticulopodiacreature); 399 } 400 var ret = Populations[2].add("//0\nm:Vstyle=reticulopodia\np:sh=1,sx=0.001,sy=0.001,sz=0.001\np:sh=3,sx=0.01,sy=" + radius + ",sz=" + radius + ",ry=1.57079633,vr=" + curColor + "\nj:0, 1, sh=1"); 401 cr.data->reticulopodiacreature = ret; 402 ret.getMechPart(0).orient.set(cr.getMechPart(0).orient); 403 ret.locationSetBboxLow(cr.bboxCenter.x - radius, cr.bboxCenter.y - radius, cr.bboxCenter.z - radius); 403 404 } 404 405 … … 421 422 if (!cr.boundingBoxCollisions(0)) 422 423 { 423 cr.locationSetBboxLow(cr.bboxLow.x, cr.bboxLow.y, -cr.getPart(cr.numparts -1).sx); //place slightly under the bottom surface ("z" value depends on the size of the last=largest chamber)424 cr.locationSetBboxLow(cr.bboxLow.x, cr.bboxLow.y, -cr.getPart(cr.numparts - 1).sx); //place slightly under the bottom surface ("z" value depends on the size of the last=largest chamber) 424 425 return cr; 425 426 } … … 451 452 function foramGrow(cr, chamber_num, lastchambergrowth) 452 453 { 453 if ((chamber_num +1) <= max_chamber_volume[cr.data->lifeparams->gen].size)454 if ((chamber_num + 1) <= max_chamber_volume[cr.data->lifeparams->gen].size) 454 455 { 455 456 curColor = colors[cr.data->lifeparams->gen]; 456 457 var ploid = cr.data->lifeparams->gen; 457 var geno = create_genotype(getPloidRadius(ploid), chamber_num +1, colors[ploid], lastchambergrowth);458 var geno = create_genotype(getPloidRadius(ploid), chamber_num + 1, colors[ploid], lastchambergrowth); 458 459 var cr2 = createAndRotate(geno, 0, 0, 0); 459 460 … … 463 464 464 465 setGenotype({"cr" : cr2, "parent_genes" : cr.data->genes, "parent_lifeparams" : cr.data->lifeparams, "opt" : "growth", "energy0" : cr.energy0}); 465 cr2.locationSetBboxLow(cr.bboxLow.x, cr.bboxLow.y, cr.bboxLow.z);466 cr2.locationSetBboxLow(cr.bboxLow.x, cr.bboxLow.y, cr.bboxLow.z); 466 467 setForamMeta(cr2); 467 468 … … 479 480 { 480 481 var total_time = secToSimSteps(ExpProperties.chamberGrowthSec); 481 var ret_unit = total_time /chamber_vis_denominator;482 var chamber_unit = total_time -ret_unit;482 var ret_unit = total_time / chamber_vis_denominator; 483 var chamber_unit = total_time - ret_unit; 483 484 484 485 if (chamber_time < ret_unit || chamber_time >= chamber_unit) 485 486 { 486 var new_rad = Math.min(Math.max((chamber_time %ret_unit)/ret_unit*getZoneRange(cr,1),0.01),getZoneRange(cr,1));487 var new_rad = Math.min(Math.max((chamber_time % ret_unit) / ret_unit * getZoneRange(cr, 1), 0.01), getZoneRange(cr, 1)); 487 488 488 489 if(chamber_time < ret_unit) 489 490 { 490 new_rad = getZoneRange(cr, 1)-new_rad;491 new_rad = getZoneRange(cr, 1) - new_rad; 491 492 } 492 493 493 494 curColor = colors[cr.data->lifeparams->gen]; 494 addReticulopodia(cr, new_rad);495 addReticulopodia(cr, new_rad); 495 496 496 497 if (chamber_time == 0)//checking for end of chamber growth process 497 498 { 498 cr.data->lifeparams->chamber_growth = -1; 499 cr.data->lifeparams->chamber_growth = -1; 499 500 } 500 501 } 501 502 else 502 503 { 503 var new_rad = 1 - Math.min(Math.max((chamber_time -ret_unit)/chamber_unit,0.01),1);504 var new_rad = 1 - Math.min(Math.max((chamber_time - ret_unit) / chamber_unit, 0.01), 1); 504 505 curRadius = cr.data->reticulopodiacreature.getPart(1).sy; 505 506 506 507 if (chamber_time == ret_unit) 507 508 { … … 509 510 } 510 511 511 var new_cr = foramGrow(cr, chamberNumFromEnergy(cr.data->lifeparams->max_energy_level, cr.data->lifeparams->gen) -1, new_rad);512 curRadius = getZoneRange(new_cr, 1);512 var new_cr = foramGrow(cr, chamberNumFromEnergy(cr.data->lifeparams->max_energy_level, cr.data->lifeparams->gen) - 1, new_rad); 513 curRadius = getZoneRange(new_cr, 1); 513 514 } 514 515 } … … 517 518 { 518 519 var p = XYZ.new(cr.bboxCenter.x, cr.bboxCenter.y, cr.bboxCenter.z); 519 var n = cr.signals.receiveSet("nutrient", getZoneRange(cr, 2));520 var n = cr.signals.receiveSet("nutrient", getZoneRange(cr, 2)); 520 521 521 522 //if signals are received find the source of the nearest … … 536 537 distvec.sub(p); 537 538 dist = distvec.length; 538 if (dist < getZoneRange(cr, 1))539 if (dist < getZoneRange(cr, 1)) 539 540 { 540 541 if (n[i].value != null) … … 562 563 return 1; 563 564 } 564 565 565 566 else 566 567 { … … 574 575 { 575 576 //percent of maximal energy 576 cr.energy -= (ExpProperties.energy_move * cr.data->lifeparams->max_energy_level) *ExpProperties.secPerStep;577 cr.energy -= (ExpProperties.energy_move * cr.data->lifeparams->max_energy_level) * ExpProperties.secPerStep; 577 578 } 578 579 } … … 580 581 function fence(center, zone) 581 582 { 582 return Math.min(Math.max(0 +zone,center),World.wrldsiz-zone); //add and subtract zone from the world size to prevent reticulopodia from crossing the fence583 return Math.min(Math.max(0 + zone, center), World.wrldsiz - zone); //add and subtract zone from the world size to prevent reticulopodia from crossing the fence 583 584 } 584 585 … … 588 589 { 589 590 var moved = stepToNearest(cr); //TODO weighted sum of distance and energy 590 if (moved ==1)591 { 591 if (moved == 1) 592 { 592 593 moveReticulopodia(cr); 593 594 return; … … 595 596 } 596 597 597 //Prevents forams from crossing the world border. In the case of touching the border with the reticulopodia direction of the movement should be changed. 598 //Prevents forams from crossing the world border. In the case of touching the border with the reticulopodia direction of the movement should be changed. 598 599 var change_direction = 0; 599 600 var new_x = fence(cr.bboxCenter.x, getZoneRange(cr, 1)); … … 603 604 { 604 605 change_direction = 1; 605 cr.locationSetBboxLow(new_x -cr.bboxSize.x/2, new_y-cr.bboxSize.y/2, -cr.getPart(cr.numparts-1).sx);//place slightly under the bottom surface ("z" value depends on the size of the last=largest chamber)606 cr.locationSetBboxLow(new_x - cr.bboxSize.x / 2, new_y - cr.bboxSize.y / 2, -cr.getPart(cr.numparts - 1).sx); //place slightly under the bottom surface ("z" value depends on the size of the last=largest chamber) 606 607 } 607 608 608 609 //no nutrients in zone 2 609 if (getGene(cr, "hibernation", 0) == 1)610 if (getGene(cr, "hibernation", 0) == 1) 610 611 { 611 612 reverseHib(cr); 612 cr.drive = XYZ.new(0, 0,0);613 cr.drive = XYZ.new(0, 0, 0); 613 614 } 614 615 //random move … … 631 632 if (visualization(cr)) 632 633 { 633 cr.data->reticulopodiacreature.locationSetBboxLow(cr.bboxCenter.x -getZoneRange(cr,1), cr.bboxCenter.y-getZoneRange(cr,1), cr.bboxCenter.z-getZoneRange(cr,1));634 cr.data->reticulopodiacreature.locationSetBboxLow(cr.bboxCenter.x - getZoneRange(cr, 1), cr.bboxCenter.y - getZoneRange(cr, 1), cr.bboxCenter.z - getZoneRange(cr, 1)); 634 635 cr.data->reticulopodiacreature.drive = cr.drive; 635 636 } … … 638 639 function randomDir() 639 640 { 640 var dir = (Math.rndUni(-ExpProperties.zone2_range, ExpProperties.zone2_range), Math.rndUni(-ExpProperties.zone2_range, ExpProperties.zone2_range), 0); 641 var dir = (Math.rndUni(-ExpProperties.zone2_range, ExpProperties.zone2_range), Math.rndUni(-ExpProperties.zone2_range, ExpProperties.zone2_range), 0); 641 642 dir.normalize(); 642 dir.scale(-1 *movePerStep);643 dir.scale(-1 * movePerStep); 643 644 return dir; 644 645 } … … 646 647 function energyTransfer(cr1, cr2) 647 648 { 648 cr1.drive = XYZ.new(0, 0,0);649 var e = ExpProperties.feedtrans *cr1.energy*ExpProperties.secPerStep; //TODO efficiency dependent on age649 cr1.drive = XYZ.new(0, 0, 0); 650 var e = ExpProperties.feedtrans * cr1.energy * ExpProperties.secPerStep; //TODO efficiency dependent on age 650 651 //Simulator.print("transferring "+e +"("+e*ExpProperties.ingestion+")"+" to "+cr1.name +" ("+ cr1.energy+") " +" from "+cr2.uid+" ("+cr2.energy+") "+ e/ExpProperties.secPerStep+ " per sec"); 651 652 var transferred = cr2.transferEnergyTo(cr1, e); 652 cr1.energy -= transferred *(1-ExpProperties.ingestion);653 cr1.energy -= transferred * (1 - ExpProperties.ingestion); 653 654 if (cr1.data->lifeparams->hibernated == 1) 654 655 { … … 662 663 { 663 664 setForamMeta(cr); //unhibernate 664 } 665 } 665 666 else 666 667 { 667 cr.idleen = (ExpProperties.energy_hib * cr.energy) *ExpProperties.secPerStep; //hibernate668 cr.idleen = (ExpProperties.energy_hib * cr.energy) * ExpProperties.secPerStep; //hibernate 668 669 } 669 670 cr.data->lifeparams->hibernated = 1 - cr.data->lifeparams->hibernated; … … 675 676 if (cr.data->lifeparams->division_time > 0) 676 677 { 677 cr.data->lifeparams->division_time = Math.max(cr.data->lifeparams->division_time -1,0);678 cr.data->lifeparams->division_time = Math.max(cr.data->lifeparams->division_time - 1, 0); 678 679 } 679 680 //checking for end of gametogenesis … … 685 686 else if (cr.data->lifeparams->chamber_growth > 0) 686 687 { 687 var chamber_time = Math.max(cr.data->lifeparams->chamber_growth -1,0);688 var chamber_time = Math.max(cr.data->lifeparams->chamber_growth - 1, 0); 688 689 cr.data->lifeparams->chamber_growth = chamber_time; 689 690 cr.energy -= ExpProperties.chamberCostPerSec * cr.energy * ExpProperties.secPerStep; … … 695 696 } 696 697 //checking for end of the chamber growth process 697 else if (cr.data->lifeparams->chamber_growth == 0 && visualization(cr) ==0)698 { 699 foramGrow(cr, lastChamberNum(cr), 1); 698 else if (cr.data->lifeparams->chamber_growth == 0 && visualization(cr) == 0) 699 { 700 foramGrow(cr, lastChamberNum(cr), 1); 700 701 cr.data->lifeparams->chamber_growth = -1; 701 702 //Simulator.print("chamber "+ (lastChamberNum(cr) + 1) +" complete"); … … 713 714 if (ExpProperties.logging == 1) 714 715 { 715 log(createLogVector(cr, cr.data->lifeparams->max_energy_level), ExpProperties.logPref+"fossil_log.txt");716 log(createLogVector(cr, cr.lifespan), ExpProperties.logPref+"lifespan_log.txt");717 } 716 log(createLogVector(cr, cr.data->lifeparams->max_energy_level), ExpProperties.logPref + "fossil_log.txt"); 717 log(createLogVector(cr, cr.lifespan), ExpProperties.logPref + "lifespan_log.txt"); 718 } 718 719 Populations[0].kill(cr); 719 720 return; … … 736 737 if (lastChamberNum(cr) < max_chamber_volume[cr.data->lifeparams->gen].size) 737 738 { 738 if ((cr.data->lifeparams->max_energy_level >= energyFromVolume(max_chamber_volume[cr.data->lifeparams->gen][lastChamberNum(cr) -1],0)))739 if ((cr.data->lifeparams->max_energy_level >= energyFromVolume(max_chamber_volume[cr.data->lifeparams->gen][lastChamberNum(cr) - 1], 0))) 739 740 { 740 741 cr.data->lifeparams->chamber_growth = int(secToSimSteps(ExpProperties.chamberGrowthSec)); 741 } 742 } 743 } 742 } 743 } 744 } 744 745 } 745 746 746 747 function deathConditions(cr) 747 748 { 748 if ((cr.energy <= getProperty(cr.data->lifeparams->gen, "e_death_level")*cr.data->lifeparams->max_energy_level) || (Math.rnd01 < ExpProperties.hunted_prob))749 if ((cr.energy <= getProperty(cr.data->lifeparams->gen, "e_death_level")*cr.data->lifeparams->max_energy_level) || (Math.rnd01 < ExpProperties.hunted_prob)) 749 750 { 750 751 return 1; … … 774 775 function createNutrientGenotype(nutrientradius) 775 776 { 776 return "//0\nm:Vstyle=nutrient\np:sh=3,sx=" +nutrientradius+",sy="+nutrientradius+",sz="+nutrientradius+",ry=1.57,vr=0.0,1.0,0.0";777 return "//0\nm:Vstyle=nutrient\np:sh=3,sx=" + nutrientradius + ",sy=" + nutrientradius + ",sz=" + nutrientradius + ",ry=1.57,vr=0.0,1.0,0.0"; 777 778 } 778 779 … … 797 798 if (ExpProperties.visualize == 1) 798 799 { 799 var nutsize = ExpProperties.nutrientradius *10;800 var nut = Populations[2].add("//0\nm:Vstyle=nutrient_visual\np:sh=2,sx=" +nutsize+",sy="+nutsize+",sz="+nutsize+",ry=1.5,vr=0.0,1.0,0.0");800 var nutsize = ExpProperties.nutrientradius * 10; 801 var nut = Populations[2].add("//0\nm:Vstyle=nutrient_visual\np:sh=2,sx=" + nutsize + ",sy=" + nutsize + ",sz=" + nutsize + ",ry=1.5,vr=0.0,1.0,0.0"); 801 802 cr.data->reticulopodiacreature = nut; 802 nut.locationSetBboxLow( cr.bboxLow.x +cr.bboxSize.x/2-nut.bboxSize.x/2, cr.bboxLow.y+cr.bboxSize.y/2-nut.bboxSize.y/2, -nutsize);803 nut.locationSetBboxLow( cr.bboxLow.x + cr.bboxSize.x / 2 - nut.bboxSize.x / 2, cr.bboxLow.y + cr.bboxSize.y / 2 - nut.bboxSize.y / 2, -nutsize); 803 804 } 804 805 } … … 815 816 { 816 817 counter += increase; 817 var unitcount = int(counter /unitsize);818 counter -= unitcount *unitsize;818 var unitcount = int(counter / unitsize); 819 counter -= unitcount * unitsize; 819 820 return {"counter" : counter, "number" : unitcount}; 820 821 } … … 824 825 if (ExpProperties.foodfluxChange > 0) 825 826 { 826 827 if (phase=="low" && changePeriod >= secToSimSteps(23328000)) //9 months828 829 ExpProperties.foodflux = ExpProperties.foodflux/ExpProperties.foodfluxChange;830 831 832 833 834 835 836 ExpProperties.foodflux = ExpProperties.foodflux*ExpProperties.foodfluxChange;837 838 839 840 } 841 842 var nutrientNum = getNumberCounter(nutrient_num_counter, ExpProperties.foodflux *wrldsizSquareMeters*ExpProperties.secPerStep,ExpProperties.energy_nut*0.000000000001);827 changePeriod += 1; 828 if (phase == "low" && changePeriod >= secToSimSteps(23328000)) //9 months 829 { 830 ExpProperties.foodflux = ExpProperties.foodflux / ExpProperties.foodfluxChange; 831 phase = "high"; 832 changePeriod = 0; 833 } 834 835 else if (phase == "high" && changePeriod >= secToSimSteps(7776000)) //3 months 836 { 837 ExpProperties.foodflux = ExpProperties.foodflux * ExpProperties.foodfluxChange; 838 phase = "low"; 839 changePeriod = 0; 840 } 841 } 842 843 var nutrientNum = getNumberCounter(nutrient_num_counter, ExpProperties.foodflux * wrldsizSquareMeters * ExpProperties.secPerStep, ExpProperties.energy_nut * 0.000000000001); 843 844 844 845 nutrient_num_counter = nutrientNum["counter"]; 845 846 846 847 for (var i = 0; i < nutrientNum["number"]; i++) 847 { 848 { 848 849 addNutrient(); 849 850 } … … 851 852 if (ExpProperties.logging == 1 && nutrientNum["number"] > 0) 852 853 { 853 log([nutrientNum["number"]], ExpProperties.logPref+"nutrients_log.txt");854 log([nutrientNum["number"]], ExpProperties.logPref + "nutrients_log.txt"); 854 855 } 855 856 … … 878 879 reproduce_parents(s); 879 880 } 880 881 881 882 } 882 883 … … 903 904 904 905 function createStatistics() 905 { 906 { 906 907 var number = []; 907 908 var e_inc = []; … … 910 911 for (var s = 0; s < species_genes.size; s++) 911 912 { 912 number.add([0, 0]);// [haplo][diplo]913 e_inc.add([0, 0]);913 number.add([0, 0]); // [haplo][diplo] 914 e_inc.add([0, 0]); 914 915 } 915 916 … … 920 921 var species = cr.data->lifeparams->species; 921 922 922 number[species][gen] = number[species][gen] + 1; 923 number[species][gen] = number[species][gen] + 1; 923 924 e_inc[species][gen] = e_inc[species][gen] + cr.energy; 924 925 } … … 941 942 } 942 943 } 943 944 944 945 log_numbers.add(Populations[1].size); 945 946 log_energies.add(e_nut); 946 947 947 log(log_numbers, ExpProperties.logPref +"forams_log.txt");948 log(log_energies, ExpProperties.logPref+"energies_log.txt");948 log(log_numbers, ExpProperties.logPref + "forams_log.txt"); 949 log(log_energies, ExpProperties.logPref + "energies_log.txt"); 949 950 } 950 951 951 952 function log(tolog, fname) 952 953 { 953 var f = File.appendDirect(fname, "forams data"); 954 var f = File.appendDirect(fname, "forams data"); 954 955 f.writeString("" + Simulator.stepNumber); 955 956 for (var i = 0; i < tolog.size; i++) … … 972 973 if (cr.data->lifeparams->species == i) 973 974 { 974 vec[i *2+cr.data->lifeparams->gen] = value;975 vec[i * 2 + cr.data->lifeparams->gen] = value; 975 976 } 976 977 }
Note: See TracChangeset
for help on using the changeset viewer.