Frequency domain calculation: frequency.m
This example demonstrates how to simulate sinusoidal irradiance-modulated light and resembles that given in the book by [Wang], p. 259. Two light sources, 180 degree out of phase, are set up at the x-axis at equal distance from the origin. Due to the symmetry of the problem, the photon packets have an opposite phase at the y axis and the photon density has a minimum.
[Wang] Biomedical Optics Principles and Imaging, Wiley, 2007
Contents
Setup the simulation domain
clear all; xsize = 60; % width of the region [mm] ysize = 30; % height of the region [mm] dh = 1; % discretisation size [mm] vmcmesh = createRectangularMesh(xsize, ysize, dh); % Search positions for the light sources in the walls lightsource1 = findBoundaries(vmcmesh, 'location', [-10 -15]); lightsource2 = findBoundaries(vmcmesh, 'location', [10 -15]); % Obtain the indices of the opposite wall for plotting the results opposite_wall = findBoundaries(vmcmesh, 'direction', [0 0], [0 60], 59); wall = findBoundaries(vmcmesh, 'direction', [0 0], [0 -60], 59); vmcboundary = createBoundary(vmcmesh); vmcmedium.absorption_coefficient = 0.01; % absorption coefficient [1/mm] vmcmedium.scattering_coefficient = 1.0; % scattering coefficient [1/mm] vmcmedium.scattering_anisotropy = 0.0; % anisotropy parameter g of % the Heneye-Greenstein scattering % phase function [unitless] vmcmedium.refractive_index = 1.37; % refractive index [unitless] % Increase the default photon count to get reasonable statistics % at the detector options.photon_count = 3e7;
Run the simulations
Two simulations are used to simulate two modified lightsources. The solutions are added together to form the complete solution.
options.frequency = 200e6; options.phase0=-pi/2; vmcboundary.lightsource(lightsource1) = {'cosinic'}; vmcboundary.lightsource(lightsource2) = {'none'}; % shut down the second lightsource solution1 = ValoMC(vmcmesh, vmcmedium, vmcboundary, options); options.phase0=pi/2; % put the second light 180 degree out of phase vmcboundary.lightsource(lightsource1) = {'none'}; % shut down the first lightsource vmcboundary.lightsource(lightsource2) = {'cosinic'}; solution2 = ValoMC(vmcmesh, vmcmedium, vmcboundary, options);
ValoMC-2D -------------------------------------------- Version: v1.0b-118-g853f111 Revision: 131 OpenMP enabled Using 16 threads -------------------------------------------- Transformed negative phase0 to positive 4.712389 Initializing MC2D... Computing... ...done Done ValoMC-2D -------------------------------------------- Version: v1.0b-118-g853f111 Revision: 131 OpenMP enabled Using 16 threads -------------------------------------------- Initializing MC2D... Computing... ...done Done
Plot the results
The results resemble that given in the book of Wang, but are not identical to it. This is due to differences in the model and boundary conditions.
avgr = (vmcmesh.r(vmcmesh.BH(opposite_wall, 1),:) + vmcmesh.r(vmcmesh.BH(opposite_wall, 2),:))/2; figure('rend','painters','pos',[10 10 1000 400]) hold on h(1) = plot3(avgr(:,1), avgr(:,2), abs(solution1.boundary_fluence(opposite_wall)+solution2.boundary_fluence(opposite_wall)), 'b','LineWidth',1.5); zlabel('Amplitude'); patch('Faces', vmcmesh.H, 'Vertices',vmcmesh.r, 'FaceVertexCData', angle(solution1.element_fluence + solution2.element_fluence)/(2*pi)*360, 'FaceColor', 'flat', 'EdgeColor','none'); xlabel('[mm]'); ylabel('[mm]'); c = colorbar; c.Label.String = 'Phase [deg]'; view(-34, 52) plot3([-10 10], [-15 -15], [0 0], '*'); plot3(0, 15, 0, 'o'); text(-10, -15, 1e-5, '+Source'); text(10, -15, 1e-5, '-Source'); text(0, 0, 1e-5, 'Null line'); text(3, 15, 1e-5, 'Scanning detector'); hold off figure plot(avgr(:,1), angle(solution1.boundary_fluence(opposite_wall)+solution2.boundary_fluence(opposite_wall))/(2*pi)*360); xlabel('Detector position [mm]'); ylabel('Angle [deg]');