PieterTack / polycap

Polycapillary X-ray raytracing
GNU General Public License v3.0
3 stars 3 forks source link

Add polycap_photon_get weights #22

Closed tschoonj closed 6 years ago

tschoonj commented 6 years ago

This function would allow us to retrieve the weights for the energies after simulating. Necessary for XMI-MSIM.

PieterTack commented 6 years ago

Moet dit dan een functie zijn die de weight extract voor 1 bepaalde energie, of die voor alle gesimuleerde energien gewoon de weights geeft? M.a.w. returned het een array(pointer) of returned het een double?

tschoonj commented 6 years ago

Ik denk dat we best de zaken een beetje herschikken. Momenteel worden de gevraagde energies meegegeven aan polycap_photon_new:

polycap_photon* polycap_photon_new(polycap_description *description, polycap_rng *rng, polycap_vector3 start_coords, polycap_vector3 start_direction, polycap_vector3 start_electric_vector, size_t n_energies, double *energies, polycap_error **error)

Dit is eigenlijk niet nodig aangezien ze niet echt gebruikt worden voor iets te initializeren, er wordt enkel een kopie van gemaakt.

Misschien is het beter die mee te geven aan polycap_photon_launch, en dan onmiddellijk de weights daar uit te halen. Bijvoorbeeld:

int polycap_photon_launch(polycap_photon *photon, size_t n_energies, double *energies, double **weights, polycap_error **error)

Op deze manier is er zelfs geen behoefte aan polycap_photon_get_weights.

Wat gebeurt er trouwens als de user twee keer polycap_photon_launch op hetzelfde polycap_photon oproept? Als dat niet mag gebeuren, moet er in dit geval een gepaste error gegenereerd worden.

PieterTack commented 6 years ago

Wat gebeurt er trouwens als de user twee keer polycap_photon_launch op hetzelfde polycap_photon oproept? Als dat niet mag gebeuren, moet er in dit geval een gepaste error gegenereerd worden.

Wat bedoel je hier precies mee? In principe kan het geen kwaad om polycap_photon_launch twee maal te launchen op exact zelfde polycap_photon. Daar de beginresultaten gelijk zijn, zullen ook eindresultaten overeen komen. Of bedoelde je in termen van memory allocation?

tschoonj commented 6 years ago

Het hangt vooral af van de polycap_photon member variables: moeten er hiervan terug geinitializeerd worden in het geval polycap_photon_launch een tweede keer wordt uitgevoerd?

Ik zie dat er in polycap_photon_new toch een paar zaken worden geinitializeerd: blijven deze constant tijdens polycap_photon_launch?

PieterTack commented 6 years ago

Hm. Dus in polycap_photon_launch zelf worden de photon->energies en photon->weights arrays geinitialiseerd (i.e. memory aan toewijzen mbv malloc). Binnenin polycap_photon_launch wordt ook polycap_photon_scatf opgeroepen, die op zijn beurt photon->scatf en photon->amu initialiseren.

Probleem is dus dat ik niet goed weet hoeveel kwaad dat eigenlijk kan: indien memory reeds werd gealloceerd aan een pointer, in hoeverre 'verlies' je die memory wanneer je het nog iets doet? Zeer simpel gezegd: hoeveel memory verlies ik wanneer mijn programma zou zeggen:

double *weights;
weights=malloc(sizeof(double));
weights=malloc(sizeof(double));

Bijkomstig probleem is dat als bovenstaande niet mag, dat eigenlijk polycap_photon_scatf en de andere allocs dienen te gebeuren tijdens polycap_photon_new, waardoor we in polycap_photon_new ook n_energies nodig hebben, waardoor we dus evengoed alle aanpassingen van de getweight branch hadden kunnen negeren... Of zie ik het dan fout?

tschoonj commented 6 years ago

yep dan heb je inderdaad een memory leak ter grootte van sizeof(double).

Moeten die photon->energies en photon->weights echt blijven bestaan tot op het einde van polycap_photon_launch? Volgens mij kan je die free'en zodra photon->weights is gememcpy'ed naar *weights

Ik vermoed dat dit ook geldt voor photon->scatf en photon->amu.

Zie wel dat na free'en je de pointer op NULL zet zodat polycap_photon_free kan checken of dat geheugen nog moet gefree'ed worden.

PieterTack commented 6 years ago

oke, brainfart. Blijkbaar zit deze polycap_photon_free reeds in de code verwerkt op de gepaste momenten :)

tschoonj commented 6 years ago

Hmm nee toch? Als je momenteel twee keer polycap_photon_launch op hetzelfde foton uitvoert krijg je toch memory leaks voor photon->weights etc?

PieterTack commented 6 years ago

ja, oke, double brainfart... Kzit weer in mijn code te kijken, waar het momenteel geen probleem geeft omdat polycap_photon_launch nooit twee keer uitgevoerd wordt voor zelfde photon.

Op zich moet photon->weights en photon->energies mss niet meer bestaan op einde van launch, maar wel de exit_coords (en andere coordinaten for that matter). Dus kan niet gewoon polycap_photon_free(photon); casten. Zal beetje specifieker te werk moeten gaan :) Maar oke, kga mijn hoofd nog eens bij elkaar sprokkelen en die change nog doorvoeren :)

tschoonj commented 6 years ago

Ja zeker niet polycap_photon_free doen!

gewone free's op die arrays die weg mogen is meer dan voldoende. Wel erna op NULL zetten.